使用 Jquery 更改 css 属性时的事件检测

IT技术 javascript jquery html
2021-01-22 16:06:09

有没有办法检测元素的“显示”css 属性是否已更改(更改为 none 或 block 或 inline-block ......)?如果没有,任何插件?谢谢

5个回答

笔记

自从撰写本文以来,突变事件已被弃用,并且可能并非所有浏览器都支持。相反,使用突变观察者

是的你可以。DOM L2 Events module定义了突变事件其中之一 - DOMAttrModified是您需要的。当然,这些并没有被广泛实现,但至少在 Gecko 和 Opera 浏览器中得到支持。

尝试以下方法:

document.documentElement.addEventListener('DOMAttrModified', function(e){
  if (e.attrName === 'style') {
    console.log('prevValue: ' + e.prevValue, 'newValue: ' + e.newValue);
  }
}, false);

document.documentElement.style.display = 'block';

您还可以尝试使用IE 的“propertychange”事件作为DOMAttrModified. 它应该允许style可靠地检测变化。

谢谢。它会支持 Firefox 吗?
2021-03-11 16:06:09
该事件在 w3c 中已被弃用。它必须是另一种方式。
2021-03-11 16:06:09
由于 API 的设计存在缺陷,更改事件已在 DOM 事件规范中标记为已弃用。突变观察者是建议的替代品。这是链接 [ developer.mozilla.org/en-US/docs/DOM/Mutation_events]
2021-03-13 16:06:09
@Boldewyn:是的,但是更改class元素祖先属性(或任何其他属性,如果 CSS 中存在属性选择器)也可能更改元素,因此您必须处理DOMAttrModified文档根元素上的所有事件以一定要抓住一切。
2021-03-24 16:06:09
Anmol - Mutation 事件的 MDN 链接应该是:developer.mozilla.org/en-US/docs/Web/Guide/Events/...
2021-03-25 16:06:09

您可以使用attrchange jQuery 插件该插件的主要功能是绑定一个监听HTML元素属性变化的函数。

代码示例:

$("#myDiv").attrchange({
    trackValues: true, // set to true so that the event object is updated with old & new values
    callback: function(evnt) {
        if(evnt.attributeName == "display") { // which attribute you want to watch for changes
            if(evnt.newValue.search(/inline/i) == -1) {

                // your code to execute goes here...
            }
        }
    }
});
效果很好,但这比使用正则表达式搜索要快,而且您不需要第一个 if(evnt.attributeName...): if (evnt.newValue.indexOf('display: inline-block') > -1) { 。 ..; 返回;}
2021-03-12 16:06:09
请注意,对于一些修改 CSS 的插件,evnt.attributeName 是“样式”而不是“显示”。
2021-04-02 16:06:09

您可以使用 jQuery 的css函数来测试 CSS 属性,例如。if ($('node').css('display') == 'block').

Colin 是对的,当特定的 CSS 属性发生更改时,不会触发任何显式事件。但是您可以翻转它,并触发一个设置显示的事件,等等。

还可以考虑使用添加 CSS 类来获得所需的行为。通常,您可以向包含元素添加一个类,并使用 CSS 来影响所有元素。我经常在 body 元素上添加一个类来指示 AJAX 响应正在等待中。然后我可以使用 CSS 选择器来获得我想要的显示。

不确定这是否是您要查找的内容。

对于 css transition 会影响的属性,可以使用 transitionend 事件,例如 z-index:

$(".observed-element").on("webkitTransitionEnd transitionend", function(e) {
  console.log("end", e);
  alert("z-index changed");
});

$(".changeButton").on("click", function() {
  console.log("click");
  document.querySelector(".observed-element").style.zIndex = (Math.random() * 1000) | 0;
});
.observed-element {
  transition: z-index 1ms;
  -webkit-transition: z-index 1ms;
}
div {
  width: 100px;
  height: 100px;
  border: 1px solid;
  position: absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button class="changeButton">change z-index</button>
<div class="observed-element"></div>

你不能。CSS 不支持“事件”。我敢问你需要它做什么?在 SO 上查看这篇文章我想不出你想要将一个事件与风格变化挂钩的原因。我在这里假设样式更改是由一段 javascript 触发的。为什么不在那里添加额外的逻辑?

为什么这是downvoted?为两个元素的父元素定义类并更改其样式是唯一正确的解决方案。
2021-03-12 16:06:09
这是多余的,也许使用基于规则的系统会起作用?即,一些类似 JSON 的结构定义了当另一个控件更改时某个控件应该发生什么?这样你只需要创建 1 个使用规则对象和当前控件(id)作为参数的函数?
2021-03-16 16:06:09
因“我想不出为什么要将活动与风格改变挂钩”而被否决 - 如果你想不出原因,这并不意味着没有可能的原因,而对于“为什么不是在那里添加额外的逻辑吗?” - 因为你不能总是修改脚本。
2021-03-20 16:06:09
举个例子,我想在父元素的颜色属性更改时更改 svg 路径的填充属性。
2021-03-26 16:06:09
我有几个事件可以触发一个框是否出现。我还有另一个元素,它有点依赖于那个盒子的外观来做事。现在,我不想重复代码并连接到所有其他出现在盒子上的事件,尽管这是一种方法。只是冗余!
2021-04-07 16:06:09