Можно ли создать прослушиватель событий в jQuery, который можно привязать к любым изменениям стиля? Например, если я хочу что-то «сделать», когда элемент меняет размеры, или любые другие изменения в атрибуте стиля, я мог бы сделать:
$('div').bind('style', function() {
console.log($(this).css('height'));
});
$('div').height(100); // yields '100'
Это было бы действительно полезно.
Любые идеи?
ОБНОВИТЬ
Извините, что ответил на это сам, но я написал аккуратное решение, которое может подойти кому-то еще:
(function() {
var ev = new $.Event('style'),
orig = $.fn.css;
$.fn.css = function() {
$(this).trigger(ev);
return orig.apply(this, arguments);
}
})();
Это временно переопределит внутренний метод prototype.css и переопределит его с помощью триггера в конце. Так что это работает так:
$('p').bind('style', function(e) {
console.log( $(this).attr('style') );
});
$('p').width(100);
$('p').css('color','red');
javascript
jquery
Дэвид Хеллсинг
источник
источник
Ответы:
Поскольку jQuery с открытым исходным кодом, я бы предположил, что вы можете настроить
css
функцию так, чтобы она вызывала функцию по вашему выбору каждый раз, когда она вызывается (передавая объект jQuery). Конечно, вы захотите просмотреть код jQuery, чтобы убедиться, что внутри него ничего больше не используется для установки свойств CSS. В идеале вы хотели бы написать отдельный плагин для jQuery, чтобы он не влиял на саму библиотеку jQuery, но вам придется решить, возможно ли это для вашего проекта.источник
С тех пор, как вопрос был задан, дела пошли немного дальше - теперь можно использовать MutationObserver для обнаружения изменений в атрибуте 'style' элемента, jQuery не требуется:
Аргумент, который передается в функцию обратного вызова, является объектом MutationRecord, который позволяет вам получить старые и новые значения стиля.
Поддержка хороша в современных браузерах, включая IE 11+.
источник
@media
изменения.getComputedStyle
с,setInterval
но это сильно замедлит ваш сайт.HTMLElement.style.prop = "value"
Объявление вашего объекта события должно быть внутри вашей новой функции CSS. В противном случае событие может быть запущено только один раз.
источник
Я думаю, что лучший ответ, если от Майка, если вы не можете запустить событие, потому что это не из вашего кода. Но я получаю некоторые ошибки, когда я его использовал. Поэтому я пишу новый ответ, чтобы показать вам код, который я использую.
расширение
использование
Я получил ошибку, потому что var ev = new $ .Event ('style'); Нечто похожее на стиль не было определено в HtmlDiv. Я удалил его и теперь запускаю $ (this) .trigger ("stylechanged"). Другая проблема заключалась в том, что Майк не возвращал результат $ (css, ..), тогда он может создавать проблемы в некоторых случаях. Итак, я получаю результат и возвращаю его. Теперь работает ^^ В каждом изменении CSS есть некоторые библиотеки, которые я не могу изменить, и вызвать событие.
источник
Как и предполагали другие, если у вас есть контроль над тем, какой код изменяет стиль элемента, вы можете запустить произвольное событие, когда вы измените высоту элемента:
В противном случае, хотя и довольно ресурсоемкий, вы можете установить таймер, чтобы периодически проверять изменения высоты элемента ...
источник
В jQuery или java-скрипте нет встроенной поддержки события изменения стиля. Но jQuery поддерживает создание пользовательских событий и их прослушивание, но каждый раз, когда происходит изменение, у вас должен быть способ вызвать его на себя. Так что это не будет полным решением.
источник
Вы можете попробовать плагин Jquery, он запускает события, когда CSS меняется и его легко использовать
источник
Интересный вопрос. Проблема в том, что height () не принимает обратный вызов, поэтому вы не сможете запустить обратный вызов. Используйте animate () или css (), чтобы установить высоту, а затем вызвать пользовательское событие в обратном вызове. Вот пример использования animate (), испытания и работы ( демо ) в качестве доказательства концепции:
источник
trigger()
событие вручную. Я думаю, что OP происходит после какого-то автоматически запускаемого события, когда атрибут стиля изменяется.Просто добавляем и формализуем решение @David сверху:
Обратите внимание, что функции jQuery являются цепочечными и возвращают 'this', так что несколько вызовов могут вызываться один за другим (например,
$container.css("overflow", "hidden").css("outline", 0);
).Таким образом, улучшенный код должен быть:
источник
Как насчет jQuery cssHooks?
Может быть, я не понимаю вопроса, но то, что вы ищете, легко сделать
cssHooks
, не меняяcss()
функции.копия из документации:
https://api.jquery.com/jQuery.cssHooks/
источник
У меня была такая же проблема, поэтому я написал это. Это работает довольно хорошо. Отлично смотрится, если смешать это с некоторыми переходами CSS.
источник