事件检测何时使用Jquery更改CSS属性


91

有没有一种方法可以检测元素的“ display” css属性是否已更改(更改为none还是block或inline-block ...)?如果没有,有插件吗?谢谢

Answers:


93

注意

自撰写此文章以来,不推荐使用突变事件,并且并非所有浏览器都支持突变事件。而是使用一个突变观察器

是的你可以。DOM L2事件模块定义了突变事件;其中之一-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吗?
HP。

7
@Boldewyn:是的,但是更改class元素祖先的属性(如果CSS中存在属性选择器,则更改任何其他属性)也可能会更改元素,因此您必须处理DOMAttrModified文档根元素上的所有事件确保捕获所有内容。
Tim Down

12
该事件在w3c中已弃用。这一定是另一种方式。
ccsakuweb

8
由于API的设计存在缺陷,因此DOM Events规范中已将突变事件标记为已弃用。突变观察者是拟议的替代者。这是链接[ developer.mozilla.org/en-US/docs/DOM/Mutation_events]
Anmol Saraf 2012年

1
Anmol -将MDN链接突变事件应该是:developer.mozilla.org/en-US/docs/Web/Guide/Events/...
groovecoder

19

您可以使用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...
            }
        }
    }
});

请注意,对于某些修改CSS的插件,evnt.attributeName是'style'而不是'display'。
jerrygarciuh 2015年

效果很好,但这比使用正则表达式搜索快,并且您不需要第一个if(evnt.attributeName ...):if(evnt.newValue.indexOf('display:inline-block')> -1){。 ..; 返回;}
丹·伦道夫

4

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

Colin是正确的,当更改特定CSS属性时,不会触发任何显式事件。但是您可能可以翻转它,并触发设置显示的事件以及其他任何事件。

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

不知道这是您要找的东西。


3

对于CSS过渡将影响的属性,可以使用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>


-17

你不能 CSS不支持“事件”。敢问你需要什么?在SO上查看此帖子。我想不出您为什么要将事件挂接到样式更改的原因。我在这里假设样式更改是由其他javascript触发的。为什么不在那里添加额外的逻辑呢?


1
我有几个事件可以触发一个框出现或不出现。我还有另一个要素,那就是要依靠盒子的外观来做事。现在,我不想重复代码并挂接其他所有出现在框上的事件,尽管这是做到这一点的一种方法。只是多余!
HP。

这是多余的,也许使用基于规则的系统行得通吗?即,一些类似于JSON的结构定义了在另一个控件发生更改时应对某个控件执行的操作?这样,您只需要创建1个函数,就可以使用规则对象以及当前的control(id)作为参数?
科林

3
为什么这样投票?为这两个元素的父级定义类并更改其样式是解决此问题的唯一正确方法。
Ilia G

11
因“我想不出为什么要将事件挂接到样式更改的原因”而投票-如果您想不出原因,并不意味着没有可能的原因,在那里没有添加额外的逻辑?” -因为您不能总是修改脚本。
Andrei Cojea 2015年

举个例子,我想在父元素的color属性更改时更改svg路径的fill属性。
Andrei Cojea 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.