2010-01-09 111 views
0

我的代码:超出范围的变量?

<html> 

<head> 

<script type="text/JavaScript" src="jquery-1.3.2.min.js"></script> 
<script type="text/JavaScript" src="jquery.center.js"></script> 
<script type="text/JavaScript"> 
    $(document).ready(function(){ 
     $('a').click(function(){ 
      popup_AskYN("Want me to tell you what 1 + 1 is?",function(){ 
       //popup_Info("It's 2, silly!"); 
      },function(){ 
       //popup_Info("I didn't want to, anyway!"); 
      }); 
     }); 
    }); 

    function popup_AskYN(msg,yes_fn,no_fn){ 
     $('body').append("<div id='popup'><p>"+msg+"</p><a id='popup_yes' href='#'>Yes!</a><a href='#' id='popup_no'>No.</a></div>"); 
     var yes_button = $('#popup_yes:last'); 
     var no_button = $('#popup_no:last'); 
     var popup = $('#popup:last'); 
     popup.center(); 

     yes_button.click(yes_fn); 
     no_button.click(no_fn); 

     yes_button.click(function(){ 
      popup.fadeOut('fast').remove(); 
     }); 
     no_button.click(function(){ 
      popup.fadeOut('fast').remove(); 
     }); 
    } 

    function popup_Info(msg,callback){ 
     $('body').append("<div id='popup'><p>"+msg+"</p><a id='popup_ok' href='#'>Ok.</a></div>"); 
     var ok_button = $('#popup_ok:last'); 
     var popup = $('#popup:last'); 
     popup.center(); 

     ok_button.click(callback); 

     ok_button.click(function(){ 
      popup.fadeOut('fast',function(){ $(self).remove(); }); 
     }); 
    } 


</script> 

<style type="text/css"> 
#popup { 
    position:absolute; 
    border:1px solid black; 
} 
#popup a { 
    margin:10px; 
} 
</style> 

</head> 

<body> 
<a href="#">Launch the popup!</a> 
</body> 

现在这个工程well..except时,我有一个以上的弹出窗口。我缩小到的是什么时候 - 我创建了一个新的弹出窗口,它改变了yes_button,no_button,ok_button和popup的值。所以当前面的弹出窗口尝试使用这些变量时,它们都指向新的弹出窗口而不是当前的弹出窗口。因为所有弹出窗口都有相同的ID,所以我没有任何“唯一”来标识每个窗口。我想简单地存储选择器就足够了,但那不起作用。我能在这里做什么?

编辑,添加适当的ID,但仍然没有工作...:

<html> 

    <head> 
    <title>Call backs</title> 

    <script type="text/JavaScript" src="jquery-1.3.2.min.js"></script> 
    <script type="text/JavaScript" src="jquery.center.js"></script> 
    <script type="text/JavaScript"> 
     $(document).ready(function(){ 
      $('a').click(function(){ 
       popup_AskYN("Want me to tell you what 1 + 1 is?",function(){ 
        //popup_Info("It's 2, silly!"); 
       },function(){ 
        //popup_Info("I didn't want to, anyway!"); 
       }); 
      }); 
     }); 

     var popup_AskYNId = 0; 
     var popup_InfoId = 0; 
     function popup_AskYN(msg,yes_fn,no_fn){ 
      popup_AskYNId = popup_AskYNId + 1; 
      $('body').append("<div class='popup' id='"+popup_AskYNId+"popup_AskYN'><div class='popup_inner'><p>"+msg+"</p></div><div class='popup_options'><a class='popup_yes' id='"+popup_AskYNId+"popup_yes_AskYN' href='#'>Yes!</a><a href='#' class='popup_no' id='"+popup_AskYNId+"popup_no_AskYN' >No.</a></div></div>"); 
      popup = $('#'+popup_AskYNId+'popup_AskYN'); 
      yes_button = $('#'+popup_AskYNId+'popup_yes_AskYN'); 
      no_button = $('#'+popup_AskYNId+'popup_no_AskYN'); 

      popup.center(); 

      yes_button.click(yes_fn); 
      no_button.click(no_fn); 

      yes_button.click(function(){ 
       popup.fadeOut('fast').remove(); 
      }); 
      no_button.click(function(){ 
       popup.fadeOut('fast').remove(); 
      }); 
     } 

     function popup_Info(msg,callback){ 
      $('body').append("<div id='popup'><div id='popup_inner'><p>"+msg+"</p></div><div id='popup_options'><a id='popup_ok' href='#'>Ok.</a></div></div>"); 
      ok_button = $('#popup_ok:last'); 
      popup = $('#popup:last'); 
      popup.center(); 

      ok_button.click(callback); 

      ok_button.click(function(){ 
       popup.fadeOut('fast',function(){ $(self).remove(); }); 
      }); 
     } 


    </script> 

    <style type="text/css"> 

    .popup { 
     position:absolute; 
     border:1px solid black; 
     padding:3px; 
    } 
    .popup_inner { 
     border:1px solid black; 
     padding:10px; 
    } 
    .popup_options { 
     margin:0 auto; 
    } 
    .popup_options a { 

     border:1px solid black; 

     margin-top:3px; 
     margin-left:3px; 
     height:15px; 
     width:75px; 
     float:right; 

     text-align:center; 
     font-family:tahoma; 
     font-size:0.8em; 
     text-decoration:none; 
     line-height:14px; 
    } 

    </style> 

    </head> 

    <body> 
    <a href="#">Launch the popup!</a> 
    </body> 

