Есть ли идиоматический способ прослушивания изменений в DOM с помощью библиотеки Prototype?

Я пытаюсь добавить прослушиватель событий изменения DOM. Я надеялся, что что-то настолько простое, как «dom:loaded», будет встроено в Prototype. Я не уверен, что "прототип" справится с этим.

РЕДАКТИРОВАТЬ: я не могу контролировать каждый случай, когда DOM может быть изменен, поэтому я не могу избежать запуска настраиваемого события при каждом изменении DOM.


person Community    schedule 16.01.2009    source источник
comment
Не могли бы вы предоставить сценарий использования, который вы пытаетесь выполнить с помощью этого? Например, что вы хотите, чтобы происходило каждый раз при изменении dom? А что будет модифицировать дом?   -  person Noah Goodrich    schedule 17.01.2009
comment
Я не могу говорить за Марка Хоули, но я рассматривал такой механизм для настройки кросс-браузерной двусторонней привязки между атрибутами DOM и текстовыми значениями, с одной стороны, и пользовательскими свойствами объекта JS, с другой.   -  person John Slegers    schedule 08.12.2013


Ответы (4)


Нет стандартного обработчика, чтобы наблюдать за этим. Однако вы можете запускать пользовательские события в Prototype. В сочетании с Function.wrap вы сможете делать именно то, что вам нужно.

По сути, вы берете любую функцию, которая может изменять DOM, например Element.insert(), и оборачиваете ее функцией, которая запускает ваше событие изменения:

Element.prototype.insert = Element.prototype.insert.wrap(
function(original) {
    var ret = original.call(this, $A(arguments).slice(1));
    document.fire('dom:changed');
}.bind(this)
);

Теперь всякий раз, когда вы вызываете Element.insert, он будет запускать dom:changed, который можно будет просмотреть с помощью Event.observe().

Я не могу гарантировать, что то, что я только что написал, на 100 % идеально и на 100 % универсально, но оно должно помочь вам начать работу.

person dave mankoff    schedule 16.01.2009
comment
Я думаю, что он имеет в виду библиотеку javascript Prototype, а не технику OO. - person Diodeus - James MacFarlane; 16.01.2009
comment
Хм.. жаль. У меня нет доступа ко всему, что потенциально может изменить DOM. - person ; 17.01.2009

Я бы порекомендовал вам взглянуть на документацию для Event.observe из документации по прототипу.

Например, используя dom:loaded

document.observe("dom:loaded", function() {     
                // Some Javascript Code
                  });

И пример Event.observe

$('step_anchor_' + i).observe('click', function(a, b){
        return function(){pm.loadData(a, b, true)};
            }(profile.steps[i].action, profile.steps[i].dao_id)
                   );

Я должен отметить, что документ, очевидно, также имеет функцию наблюдения, которая специально разработана для прослушивания событий во всем документе, таких как dom:loaded.

person Noah Goodrich    schedule 16.01.2009
comment
Я понимаю это - меня интересует, какое событие мне нужно наблюдать, чтобы обнаружить, что DOM изменился. Я надеялся на какое-то событие «dom:changed», такое как DOM level 2 DOMEvent MutationEvent.MODIFICATION. - person ; 16.01.2009

$(элемент).observe('щелчок', function(event) { someFunction(event); } ); //someFunction будет вызываться по событию клика. Это можно изменить на любое другое событие.

http://prototypejs.org/api

Перейдите в Element, чтобы увидеть больше.

person geowa4    schedule 16.01.2009

Я думаю, что здесь правильный ответ: Может ли javascript прослушивать onDomChange на каждом Элементы дома? . Проверьте DOMSubtreeModified, DOMNodeInserted и т. д.

person alehro    schedule 07.04.2011