我在页面做一个复制的功能, 也就是在js中获取上一个标签的内容放到下一个标签、  第一次始终复制不了上一次的内容。(所传参数这些都是对的)、 下一次就可以正常复制、
   最奇怪的地方时: 我在js中alert();下随便什么东西,在页面上点击确定就能正确把上一个标签的内容复制到下一个标签、
   不用alert();打死就复制不了东西.  求解答啊、 按常理来说js代码应该是对的.

解决方案 »

  1.   

    <script type="text/javascript">
    window.onload = function(){

    var addMo       = document.getElementById('addMo');
    var totalTag    = document.getElementById('totalTag');
    var tagUl  = document.getElementById('tagUl');
    var paramType   = document.getElementById('paramType');
    var xmlhttp     = null;
    var HTMLContent = null;
    var typeValue   = paramType.value;
    function addPo(){

    var left  = $('#tagUl li:last-child').offset().left + 102;
    var top = $('#tagUl li:last-child').offset().top + 5;

    $('#addMo').css({'left':left,'top':top});
    };

    function loadJSP(){
    if(HTMLContent == null){

    if(document.all){ // browser condition

    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else{
    xmlhttp = new XMLHttpRequest();
    }

    typeValue = paramType.value;
    $('#change_btn input').css("display","none");
    $('#paramType'+typeValue).siblings().css("display","block");
    var url = '${basePath}/pages/param/param_type'+typeValue+'.jsp';
    // ajax load
    xmlhttp.open("POST",url,true);
    xmlhttp.onreadystatechange = function(){

    if(xmlhttp.readyState == 4){
    HTMLContent = xmlhttp.responseText;
    addToHtml();
    }
    };

    xmlhttp.send(null);
    return;

    }

    addToHtml(); //if HTMLContent is not null
    };
    //如果有标签则不加载新标签
    if ($('#tagUl li').length==0&&$('.listDiv').length ==0) {
    loadJSP();
    }else{
    $('#changdu').val($('.listDiv').length);
    addPo();

    }
    function addToHtml(){

    if(tagUl.children.length < 10){

    var li     = document.createElement('li');
    tagUl.appendChild(li);
    addPo();
    var prev = li.previousSibling;

    if(!document.all){ while(true){ if(prev.nodeType == 1){

    break;
    }
    else{

    if(prev.previousSibling){

    prev = prev.previousSibling;
    }
    else{
    break;
    }
    }
    };
    }
      //search there is any li in document

    if(prev){  //set the alt number of li
     
    li.setAttribute('name',Number(prev.getAttribute('name')) + 1);
    }
    else{
    li.setAttribute('name',0);
    }

    var listDiv       = document.createElement("div"); // create web table 
    listDiv.className = "listDiv";
    listDiv.style.display = "block";
    var li_name = li.getAttribute('name');
    var content = HTMLContent.replace(/\{\*\}/g,li_name); 
    li.innerHTML   = '<img src="${basePath}/images/copy.png" class="copyTag"  title="复制" />'+'&nbsp;&nbsp;&nbsp;&nbsp;标签'+(Number(li_name)+1)+'<img src="${basePath}/images/XXX.gif" class="closeTag" title="关闭" />';
    listDiv.innerHTML = content;
    var va = (Number(li_name)+1);
    $('#copyNumber').val(va);

    for(var i=0; i<totalTag.children.length; i++){   // hide all listDiv

    totalTag.children[i].style.display = "none";
    tagUl.children[i].style.background = "url(${basePath}/images/gray_tab.png) no-repeat";
    }


    totalTag.appendChild(listDiv);
    listDiv.setAttribute('name',li_name);  //match the alt number of li which is creating;

    /*注释掉绑定事件函数*/

    }
    else{

    alert("最多10个标签");
    return false;
    }
    };
     
    addMo.onclick = function(){

    loadJSP();

    };
    paramType.onchange=function(){
    if (confirm("变更类型将重置标签,确认执行吗?")) {
    for ( var i =tagUl.children.length-1; i >=0 ; i--) {
    tagUl.removeChild(tagUl.children[i]);
    }
    for ( var j = totalTag.children.length-1; j >=0 ; j--) {
    totalTag.removeChild(totalTag.children[j]);
    }
    HTMLContent =  null;
    loadJSP();
    otherType();
    }
    else{
    paramType.children[typeValue-1].selected='selected';
    return false;
    }

    };

    //绑定标签复制事件
    $('.copyTag').live("click",function(event){
    if (confirm("确认复制该标签的值到新标签吗?")) {
    if ($('#tagUl li').length > 10) {
    alert("标签不能大于10个");
    return false;
    }else{

    //点击得到标签序号
    var tag  = $(this).parent().attr('name');
     
    // 取得标签的个数
    var number = $('.listDiv').length;
     
    // 获取申请类型
    var type = $('#paramType').val();

    // 获取标签显示的数字
    var copyNumber = $('#copyNumber').val();
     
    loadJSP();
      
    // 判断是否是编辑进来。
       if($('#edCopy').val() == 1){ 
       $('#edCopy').val(0);
      
       // 调复制的JS
       copyType1(tag,type,number);  
    }else{   // 调复制的JS
       copyType1(tag,type,copyNumber);
       }

    }
    }
     event.stopPropagation();
    });

    };
    </script>
    上面是页面 增加标签的js方法。 以前一个做页面的同事写的copyType1(tag,type,number); 这是 复制的内容的方法:如下: 只贴了一部分function copyType1(tag, type, number) {
    // 需要传入
    var number1 = number;  
    // 被传入的值 
    var number2 = tag;

    // 参数与MO变更   
    if (type == 1) {  
    // MO中文
    $('#moCh_' + number1).val($('#moCh_' + number2).val());

    // MO英文
    $('#mo_' + number1).val($('#mo_' + number2).val()); // MO变更动作
    var moaction = $('.moAction_' + number2 + ':checked').val();
    if (moaction == 1) {
    $('#moAction_' + number1 + '_1').attr('checked', 'checked');
    } else if (moaction == 2) {
    $('#moAction_' + number1 + '_2').attr('checked', 'checked');
    } else if (moaction == 3) {
    $('#moAction_' + number1 + '_3').attr('checked', 'checked');
    }
      

  2.   

    代码太长,粗略看了一下。
    一般来说第一次不行,第二次可以或者需要中断alert才可以,一般情况是你的javascript还没有载入完。
    一般用一个setTimeout(aaa,500)延迟一点执行,或者使用回调方式确保执行顺序就可以了。
      

  3.   


    是延迟copyType1() 这个方法么? 还是怎么延迟呢?
      

  4.   

    目测是点击的时候发送了ajax请求,ajax请求回来后,生成一定的DOM结构,第一次点的时候请求还没回来,所以造成后续操作无效。把loadJSP方法添加一个回调函数,请求成功后执行这个回调。
    //绑定标签复制事件$('.copyTag').live("click",function(event){
    if (confirm("确认复制该标签的值到新标签吗?")) {
    if ($('#tagUl li').length > 10) {
    alert("标签不能大于10个");
    return false;
    }else{//点击得到标签序号
    var tag  = $(this).parent().attr('name');
     
    // 取得标签的个数
    var number = $('.listDiv').length;
     
    // 获取申请类型
    var type = $('#paramType').val();// 获取标签显示的数字
    var copyNumber = $('#copyNumber').val();
     
    loadJSP(function(){
       // 判断是否是编辑进来。
       if($('#edCopy').val() == 1){ 
           $('#edCopy').val(0);
      
           // 调复制的JS
           copyType1(tag,type,number);  
       }else{       // 调复制的JS
           copyType1(tag,type,copyNumber);
       }
    }
    });
    }
     event.stopPropagation();
    });
    };function loadJSP(callback){
    if(HTMLContent == null){if(document.all){ // browser conditionxmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else{
    xmlhttp = new XMLHttpRequest();
    }typeValue = paramType.value;
    $('#change_btn input').css("display","none");
    $('#paramType'+typeValue).siblings().css("display","block");
    var url = '${basePath}/pages/param/param_type'+typeValue+'.jsp';
    // ajax load
    xmlhttp.open("POST",url,true);
    xmlhttp.onreadystatechange = function(){if(xmlhttp.readyState == 4){
    HTMLContent = xmlhttp.responseText;
    addToHtml();
    callback && typeof callback === 'function' && callback();//成功后执行回调。
    }
    };xmlhttp.send(null);
    return;}addToHtml(); //if HTMLContent is not null,这句就不用了吧。
    };