</html> 

溶液发现,但是我修改了一点点,这样yes和no受理功能,如老版本..

$(function() { 
    $('a').click(function(e) { 
    e.preventDefault(); 

    var num1 = Math.floor(Math.random()*11), 
    num2 = Math.floor(Math.random()*11); 

    popup_AskYN(
     "Want me to tell you what 1 + 1 is?", 
     function(){ 
      $('body').append('its 2'); 
     },function(){ 
      $('body').append('Fine.'); 
     });; 
    }); 

    $('.popup_yes').live('click', function(e) { 
    e.preventDefault(); 

    $(this).closest('.popup').fadeOut('fast', function() { 
     $(this).remove(); 
    }); 
    }); 
    $('.popup_no').live('click', function(e) { 
    e.preventDefault(); 

    $(this).closest('.popup').fadeOut('fast', function() { 
     $(this).remove(); 
    }); 
    }); 

}); 

function popup_AskYN(msg, yes, no){ 
    $('body').append("<div class='popup'><div class='popup_inner'><p>"+msg+"</p></div><div class='popup_options'><a class='popup_yes' href='#'>Yes!</a><a href='#' class='popup_no'>No.</a></div></div>"); 
    var yes_button = $('.popup_yes:last'); 
    var no_button = $('.popup_no:last'); 
    var popup = $('.popup:last'); 

    yes_button.click(yes); 

    no_button.click(no); 
} 

回答

1

这对我来说很好,如果我只是将所有ID更改为类。尽管将弹出窗口绝对集中在屏幕上并不适用于弹出窗口的多个实例,但如果这就是您所追求的内容。我不得不将注释/定位代码注释掉,以确定它正在工作。

我还建议,当有人点击弹出窗口中的yes或no链接时,答案会替换原始弹出窗口的内容,而不是创建新弹出窗口。我发现你试图在答案出现之前让问题淡出,但是请注意,在当前的实现中,原始弹出式问题在动画完成之前被删除,因此删除问题并创建新的弹出窗口没有任何优势而不是仅仅替换内容。

如果您希望问题在答案出现之前淡出,一个选项是仅在动画完成后删除问题弹出窗口,您可以使用fadeOut的第二个参数来执行此操作,该参数是动画完成。不过,这又不适用于弹出式问题的多个实例。原因是因为答案弹出窗口与您的删除问题并将答案附加到正文的方法弹出的问题分离。这也可以通过简单地用问题替换问题来解决。如果您仍然希望同样的淡入淡出效果,您可以淡入淡出弹出,然后改变它的内容,然后渐回在

这里是一个版本的代码的作品,并改变它,我建议:

