2015-01-18 6 views
0

У меня есть пустой div (id = "parent"), внутри которого сторонний виджет отображает некоторый контент (например, div и теги привязки). Теперь мне нужно добавить некоторые атрибуты в теги div и anchor всякий раз, когда они визуализируются виджетами.Добавить пользовательские атрибуты при изменении содержимого div

Так что у меня MutationObserver, как показано ниже:

var parent = document.getElementById("parent"); 
var observer = new MutationObserver(function(mutations){ 
    functionToAddCustomAttributes(); 
}); 

observer.observe(parent, { 
    subtree: true, 
    childList: true 
}); 

Внутри functionToAddCustomAttributes(), у меня есть код, чтобы добавить атрибуты. Мой вопрос в том, что если я добавлю атрибуты, не должен ли он снова вызвать MutationObserver, так как я обновляю дочерний элемент #parent? Разве это не должно вызвать бесконечный цикл? Это не похоже, что это происходит в моем коде, поэтому я просто хочу убедиться, что это правильный способ сделать это.

Если нет, есть ли другой способ добавить атрибуты всякий раз, когда виджет отображает контент?

+0

кажется, что код использует некоторые реализации подписки на события шаблона (как https://github.com/mroderick/PubSubJS или так, но не DOM), в этом случае я вижу следующее объяснение, почему нет цикла: 1) код, который визуализирует виджет, публикует событие - «done», которое обрабатывается MutationObserver - потому что MutationObserver подписан на нем; 2) при выполнении функцииToAddCustomAttributes это событие публикации не запускается, поэтому ничего не происходит => no loop – shershen

ответ

0

Слушайте событие onDomSubTreeModified для родительского div вместо MutationObserver. В обратном вызове добавьте свои пользовательские атрибуты и используйте return false; чтобы быть в безопасности.

+0

Я думал, что onDomSubTreeModified был очень неэффективен, например, для запуска события для каждого дочернего объекта, который был изменен, и что MutationObserver преодолевает такую ​​неэффективность. – drunkenfist

+0

Я на самом деле хочу добавить eventlistener только к предполагаемому элементу i.e .., #parent. –

0

После кода для добавления атрибутов, попробуйте следующее:

$('#parent').find('#someChild').attr('name', 'value'); 
+0

Прошу прощения, я не совсем понимаю. Как это поможет? – drunkenfist

+0

Когда функцияToAddCustomAttributes() завершает рендеринг тегов, вы можете использовать #parent для поиска #child и добавления пользовательских атрибутов. – Sid