2012-01-20 213 views
3

不確定爲什麼下面的代碼不工作。如果我將.on()更改爲.live()它可以正常工作,但現場活動仍在繼續,並且由於這種情況會在頁面上出現或停止,因此每次點擊時,活動都會繼續添加到事件行中。我想這個簡短而枯燥的是,爲什麼這不會發生?.on()event not firing

$("#" + old_n).on('mousedown', function(evt) { 
    console.log(old_n); 

    if($(el).data('clickphase')) { 
     return true; 
    } 

    $("#" + $.contextmenu).remove(); 
    $(el).data('served', true); 

    if(typeof array_of_a[a_index][1] == 'function') { 
     array_of_a[a_index][1](evt, el); 
    } 

    // console.log(array_of_a[a_index]);    
    // array_of_a[a_index][1](evt, el); 
    $(el).removeData('served'); 
}); 

old_n是被點擊上當前<li>的ID,其中也有一個hover事件,但不應該破壞MouseDown事件吧?

+0

檢查$(「#」+ old_n).length是否> –

回答

1

您的代碼不是從liveon的正確譯文。試試這個:

$(document).on("mousedown", "#" + old_n, function (evt) { 
    /*...*/ 
}); 
+0

>仍然使其冒泡到文檔根目錄,所以當我使用它時,再次使用它會啓動它兩次,事件 – Rob

+0

這是否意味着在同一頁面上有多個元素具有相同的'id'?如果是這樣,那是無效的HTML,你必須解決這個問題。 –

3
$("#" + old_n).on('mousedown', function(evt) { 

如果old_n存在時呈現頁面時纔會工作。這是一個直接結合事件,相同

$("#" + old_n).bind('mousedown', function(evt) { 

你想要一個委託事件:

$(document).on("mousedown", "#" + old_n, function(evt) { 

這將導致所有的mousedown事件在文檔中的任意位置是「聽」的jQuery,如果任何來自匹配選擇器ID old_n的元素,則事件處理程序將觸發。


當然,在文檔中的任何位置收聽每一個mousedown事件都有點浪費。如果您知道,這個元素將永遠只能存在於,比如說,用foo一個id一個div(並在頁面呈現存在富),那麼爲什麼不只聽事件上來,以foo

$("#foo").on("mousedown", "#" + old_n, function(evt) { 
+0

所以我把它改成... $(「#contextmenu li」)。on('mousedown',「#」+ old_n,function(evt)但仍然不會觸發。或者使用實時調用 – Rob

+0

當頁面呈現時,無論你放在$()中,都必須存在,所以如果在頁面呈現時#contextmenu不存在,工作 –

+0

它不是一個上下文菜單,它是在右鍵單擊一個對象的基礎上構建的,因此將事件綁定到頁面上時不在頁面上的元素的唯一方法是使用live或綁定到文檔? – Rob

1

on不代替live。請嘗試監視列表項目的ul級別。這是更有效率和on的好處。

$('ul').on('click', 'li', function() { 
    //get clicked list item's id 
    var id = $('this').prop('id'); 
}); 

因爲你是在ul一級監測則需要檢索列表項你想要的信息。

+0

+1「沒有下降的替代品」 –