2016-02-25 3 views
1

В течение нескольких лет я использовал функцию waitForKeyElements() для отслеживания изменений в веб-страницах из пользовательского текста. Однако иногда я обнаружил, что он не срабатывает, как ожидалось, и не работал. Я столкнулся с другим примером этой проблемы, и теперь я пытаюсь понять, в чем проблема. Ниже приведен самый яркий пример, который я могу создать.Почему waitForKeyElements() запускается только один раз, несмотря на последующие изменения?

Учитывая простой HTML-страницу, которая выглядит следующим образом:

<span class="e1">blah</span> 

и некоторые Javascript:

// function defined here https://gist.github.com/BrockA/2625891 
waitForKeyElements('.e1', handle_e1, false); 

function handle_e1(node) { 
    console.log(node.text()); 
    alert(node.text()); 
} 

setInterval(function() { 
    $('.e1').text("updated: "+Math.random()); 
}, 5000); 

Я бы ожидать, этот код, чтобы вызвать alert() и console.log() каждые 5 секунд. Однако он срабатывает только один раз. Есть идеи?

Адрес a codepen that demonstrates this.

ответ

1

По дизайну и по умолчанию waitForKeyElements обрабатывает узел только один раз. Чтобы он продолжал проверять, возвращает true из функции обратного вызова.
Вы также захотите сравнить строку (или что-то еще), чтобы увидеть, изменилась ли она.

Таким образом, в этом случае, handle_e1() будет что-то вроде:

function handle_e1 (jNode) { 
    var newTxt = jNode.text(); 
    if (typeof this.lastTxt === "undefined" || this.lastTxt !== newTxt) { 
     console.log (newTxt); 
     this.lastTxt = newTxt; 
    } 
    return true; // Allow repeat firings for this node. 
} 


с постоянная сравнением строк, хотя, производительностью может быть проблемой, если у вас есть много такого на одной странице. В этом случае лучше всего перейти на подход MutationObserver.

+0

спасибо. Так что было бы правильно сказать, что без того, что вы описали выше, waitForKeyElements() предназначен для обнаружения объектов, динамически добавленных * на страницу, в отличие от (также) отслеживания при изменении объекта * на странице? – mix

+1

Первоначально это означало больше для добавленных элементов, да. Но он может делать оба, как показано. Я упомянул только MutationObserver, так как множество сравнений строк может теоретически замедлить страницу, если вы делаете достаточно (вероятно, несколько тысяч элементов под проверкой). На практике это было только проблемой для меня однажды из многих сотен приложений. MutationObserver теперь довольно стабилен (не существовал, когда родился WFKE) и может быть более элегантным для отслеживания изменений. –

Смежные вопросы