有没有办法在用jQuery绑定事件后更改eventData?

时间:2014-05-08 14:48:06

标签: javascript jquery event-binding

假设您将处理程序绑定到bind()on()的某个位置,并指定{ color : "red" }等数据。稍后,情况会发生变化,您希望使用{ color : "blue"}触发事件。有没有办法在不使用unbind()off()移除处理程序并使用新数据对象重新绑定的情况下更改此内容?

3 个答案:

答案 0 :(得分: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

FIDDLE

原因是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'}
}); 

FIDDLE

答案 1 :(得分:1)

您可以传入获取数据的方法吗? 即。

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'};

答案 2 :(得分:0)

我发现了另一个我认为有用的问题。

jQuery find events handlers registered with an object

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

jQuery._data( elem, "events" );

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

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