0

bind()假设您使用or将处理程序绑定到某物on()并指定数据,例如{ color : "red" }. 稍后,情况发生变化,您希望使用 触发事件{ color : "blue"}。有没有办法在不使用unbind()or删除处理程序off()并重新绑定新数据对象的情况下更改它?

4

3 回答 3

4

不,没有办法改变这个,传入的eventData以后不能改变,这就是重点,将数据锁定在事件处理程序中

var data = {test : 'test'};

$('element').on('click', data, function(e) {
    // e.data will always be {test : 'test'}
});

data = {test: 'foo'}; // doesn't matter

小提琴

这样做的原因是 eventData 旨在用于通常使用闭包的情况,例如

for ( var i = 0; i < 5; i++ ) {
    $("button").eq(i).on( "click", { value: i }, function( event ) {
         var i = event.data.value;

         // now i can be accessed with event.data.value without extra closures
   });
}

所以更改数据的唯一方法是重新绑定事件,或者如果您需要更改数据最好使用另一种方法,并且您提到触发事件处理程序,如果您使用 jQuery 来执行此操作,您可以通过使用内部的事件对象也以这种方式传递数据trigger()

$('element').on('click', function(event) {
    var data = event.custom;
});

$('element').trigger({
    type: 'click',
    custom: {color: 'red'}
}); 

$('element').trigger({
    type: 'click',
    custom: {color: 'blue'}
}); 

小提琴

于 2014-05-08T14:53:09.917 回答
1

你可以传入一个获取数据的方法吗?IE

var data = {test : 'test'};
var DataGetter = function() { return data;};
$('element').on('click', DataGetter, function(e) {
var data=e.data();
});
data.test='Hello';
data = {hello: 'world'};
于 2014-05-08T14:57:49.233 回答
0

我发现了另一个我认为会有所帮助的问题。

jQuery 查找向对象注册的事件处理程序

看起来您直接查看 jQuery 变量以查看已发布的内容:

jQuery._data( elem, "events" );

看起来这并不安全,我不知道您是否可以更改它,但它确实可以让您查看它。

我认为最好删除事件然后添加新事件。

于 2014-05-08T14:58:09.193 回答