2011-09-09 93 views
0

場景: 使用jQuery多重綁定是針對特定事件完成的。當事件被觸發時,指定的函數應該觸發一次PER觸發器。jQuery觸發器僅觸發一次功能

挑戰: jQuery觸發器的工作方式是,當觸發器被調用時,關聯函數的觸發次數與事件所具有的綁定次數相同。在每次觸發時,該功能只能觸發一次。這怎麼能實現。 「one」在場景中不起作用,因爲每次觸發事件時都應該觸發該功能。

在此先感謝。

更新: 道歉沒有更具體。

需求是當頁面加載時,頁面上的不同元素進行註冊,所以當自定義事件發生時,他們將參與其中。

當自定義事件被觸發/引發時,將調用一個將對所有註冊元素執行一些任務的函數。

例如, 請注意,從不同的部分視圖(MVC)嵌入的元素。

<html> 
<a href="#" id="triggerelement">Trigger element</a> 
<div id="element1" data-join="aevent">something 1</div> 
<div id="element2" data-join="aevent">something 2</div> 
<div id="element3" data-join="aevent">something 3</div> 
<div id="element4" data-join="aevent">something 4</div> 
</html> 
  1. 在文件準備 - 與「數據連接」的所有元素綁定到事件「aevent」。
  2. 當觸發器(「aevent」)被調用時,綁定函數應該收集所有必須參與「aevent」並且對它們進行一些操作的元素。

兩個問題我遇到:

  1. 什麼元素,以 「綁定」 到 - $綁定(?)。原因:多個元素可以引發此自定義事件,並且引發事件的元素不會被知道。一個想法是 - $(document).bind/$(document).trigger。這是最好的方法嗎?

  2. 使用jQuery在$()。觸發器被稱爲我怎麼能保證它調用相關功能只一次,每次通話而不是綁定到該事件的每個元素。

+0

停止綁定多次?或者使用'var myTrigger = function(){}'並將'event + = myTrigger'綁定一次? (或者我誤解了嗎?)你也可以綁定一個「代理」處理程序,它爲你「過濾」「多個」綁定。 –

+0

是否爲您定製解決方案? – voigtan

回答

2

你嘗試結合自己的函數時使用的命名空間?

$('a').bind("click.name1", function() { 
    alert("name1"); 
}); 
$('a').bind("click.name2", function() { 
    alert("name2"); 
    $("a").unbind("click.name1"); 
}); 

http://jsfiddle.net/hssHZ/

+0

嗯..如果我解除綁定,那麼我無法在該元素上再次提出該事件。對?我不想那樣。 – Pakora

1

我還沒有線索,如果這是你在想什麼,但這裏的東西給你什麼是可能的想法。您可以輕鬆維護和控制自己的調用堆棧。這將爲callstack添加三個函數,並且當您單擊彈出鏈接時,它將執行堆棧頂部的任何操作。

var callstack = []; 

function popcallstack(e) 
{ 
    e.preventDefault(); 
    return callstack.pop()(); 
} 

//bind once 
$('#foo').click(popcallstack); 

callstack.push(function() { alert('executed1') }); 
callstack.push(function() { alert('executed2') }); 
callstack.push(function() { alert('executed3') }); 

http://jsfiddle.net/uQumm/1

也許這會給你,你以後的控制。哦,你應該知道jQuery基本上會爲你做這種事情,如果你想要做一些不可思議的事情,而且你需要「控制」的話,這僅僅是一種示範。

0

如果您使用的是jQuery,有一個鮮爲人知的one()事件綁定方法可以實現一次性事件。

$("#myelement").one("click", function() { alert("You'll only see this once!"); }); 

自我刪除處理程序
如果你使用的原料JavaScript中,任何處理函數可以使用一個單一的代碼行中刪除自身:

document.getElementById("myelement").addEventListener("click", handler); 
// handler function 
function handler(e) { 
    // remove this handler 
    e.target.removeEventListener(e.type, arguments.callee); 

    alert("You'll only see this once!"); 
} 

意味着你的處理事件參數被命名爲'e',行:

e.target.removeEventListener(e.type, arguments.callee); 

將在第一次調用inv oked。無論您用於處理程序的事件類型或名稱如何 - 它甚至可能是一個內聯匿名函數。

注意我使用的標準事件調用不能在IE8及以下版本中使用。 OldIE需要調用detachEvent,並且該類型需要一個「on」前綴,例如, 「點擊」。但是,如果您支持oldIE,那麼您可能使用jQuery或您自己的自定義事件處理程序。

如果您需要某些靈活性,自動刪除處理程序可能是最佳選擇。你只想解除某些事件類型或在不同情況下移除處理程序,例如兩次或多次點擊。

一次性事件創建功能
你可能懶得或健忘事件去除行添加到每個處理函數。讓我們創建一個一次性的功能,爲我們做了艱苦的工作:

// create a one-time event 
function onetime(node, type, callback) { 
    // create event 
    node.addEventListener(type, function(e) { 
     // remove event 
     e.target.removeEventListener(e.type, arguments.callee); 
     // call handler 
     return callback(e); 
    }); 

} 

,每當我們需要一個一次性的唯一事件現在,我們可以使用此功能:

// one-time event 
onetime(document.getElementById("myelement"), "click", handler); 



// handler function 
function handler(e) { 
    alert("You'll only see this once!"); 
} 

雖然你不會需要一個在每個頁面中都有時間事件,很高興能夠找到JavaScript開發人員可以使用的幾種選擇。