Виявлення події при зміні властивості css за допомогою Jquery


91

Чи є спосіб виявити, чи змінено властивість css елемента "display" (на те, чи ні, чи блок, чи вбудований блок ...)? якщо ні, то будь-який плагін? Дякую

Відповіді:


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події в кореневому елементі документа на будьте впевнені, що зловите все.
Тім Даун

12
Ця подія застаріла у w3c. Це повинен бути інший спосіб.
ccsakuweb

8
Події мутації позначені як застарілі у специфікації подій DOM, оскільки дизайн API є недосконалим. Пропонованою заміною є спостерігачі за мутацією. Ось посилання [ developer.mozilla.org/en-US/docs/DOM/Mutation_events]
Anmol Saraf

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, це "стиль", а не "відображення".
jerrygarciuh

Працює добре, але це швидше, ніж використання регулярного виразу, і вам не потрібно перше if (evnt.attributeName ...): if (evnt.newValue.indexOf ('display: inline-block')> -1) {. ..; повернення;}
Ден Рендольф

4

Ви можете використовувати cssфункцію jQuery для перевірки властивостей CSS, наприклад.if ($('node').css('display') == 'block').

Колін має рацію, що немає жодної явної події, яка запускається при зміні певної властивості CSS. Але ви, можливо, зможете перевернути його і викликати подію, яка задає дисплей, і будь-що інше.

Також розгляньте можливість додавання класів CSS, щоб отримати потрібну поведінку. Часто ви можете додати клас до вміщуючого елемента та використовувати CSS для впливу на всі елементи. Я часто ляпаю клас на елемент body, щоб вказати, що очікується відповідь AJAX. Тоді я можу використовувати селектори CSS, щоб отримати потрібний дисплей.

Не впевнений, що це те, що ви шукаєте.


3

Для властивостей, на які вплине перехід css, можна використовувати перехідну і подію, наприклад для 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 функцію, яка використовує об'єкт правила і, можливо, поточний елемент керування (id) як параметр?
Колін

3
Чому це проти? Визначення класу для батьківського елемента та зміна стилю в ньому є єдиним правильним рішенням для цього.
Ilia G

11
Проголосував за "Я не можу придумати причину, чому ви хочете підключити подію до зміни стилю" - якщо ви не можете придумати причину, це не означає, що немає можливої ​​причини, а для "Чому не додавати там зайвої логіки? " - тому що ви не завжди можете змінити сценарії.
Андрей Коджея

Щоб навести приклад, я хочу змінити властивість заливки шляху svg, коли змінюється властивість кольору батьківського елемента.
Андрій Коджея
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.