2010-04-20 97 views
0

我正在嘗試創建一個通知區域來顯示警報。讓div內的所有鏈接調用相同的函數?

return this.each(function() { 
    jQuery('<div class="' + o['className'] + '">' + o.msg + ' + 
     '<a href="#" onclick="$(this).parent().remove(); dismiss(' + o["id"] + ');">X</a>' + '</div>') 
    .appendTo(this); 
}); 

這只是從數據庫中取出一條消息,並顯示給用戶。如果用戶點擊X,那麼它將調用dismiss(),將其標記爲正在數據庫中讀取。

問題是,如果消息本身包含指向另一個頁面或外部網站的鏈接,我還想在用戶離開頁面之前調用dismiss()。是否有反正改變這個JavaScript採取所有a元素(X和消息中出現的任何鏈接),並改變onclick調用函數?

回答

1

你可以重新安排你的代碼位,並使用.delegate(),像這樣:(!快文檔片段緩存)

return this.each(function() { 
    var id = o["id"]; 
    jQuery('<div />', { 'class': o['className'], html: o.msg }) 
    .append('<a href="#">X</a>') 
    .delegate('a','click', function() { $(this).parent().remove(); dismiss(id); }) 
    .appendTo(this); 
}); 

這使用jQuery的1.4增加了新的jQuery(html,props),使創建位清潔。它所做的不是將onclick附加到X上,而是在div中監聽任意<a>的點擊,當它出現泡沫時,它將執行與僅用於<a href="#">X</a>錨點相同的代碼。

+0

@Brandon - 聽起來就像你有一個時髦的人物,你在說'X'部分還是'o.msg'部分?最糟糕的情況是,你可以刪除',text:o.msg'並在鏈中添加一個'.html(o.msg)'。 – 2010-04-20 01:50:50

+0

o.msg部分。我實際上給了X鏈接一個類來將它從消息鏈接中分離出來(所以我可以將它浮動到右邊),現在o.msg部分可以工作。我不確定爲什麼。但我不相信這個工作。它生成的鏈接沒有點擊。 – Brandon 2010-04-20 01:53:19

+0

@Brandon - 你不會在html中看到'onclick',它是一個事件處理程序,在代理的函數中放置一個'alert(id)'來看它被點擊。 – 2010-04-20 01:54:57

1

代碼示例有點含糊,這個o從哪裏來?它是全球性的還是特定於某個div的?

無論如何,您可能會發現jQuery.live()對此很有用。一旦初始化,它將被應用於與選擇器匹配的所有未來新元素。你只需要有一些父元素將包含所有這些div與消息和鏈接。

$('#someDivId a').live('click', function() { 
    // Do your thing here as you did in `onclick` attribute. 
}; 

只是在onload時執行一次。

相關問題