<html> 
<head> 
    <script type="text/JavaScript" src="http://code.jquery.com/jquery.js"></script> 
    <script type="text/JavaScript"> 
    $(function() { 
     $('a').click(function(e) { 
     e.preventDefault(); 

     var num1 = Math.floor(Math.random()*11), 
     num2 = Math.floor(Math.random()*11); 

     popup_AskYN(
      "Want me to tell you what " + num1 + " + " + num2 + " is?", 
      "It's " + (num1 + num2) + ", silly!", 
      "I didn't want to, anyway!" 
     ); 
     }); 

     $('.popup_ok').live('click', function(e) { 
     e.preventDefault(); 

     $(this).closest('.popup').fadeOut('fast', function() { 
      $(this).remove(); 
     }); 
     }); 
    }); 

    function popup_AskYN(msg, yes, no){ 
     $('body').append("<div class='popup'><p>"+msg+"</p><a class='popup_yes' href='#'>Yes!</a><a href='#' class='popup_no'>No.</a></div>"); 
     var yes_button = $('.popup_yes:last'); 
     var no_button = $('.popup_no:last'); 
     var popup = $('.popup:last'); 

     yes_button.click(function() { 
     popup.html('<p>' + yes + '<a class="popup_ok" href="#">Ok.</a>'); 
     }); 

     no_button.click(function() { 
     popup.html('<p>' + no + '<a class="popup_ok" href="#">Ok.</a>'); 
     }); 
    } 
    </script> 

    <style type="text/css"> 
    .popup { 
    border:1px solid black; 
    margin-bottom: 10px; 
    } 
    .popup a { 
    margin:10px; 
    } 
    </style> 
</head> 

<body> 
    <a href="#">Launch the popup!</a> 
</body> 
+0

ID如何不起作用?我究竟做错了什么? – Prodigga 2010-01-09 21:56:04

+0

我刚试过,同样的问题仍然存在。我在弹出窗口打印出弹出窗口的ID,停止居中并将其放置在相对位置:相对的,它们被放置在不同的行中。不管我按哪个按钮,最后一个弹出窗口,只有最后一个弹出窗口才会消失。 – Prodigga 2010-01-09 21:59:58

+0

我将代码添加到了我的原始答案中,以向您展示我的意思。使用ID不起作用,因为正如slebetman指出的那样,每个ID必须是唯一的。事实证明,这里没有必要使用ID,因此只需将它们更改为类即可。 – 2010-01-10 00:33:18

1

我看到你继续追加一个div到ID = popup和许多其他硬编码ID的文件。在HTML中,ID在整个文档中必须是唯一的,并且一个特定的ID(例如'popup')必须只出现一次。当两个元素共享相同的ID时,会发生什么情况是未定义的,并且浏览器可以返回浏览器开发者的任何想法。

因此,您的查询$('#popup:last')不会做你认为它的意思。

在这样正规的DOM方法的情况下工作比的jQuery主义好得多:

// shortcut. I hate typing document... 
function newElement (tag, spec) { 
    var el = document.createElement(tag); 
    for (var n in spec) { 
     el[n] = spec[n]; 
    } 
    return el; 
} 

function popup_AskYN(msg,yes_fn,no_fn){ 
    // because we get the references directly we don't need to 
    // assign ids and therefore avoid id collisions: 

    var popup = $(newElement('div')).append($(newElement('p')).append(msg)); 
    var yes_button = $(newElement('a',{href:'#'})).append('Yes!'); 
    var no_button = $(newElement('a',{href:'#'})).append('No.'); 

    popup.append(yes_button).append(no_button); 
    popup.center(); 

    yes_button.click(yes_fn); 
    no_button.click(no_fn); 

    yes_button.click(function(){ 
     popup.fadeOut('fast').remove(); 
    }); 
    no_button.click(function(){ 
     popup.fadeOut('fast').remove(); 
    }); 

    $('body').append(popup); 
} 
+0

编辑:显示你不需要IDS。 – slebetman 2010-01-09 13:15:23

+0

无法让你的例子工作..对不起。新的这个.. – Prodigga 2010-01-09 13:38:28

+0

啊......抱歉,忘了添加'$('body')。append(popup)'。 – slebetman 2010-01-09 15:47:06

0

您可以使用现有的弹出窗口的数量的唯一标识符。

var popupId = $("#popup").size(); 

然后使用id创建新的弹出窗口并将其引用为按钮。

$('body').append("<div id='" + popupId + "'><p>"+msg+"</p><a id='popup_ok' href='#'>Ok.</a></div>"); 
+0

但我弹出了被创建和删除。所以它们的数量发生了变化。 – Prodigga 2010-01-09 13:07:47

+0

存储并增加一个值,然后... var id = $(“body”)。data(popupID); $(“body”)。data(popupID,id ++); – 2010-01-09 13:16:41

+0

我已经添加了我现在得到的第一篇文章。当有多个弹出窗口时,按钮仍然充满。它看起来在做的是每当我点击一个按钮时使用popup_AskYNId的当前值作为选择器。我知道这是因为当我有2个弹出窗口时,弹出式窗口2可以正常工作,但不是1.当我有5个时,5个工作正常,但没有其他工作。 – Prodigga 2010-01-09 13:44:00