2009-04-22 70 views
13

我有一個IE錯誤,我不知道如何解決。IE7&8不會觸發jQuery單擊事件添加到表格中的元素

使用jQuery我正在動態地移動一個菜單,使其出現在鼠標懸停的元素上。

我的代碼(簡化)看起來是這樣的:

$j = jQuery.noConflict(); 

$j(document).ready(function() 
{ 
    //do something on the menu clicks 
    $j('div.ico').click(function() { alert($j(this).parent().html()); }); 

    setUpActions('#tableId', '#menuId'); 
}); 

//on mouseover set up the actions menu to appear on mouseover 
function setUpActions(tableSelector, menuSelector) 
{ 
    $j(tableSelector + ' div.test').mouseover(function() 
    { 
     //note that append will move the underlying 
     //DOM element with all events from it's old 
     //parent to the end of this one. 
     $j(this).append($j(menuSelector).show()); 
    }); 
} 

此菜單似乎並沒有它在IE7,IE8和IE8-AS-IE7移動後正確註冊事件菜單(耶MS,這真的是IE8中的一個'新渲染引擎',我們都相信你)。

它在所有其他方面的預期工作。你可以看到a basic demo here的行爲。

在演示中可以看到問題的兩個例子:

  1. 按鈕應該改變懸停背後的圖像(用CSS實現:懸停選擇器)。它在第一次鼠標懸停時起作用,但之後仍然存在。
  2. 點擊事件不會觸發 - 但是使用開發工具,您可以手動調用它並且它仍然是訂閱的。

你可以看到(2)在IE8的開發工具:

  1. 打開page在IE8
  2. 開放開發工具
  3. 選擇 「腳本」 選項卡, 「控制檯」 子選項卡
  4. 類型:$j('#testFloat div.ico:first').click()手動調用任何訂閱事件
  5. 頁面上會有提醒

這意味着我是而不是失去了事件訂閱,他們仍然存在,IE只是在我點擊時不會打電話給他們。

有沒有人知道爲什麼會出現這個錯誤(除了因爲IE的引人注目的引擎)?

是否有解決方法?

難道這就是我做錯了,只是碰巧按照預期在其他一切工作?

回答

10

奇怪的是,雖然點擊事件是不是在IE中射擊,如果你把它改爲鼠標按下或鼠標了它的工作原理是你所期望的,雖然你仍然有你的形象懸停的問題。

$j('div.ico').mouseup(function() { alert($j(this).parent().html()); }); 
0

我強烈建議使用Live事件,而不是最新的jQuery。

這種方式,您可以綁定到已經在開始時沒有創建成功,但點擊綁定將被添加,當新的元素加入其中CSS類元素:

http://docs.jquery.com/Events/live

+1

謝謝,好主意,但我已經試過了,它沒有區別。我還沒有失去點擊事件 - 在JavaScript命令行中的$ j('selector')。click()將觸發我期望的事件。 jQuery事件訂閱在移動中倖存下來,只是IE似乎沒有稱之爲。 CSS:懸停具有相同的症狀。 – Keith 2009-04-22 11:14:32

+0

你有我可以看的演示頁嗎? – Richard 2009-04-22 11:42:15

+0

是的 - 鏈接的問題。 – Keith 2009-04-22 12:32:25

1

IE不會複製事件動態附加到DOM的項目。

在添加了需要綁定或使用的內容後,嘗試綁定您的點擊事件。生活()

如果你正在使用的clone()記得要通過克隆(真),明確地請求事件處理程序的複製。

var actionMenu = $j(menuSelector); 

//actionMenu is now an Instance of jQuery, not the DOM object 
//because jQuery is chainable 

actionMenu.hide(); 

// notice the clone(true) 

$j(this).append(actionMenu.clone(true)); 

jQuery是可鏈接的,所以你也可以這樣寫在「jQuery的」語法爲:

var clone = $j(menuSelector) 
       .clone(true) 
       .css('background-color', $j(this).css('background-color')); 

$j(this).append(clone); 

我不認爲你需要的顯示/隱藏,因爲它發生得這麼快。

2

我有同樣的問題,但以前的解決方案都沒有工作。問題原來是IE7(我沒有測試其他版本的IE)不會註冊.click,如果它鏈接在一個動畫函數之後。因此,這將工作:

$("div.menubar-item").animate({ 
    color:"#000" 
}, 0) 

.click(function() 
{ 
    //not firing 
}) 

但這WILL工作

$("div.menubar-item").click(function() 
{ 
    //firing! 
}) 

$("div.menubar-item").animate({ 
    color:"#000" 
}, 0) 

編輯:同樣是了mouseenter,鼠標離開屬實等

EDIT 2:如果您在點擊後鏈接了動畫功能,它仍會觸發事件並生成動畫, s也是「有效的」:

$("div.menubar-item").click(function() 
{ 
    //firing! 
}) 

.animate({ 
    color:"#000" 
}, 0) 
相關問題