2014-01-13 34 views
0

我想從委託onclick事件處理程序中檢索元素數據,並使其工作,但突然遇到一些問題。如何將數據從元素傳輸到委託事件?

最後我隔離了這個問題:當元素從DOM中刪除時,似乎附加到元素 的數據被刪除。在委託onclick事件處理程序被調用之前,這可能發生在 。

因爲有時我會有一個單擊事件處理程序,它可以在委託處理程序可以運行之前刪除該元素。

審議本文件:

<div id='content'> 
    <a href="#pp" class='remove'>Will be removed (data is lost)</a> 
    <a href="#pp">Will stay (works)</a> 
</div> 

與此javascript:http://jsfiddle.net/s47c5/4/

我可以張貼-推遲實施拆除的元素,包裝:

$(document).ready(function() { 
    $('a').data("keep", { 
     content: 'want to see at delegate click envent' 
    }); 
    $('a').click(function() { 
     var data = $(this).data("keep"), 
      data_to_show = data ? JSON.stringify(data) : 'Real Gone!!'; 
     alert("click: " + data_to_show); 
     if ($(this).hasClass('remove')) { 
      $(this).remove(); 
     } 
    }); 
    $('#content').delegate('a', 'click', function (event) { 
     var data = $(this).data("keep"), 
      data_to_show = data ? JSON.stringify(data) : 'Real Gone!!'; 
     alert("delegate: " + data_to_show); 
    }); 
}); 

你可以用它玩它進入超時...

if ($(this).hasClass('remove')) { 
     setTimeout (function() { 
      $(this).remove() 
     }, 10); 
    } 

它的工作原理,但不知何故,這讓我感動!

所以,問題是:

我怎麼能正確地從該項目轉移數據被刪除,從而達到委派的事件處理程序?

回答

0

你應該試試這個代碼:

$(document).ready(function() { 
    $('a').data("keep", { 
     content: 'want to see at delegate click envent' 
    }); 
    $('a').click(function() { 
     var data = $(this).data("keep"), 
      data_to_show = data ? JSON.stringify(data) : 'Real Gone!!'; 
     alert("click: " + data_to_show); 

    }); 
    $('#content').delegate('a', 'click', function (event) { 
     var data = $(this).data("keep"), 
     data_to_show = data ? JSON.stringify(data) : 'Real Gone!!'; 
     alert("delegate: Before removing >" + data_to_show); 
     if ($(this).hasClass('remove')) { 
      $(this).remove();    
     } 
     //After removing 
     data = $(this).data("keep"); 
     data_to_show = data ? JSON.stringify(data) : 'Real Gone!!'; 
     alert("delegate: After removing >" + data_to_show); 
    }); 
}); 

見我已在JS提琴變化:

JSFiddle

+0

@ user2043273看到我已經添加了答案,它正在對givem的jsfiddle。 –

+0

yeap,你的解決方案基本上延遲刪除項目與setTimeout()一樣,並且它比我的解決方法更令人毛骨悚然,但是我不想找到一種方法來保持項目'活着',但要轉移數據通過其他方式。也許將數據附加到事件? )。實際上,我不在這樣的控制下,因爲$(this).remove()實際上嵌套在一些複雜的代碼層下;它甚至可能刪除$('#content'),而不僅僅是元素。 – user2043273

相關問題