2011-09-09 71 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开发人员可以使用的几种选择。