2011-10-08 108 views
2

我想我做錯了什麼,但事件只適用於選擇器是document。否則,不會發生。爲什麼jQuery事件沒有被解僱?

HTML

<html>                 
    <head> 
     <!-- the libraries references here --> 
    </head>                 
    <body> 
     <div id="canvas"></div>  
    </body>                 
</html> 

的Javascript

/* Click on canvas */ 
canvasClickEvent = function(e){  
    if(e.shiftKey){ 
     selectedElement = $(this).attr("id"); 
    } 
} 

/* Events */ 
$(document).ready(documentLoadEvent); 
$(document).click(canvasClickEvent); //this works, but is wrong 
//$("#canvas").click(canvasClickEvent); --this is what I want, but not works 
$(document).dblclick(canvasDblClickEvent); 

如果我通過像$('#canvas').click(canvasClickEvent);股利名稱替換該文件,不叫click事件。只有在選擇器爲document時纔有效,但傳遞給該函數的元素始終具有像undefined這樣的重疊。

可能發生了什麼?

+1

嗯,在這裏工作得很好:http://jsfiddle.net/nrabinowitz/nzTDY/ – nrabinowitz

+0

是否有任何東西進入'#canvas'裏面或者它是空的? –

+0

@ muistooshort SVG將被繪製在其中,但如果沒有這個不行的話。使用文本和沒有文本,使用CSS和不使用CSS,不起作用。 –

回答

2

發生了什麼事情是事件試圖在DOM元素存在之前綁定事件。

如果您將事件封裝在ready()方法內部,那麼您可以保證在事件嘗試綁定之前該域存在。

$(document).ready(function() { 
    $("#canvas").click(canvasClickEvent); 
} 

就緒()方法是依賴於瀏覽器DOMContentLoaded事件,這基本上意味着DOM在瀏覽器中完全加載,但並不意味着所有媒體上的頁面完全加載。一旦所有媒體加載,onLoad瀏覽器事件就會觸發。

2

看起來像你把你的JavaScript代碼之前的HTML代碼。所以,當JavaScript代碼運行時,要處理的元素尚未加載到DOM中。 (這就是爲什麼你得到「undefined」)

只需在相關的HTML代碼之後放置腳本。或者將其放入pageLoad事件中:

$(function(){ 
    .... 
})