jQuery data() 和 'changeData' 事件

7

我可以为HTML元素添加click事件,并使click事件更新$(document).data(key,value)

这将触发$(document).bind('changeData', function() {...}))。知道这一点,找出哪个HTML元素更新了$(document).data()的最佳方法是什么?

例如:

$(document).bind('changeData', function {
  // get the anchor that set $(document).data()
});

$('a').click(function() {
  $(document).data('key', 'value');
});

1
我建议使用Robert Ross的第二个答案,但请注意我的下面的注释。另外请注意,此函数未记录,因此应视为实验性的,并且可能在不久的将来被删除。请关注这里的错误报告。 - Scoobler
谢谢提醒,注意到了! - CoryDorning
实际上,“changeData”事件现在已经被弃用,正如@TankorSmash的回答所示。 - Antti29
2个回答

3

对于通过点击事件触发的数据:

$('#elementSelector').click(function(e){
    $(document).data(key, val);
});

$(document).bind('changeData', function(e){
    // e.target?
});

如果不行,尝试将目标存储在已存储的数据中:
$('#elementSelector').click(function(e){
    $(document).data(key, {
        val: 'value',
        target: e.target
    });
});

当您触发变化事件时:

$(document).bind('changeData', function(e){
    var data = $(this).data(key);
    var target = data.target;
    var value  = data.val;
});

你可以使用 $(document).bind('changeData', function(e, key, value)..... 中的 key 代表设置的键,value 代表设置的值。 - Scoobler
@Scoobler 这很有趣并且有效...然而,e仍然指的是document - CoryDorning
我使用了第二种方法,将元素作为键/值对的对象进行传递。谢谢。 - CoryDorning
1
很遗憾,在这种情况下,e 应该被视为 this,它指的是受影响的当前对象,也就是在你的情况下是文档。但是通过将值设置为一个对象 {val: 'value', target: ....},你将始终知道是什么导致了数据变化,而不仅仅是在一个实例中。你可以使用 e.target$(this) 来设置目标 -- $(document).data(key, {val: 'value', target: $(this)});$(document).data(key, {val: 'value', target: e.target}); - Scoobler
说得好。实际上我使用了$(this),因为我将a设置为jquery-ui按钮,它传递了一个span作为目标。因此,正如你刚才所说的,我传递了$(this) - CoryDorning
显示剩余2条评论

3

https://bugs.jquery.com/ticket/11718

自1.8版以来,jQuery的setData和changeData事件已被弃用,并在1.9版中删除。这意味着在2.X和3.X版本中,您将不再能够绑定到这些事件。


当然,但我刚刚花了时间试图弄清楚为什么它不起作用。谷歌搜索“jquery changeData”并没有提到它被删除,jQuery.data()文档和事件文档也没有提到。也许值得重新标记这个问题,因为它与我们其他人使用的版本不同。 - TankorSmash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接