javascript - 如何使用 jQuery 在类更改时触发事件?

标签 javascript jquery jquery-events

我想要这样的东西:

$('#myDiv').bind('class "submission ok" added'){
    alert('class "submission ok" has been added');
});

最佳答案

类更改时不会引发任何事件。另一种方法是在您以编程方式更改类时手动引发事件:

$someElement.on('event', function() {
    $('#myDiv').addClass('submission-ok').trigger('classChange');
});

// in another js file, far, far away
$('#myDiv').on('classChange', function() {
     // do stuff
});

更新 - 2015

这个问题似乎吸引了一些访问者,所以这里有一个更新方法,无需使用新的 MutationObserver 修改现有代码即可使用:

var $div = $("#foo");
var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    var attributeValue = $(mutation.target).prop(mutation.attributeName);
    console.log("Class attribute changed to:", attributeValue);
  });
});

observer.observe($div[0], {
  attributes: true,
  attributeFilter: ['class']
});

$div.addClass('red');
.red {
  color: #C00;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<div id="foo" class="bar">#foo.bar</div>

请注意,MutationObserver 仅适用于较新的浏览器,特别是 Chrome 26、FF 14、IE 11、Opera 15 和 Safari 6。参见 MDN更多细节。如果您需要支持旧版浏览器,那么您将需要使用我在第一个示例中概述的方法。


更新 - 2022

下面是封装在 jQuery 扩展方法中的上述实现:

// extension method:
$.fn.classChange = function(cb) {
  return $(this).each((_, el) => {
    new MutationObserver(mutations => {
      mutations.forEach(mutation => cb && cb(mutation.target, $(mutation.target).prop(mutation.attributeName)));
    }).observe(el, {
      attributes: true,
      attributeFilter: ['class'] // only listen for class attribute changes 
    });
  });
}

// usage:
const $foo = $("#foo").classChange((el, newClass) => console.log(`#${el.id} had its class updated to: ${newClass}`));
const $fizz = $("#fizz").classChange((el, newClass) => console.log(`#${el.id} had its class updated to: ${newClass}`));

// trigger
$('#trigger').on('click', () => {
  $foo.removeClass('red');
  $fizz.addClass('green dark-bg');
});
.red {
  color: #C00;
}

.green {
  color: #0C0;
}

.dark-bg {
  background-color: #666;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<button id="trigger">Change classes</button>
<div id="foo" class="bar red">#foo.bar</div>
<div id="fizz" class="buzz">#fizz.buzz</div>

关于javascript - 如何使用 jQuery 在类更改时触发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19401633/

相关文章:

php - base_url 在外部 js 和 css 文件中不起作用

JavaScript fetch API - 为什么 response.json() 返回一个 promise 对象(而不是 JSON)?

javascript - jQuery 切换 .click() 函数

javascript - JQuery 父子选择

jquery - 在 jQuery 中添加函数到函数

javascript - 无法解析为在 Thymeleaf 中定义 DataTable 的表达式

javascript - Knockout js 数据绑定(bind)属性未重定向正确的页面

浏览器加载新的内联(ajax)内容时触发的 Javascript 事件?

javascript - 单击后立即删除单击事件处理程序

javascript 重定向表单适用于 Chrome/Safari,但不适用于 Firefox/IE