如何监视 jQuery 中主体“data”属性何时更改
How to monitor when the body 'data' attribute changes in jQuery?
我的身体标签中有数据段属性,该属性由滑块更改。当它被更改时,我需要根据这个值触发一个函数。
不过,我不确定在这种情况下如何附加事件侦听器?
'当 DOM 节点属性发生更改时,没有可靠的跨浏览器方法来接收事件。一些浏览器支持"DOM 突变事件",但你不应该依赖它们,你可以谷歌这个短语来了解该技术的命运多舛的历史。
如果滑块控件不触发自定义事件(我认为大多数现代控件都会触发),那么最好的办法是设置一个setInterval()
方法来轮询值。
您可以使用MutationObserver
,这是每个浏览器中可用的API,并避免使用setInterval
进行轮询。如果你在 element
中引用了你的元素,你可以这样做:
const mutationObserver = new MutationObserver(callback);
mutationObserver.observe(element, { attributes: true });
function callback() {
// This function will be called every time attributes are
// changed, including `data-` attributes.
}
使用此 API 可以轻松检测到元素中的其他更改,您甚至可以获取在回调中更改的属性的旧值和新值,从而在调用 observe
时调整配置对象。所有关于这方面的文档都可以在MDN中阅读:https://developer.mozilla.org/en-US/docs/Web/API/MutationObserverInit
由于在我的用例中,我的所有.data('type', 'value')
都是在 javascript 块中设置的,所以在我的情况下,我只是在.data(...)
之后放置一个.change()
链并使用正常$("#oh-my-data").change()
访问更新
这对我来说很好用,请参阅演示。
$("#oh-my-data").change(function() {
$("#result").text($("#result").text() + ' ' + $(this).data('value'));
})
$("#oh-my-data").data('value', 'something1').change();
$("#oh-my-data").data('value', 'something2').change();
$("#oh-my-data").data('value', 'something3').change();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="oh-my-data" type="hidden" data-value="" /> Result: <span id="result"></span>
但是这个解决方案有一个问题,那就是如果.data()
是由外部库设置的,那么这将不起作用,因为您无法在其上添加.change()
。
相关文章:
- jQuery可以't获取data-*属性值,返回undefined
- 为什么toStaticHTML删除data-*属性
- 访问HTML中的data-*属性并将其作为道具传递
- 如何使用jQuery选择具有特定data-属性的元素?价值无关紧要
- Javascript个性测试使用'这'和data-*属性
- 使用script元素上的html data-*属性来配置引用的脚本文件
- 将Data属性添加到元素,并从字符串中动态添加值
- 追加并替换data-*属性URL的查询字符串值
- 将变量从data属性传递给onclick函数
- “data-”属性作为超链接的一部分.HTML 到 JavaScript
- 在 React 组件中检索自定义 data-* 属性值(无事件)
- Javascript data-* 属性计算器
- Javascript 获取动态设置 data-* 属性
- 我想使用 jQuery 在 html 中使用 data-* 属性将占位符设置为文本框
- 如何监视 jQuery 中主体“data”属性何时更改
- jQuery - aria-controls vs data 属性来识别/选择 DOM 元素 - 这是首选方法
- 如何查找具有相同 data-* 属性的元素并删除重复项
- 有没有一种简单/快速的方法将“data-”属性映射到大小写混合的属性名称
- 多个 html data-* 属性和 js 函数不起作用
- 如何在 switch 语句中捆绑“data-”属性的大小写