Как я могу запустить событие, если класс css был добавлен или изменен с помощью jQuery? Изменяет ли класс CSS событие jQuery change()?
JQuery - событие Fire, если класс CSS изменен
Ответ 1
Всякий раз, когда вы меняете класс в script, вы можете использовать trigger
для создания своего собственного события.
$(this).addClass('someClass');
$(mySelector).trigger('cssClassChanged')
....
$(otherSelector).bind('cssClassChanged', data, function(){ do stuff });
но в противном случае нет, нет способа обжаривания события, когда класс изменяется. change()
срабатывает только после того, как фокус оставляет вход, вход которого изменен.
$(function() {
var button = $('.clickme')
, box = $('.box')
;
button.on('click', function() {
box.removeClass('box');
$(document).trigger('buttonClick');
});
$(document).on('buttonClick', function() {
box.text('Clicked!');
});
});
.box { background-color: red; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="box">Hi</div>
<button class="clickme">Click me</button>
Ответ 2
IMHO лучшим решением является объединение двух ответов на @RamboNo5 и @Jason
Я имею в виду переопределяющую функцию addClass и добавление настраиваемого события под названием cssClassChanged
// Create a closure
(function(){
// Your base, I'm in it!
var originalAddClassMethod = jQuery.fn.addClass;
jQuery.fn.addClass = function(){
// Execute the original method.
var result = originalAddClassMethod.apply( this, arguments );
// trigger a custom event
jQuery(this).trigger('cssClassChanged');
// return the original result
return result;
}
})();
// document ready function
$(function(){
$("#YourExampleElementID").bind('cssClassChanged', function(){
//do stuff here
});
});
Ответ 3
Я бы предложил вам переопределить функцию addClass. Вы можете сделать это следующим образом:
// Create a closure
(function(){
// Your base, I'm in it!
var originalAddClassMethod = jQuery.fn.addClass;
jQuery.fn.addClass = function(){
// Execute the original method.
var result = originalAddClassMethod.apply( this, arguments );
// call your function
// this gets called everytime you use the addClass method
myfunction();
// return the original result
return result;
}
})();
// document ready function
$(function(){
// do stuff
});
Ответ 4
Если вы хотите определить изменение класса, лучше всего использовать Mutation Observers, который дает вам полный контроль над любым изменением атрибута. Однако вам необходимо определить слушателя самостоятельно и добавить его к элементу, который вы слушаете. Хорошо, что вам не нужно запускать что-либо вручную после добавления слушателя.
$(function() {
(function($) {
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
$.fn.attrchange = function(callback) {
if (MutationObserver) {
var options = {
subtree: false,
attributes: true
};
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(e) {
callback.call(e.target, e.attributeName);
});
});
return this.each(function() {
observer.observe(this, options);
});
}
}
})(jQuery);
//Now you need to append event listener
$('body *').attrchange(function(attrName) {
if(attrName=='class'){
alert('class changed');
}else if(attrName=='id'){
alert('id changed');
}else{
//OTHER ATTR CHANGED
}
});
});
В этом примере прослушиватель событий добавляется к каждому элементу, но в большинстве случаев вы не хотите (сохранять память). Добавьте этого слушателя "attrchange" к элементу, который вы хотите наблюдать.
Ответ 5
Просто доказательство концепции:
Посмотрите на суть, чтобы увидеть некоторые аннотации и не обновляйтесь:
https://gist.github.com/yckart/c893d7db0f49b1ea4dfb
(function ($) {
var methods = ['addClass', 'toggleClass', 'removeClass'];
$.each(methods, function (index, method) {
var originalMethod = $.fn[method];
$.fn[method] = function () {
var oldClass = this[0].className;
var result = originalMethod.apply(this, arguments);
var newClass = this[0].className;
this.trigger(method, [oldClass, newClass]);
return result;
};
});
}(window.jQuery || window.Zepto));
Использование довольно просто, просто добавьте новый список в node, который вы хотите наблюдать и управлять классами, как обычно:
var $node = $('div')
// listen to class-manipulation
.on('addClass toggleClass removeClass', function (e, oldClass, newClass) {
console.log('Changed from %s to %s due %s', oldClass, newClass, e.type);
})
// make some changes
.addClass('foo')
.removeClass('foo')
.toggleClass('foo');
Ответ 6
change()
не срабатывает при добавлении или удалении класса CSS или изменении определения. Он срабатывает при таких обстоятельствах, как при выборе или невыбранном значении окна выбора.
Я не уверен, если вы имеете в виду, если определение класса CSS будет изменено (что может быть сделано программно, но утомительно и обычно не рекомендуется), или если класс добавлен или удален в элемент. Невозможно надежно зафиксировать это в обоих случаях.
Вы могли бы, конечно, создать свое собственное событие для этого, но это можно назвать только рекомендательным. Он не будет записывать код, который не является вашим.
В качестве альтернативы вы можете переопределить/заменить методы addClass()
(и т.д.) в jQuery, но это не будет отображаться, когда это будет сделано с помощью javascript (хотя я думаю, вы тоже могли бы заменить эти методы).
Ответ 7
Существует еще один способ без запуска пользовательского события
Плагин jQuery для мониторинга изменений CSS в CSS Html Rick Strahl
Цитата сверху
Плагин watch работает, подключаясь к DOMAttrModified в FireFox, toPropertyChanged в Internet Explorer или с помощью таймера с setInterval обрабатывать обнаружение изменений для других браузеров. К сожалению, WebKit не поддерживает DOMAttrModified последовательно в в тот момент, когда Safari и Chrome в настоящее время должны использовать медленнее setInterval.
Ответ 8
используя последнюю мутацию jquery
var $target = jQuery(".required-entry");
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.attributeName === "class") {
var attributeValue = jQuery(mutation.target).prop(mutation.attributeName);
if (attributeValue.indexOf("search-class") >= 0){
// do what you want
}
}
});
});
observer.observe($target[0], {
attributes: true
});
//любой код, который обновляет div, имеющий класс required-entry, который находится в $target например $target.addClass('search-class');
Ответ 9
Хороший вопрос. Я использую раскрывающееся меню Bootstrap, и вам нужно было выполнить событие, когда выпадающее окно Bootstrap было скрыто. Когда раскрывающийся список открывается, содержащий div с именем класса "button-group" добавляет класс "open"; и сама кнопка имеет атрибут "aria-extended", установленный в true. Когда выпадающее окно закрывается, этот класс "open" удаляется из содержащего div, а расширение aria переключается с true на false.Это привело меня к этому вопросу, как определить изменение класса.
С помощью Bootstrap есть "раскрывающиеся события", которые можно обнаружить. Найдите "Dropdown Events" по этой ссылке. http://www.w3schools.com/bootstrap/bootstrap_ref_js_dropdown.asp
Вот быстрый и грязный пример использования этого события в Dropstrap Dropdown.
$(document).on('hidden.bs.dropdown', function(event) {
console.log('closed');
});
Теперь я понимаю, что это более конкретный, чем общий вопрос, который задают. Но я думаю, что другие разработчики, пытающиеся обнаружить открытое или закрытое событие с Dropstrap Dropdown, найдут это полезным. Как и я, они могут сначала пойти по пути просто пытаться обнаружить изменение класса элемента (что, по-видимому, не так просто). Спасибо.
Ответ 10
Если вам нужно вызвать конкретное событие, вы можете переопределить метод addClass(), чтобы запустить настраиваемое событие под названием classadded.
Вот как:
(function() {
var ev = new $.Event('classadded'),
orig = $.fn.addClass;
$.fn.addClass = function() {
$(this).trigger(ev, arguments);
return orig.apply(this, arguments);
}
})();
$('#myElement').on('classadded', function(ev, newClasses) {
console.log(newClasses + ' added!');
console.log(this);
// Do stuff
// ...
});
Ответ 11
Вы можете связать событие DOMSubtreeModified. Я добавляю здесь пример:
HTML
<div id="mutable" style="width:50px;height:50px;">sjdfhksfh<div>
<div>
<button id="changeClass">Change Class</button>
</div>
JavaScript
$(document).ready(function() {
$('#changeClass').click(function() {
$('#mutable').addClass("red");
});
$('#mutable').bind('DOMSubtreeModified', function(e) {
alert('class changed');
});
});
Ответ 12
если вы знаете, какое событие изменило класс, в первую очередь вы можете использовать небольшую задержку в одном и том же событии и проверить его для класса. Пример
//this is not the code you control
$('input').on('blur', function(){
$(this).addClass('error');
$(this).before("<div class='someClass'>Warning Error</div>");
});
//this is your code
$('input').on('blur', function(){
var el= $(this);
setTimeout(function(){
if ($(el).hasClass('error')){
$(el).removeClass('error');
$(el).prev('.someClass').hide();
}
},1000);
});
Ответ 13
var timeout_check_change_class;
function check_change_class( selector )
{
$(selector).each(function(index, el) {
var data_old_class = $(el).attr('data-old-class');
if (typeof data_old_class !== typeof undefined && data_old_class !== false)
{
if( data_old_class != $(el).attr('class') )
{
$(el).trigger('change_class');
}
}
$(el).attr('data-old-class', $(el).attr('class') );
});
clearTimeout( timeout_check_change_class );
timeout_check_change_class = setTimeout(check_change_class, 10, selector);
}
check_change_class( '.breakpoint' );
$('.breakpoint').on('change_class', function(event) {
console.log('haschange');
});