2013-03-20 69 views
21

我需要在trigger调用的回调中触发自定义事件,但我无法使其工作。如何在jQuery触发器上运行回调函数(“click”)?

我尝试这样做:

var $input = $(".ui-popup-container").find("input").eq(2); 

function runtests() { 
    console.log("clicked the input"); 
}; 
$input.trigger('click', runtests()); 

这:

var $input = $(".ui-popup-container").find("input").eq(2); 
$input.trigger('click', function(){ 
    console.log("clicked the input"); 
} 

这两者都不工作。

问:
如何获得的回调函数,当我触发元素上点击运行?

+1

你为什么要添加未定义的第二个参数触发?第二个参数应该做什么?你困惑触发和绑定? – 2013-03-20 09:16:11

+0

这是我在回调函数中的尝试...我也尝试按[jquery API](http://api.jquery.com/trigger/)在'[]'中包装它,但也不起作用 – frequent 2013-03-20 09:17:31

+1

'.trigger'不接受任何回调。 $ input.trigger('click')'触发'$ input'元素上的'click'事件,即它将执行绑定到这些元素的'click'事件处理程序。看起来你已经将'runtest'绑定到'$ input',但我不确定你想要的是什么。 – 2013-03-20 09:17:47

回答

21

当您拨打trigger时,绑定事件处理程序会立即执行,因此您不需要任何回调。只需使用

$input.trigger('click'); 
runtests(); 
+0

+1这应该工作正常,根据文档:http://qunitjs.com/cookbook/#testing-user-actions。 – 2013-03-20 09:24:48

+0

要走的路。谢谢 – frequent 2013-03-20 09:28:48

+1

@频繁发生,当然,你会遇到回调和处理程序混淆。如果没有与动作相关的异步活动,那么它就是您*触发的处理程序*,而如果存在异步活动,则分配一个*回调*来处理响应发生时(或状态)的响应。 – 2013-03-20 17:19:14

4

触发器没有回调函数。

.trigger(eventType [, extraParameters ]) 

Official Document

你能做什么

var $input = $(".ui-popup-container").find("input").eq(2); 

$input.on('click',function(){ 
    console.log("clicked the input"); 
}); 
+0

@dystroy对不起,我正在编辑我的答案... – 2013-03-20 09:22:29

+0

好的。感谢澄清。 – frequent 2013-03-20 09:24:21

0

的触发没有一个回调函数 - 可以更好地重新编写代码使用.on方法。

$("body").on("click", "#click", function() { 
    alert("Clicked!"); 
}); 

JSFiddle

11

首先,您需要绑定单击事件,然后才能触发单击事件。

$input.bind('click', function() { 

    console.log("clicked the input"); 
}); 

$input.trigger('click'); 
+0

是。那是一种方式。谢谢。 – frequent 2013-03-20 09:23:52

+2

使用'.on()'而不是'.bind()'。 – Simon 2013-03-20 09:47:12

2

您需要使用bindon来添加回调。在你的情况应该是这样的:

var $input = $(".ui-popup-container").find("input").eq(2); 

function runtests() { 
    console.log("clicked the input"); 
}; 

$input.bind('click', runtests); 

更短版结合的点击是$input.click(runtests)

然后,它会在用户点击被称为或者你可以用$input.trigger('click')或者干脆$input.click()手动触发它。

0

如果你对每输入一个单击处理程序,但希望做一些特定的元素:

var $container = $(".ui-popup-container"), 
    special = 2; 

$container.on('click', 'input', function() { 
    // do something for every input 

    if($(this).index() == special) { 
     // your "callback", e.g. the function you want to execute on input:eq2 click 
     myfunction(); 
    } 
}).find('input').eq(special).trigger('click'); 
8

是 - 这是事实,触发并不需要回调,但我们可以传递回调作为参数。

//.trigger(eventType [, extraParameters ]) 

$("#element").bind("customCall", function(e, callback){ 
    callback(); 
} 
var callback = function(){alert("Hello");} 
$("#element").trigger("customCall",[callback]); 

希望这将有助于

+2

如果您已经熟悉为DOM元素定义绑定事件时分配回调函数的约定,此答案实际上告诉您如何实际传递动态回调函数当事件被触发时。这使得它成为本页最有价值的答案之一。 – tobylaroni 2016-06-01 04:58:29

+0

同意@tobylaroni。不知道为什么这不是公认的答案!可能这个问题是特定于'触发'而不是自定义的呼叫。 – Rahatur 2018-03-02 09:06:13