2010-01-09 89 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