Выполнить код после завершения функции ИЛИ появится DIV - PullRequest
2 голосов
/ 20 июня 2010

Я написал UserScript для Facebook, и он группирует похожие уведомления вместе. Теперь, используя только статическую HTML-страницу со старыми уведомлениями, сценарий работает на 100%.

Вот проблема: DIV, который по умолчанию хранит уведомления, не имеет уведомлений, пока пользователь не нажмет на кнопку Уведомления. Facebook имеет встроенное событие onclick, которое отображает DIV (меню уведомлений) и использует AJAX для получения уведомлений. Поскольку мой пользовательский скрипт запускается только при запуске, он там ничего не находит - он не влияет на страницу. Я пытался использовать событие .click (), но когда вы нажимаете кнопку «Уведомления», запускается мой код. Дело в том, что Facebook все еще выполняет свой AJAX-запрос на уведомления, что означает, что для моего скрипта все еще нет уведомлений, с которыми он не может работать, поэтому он не действует

Я не хочу использовать универсальный setTimeout, потому что я не хочу, чтобы пользователь видел уведомления раньше, а затем внезапно увидел их после. Есть ли способ контролировать DIV, чтобы после добавления уведомлений он работал? Или что после того, как Facebook выполнит запрос AJAX, он выполнит мой код?

Ответы [ 3 ]

1 голос
/ 20 июня 2010

Вы можете setInterval() следить за внутренним HTML-кодом div, после заполнения вы можете запустить.

0 голосов
/ 23 июня 2010

Вот проблема: DIV, в котором по умолчанию хранятся уведомления, не имеет уведомлений, пока пользователь не нажмет на кнопку Уведомления.У Facebook есть встроенное событие onclick, которое отображает DIV (меню уведомлений) и использует AJAX для получения уведомлений.

...

Я не хочу использоватьуниверсальный setTimeout, потому что я не хочу, чтобы пользователь видел уведомления до, а затем внезапно увидел их после.Есть ли способ контролировать DIV, чтобы после добавления уведомлений он запускался?

Да, есть:

var notificationDiv = document.getElementById(...);
var lastTimeoutID = null;
var main = function(evt){
  // evt.target is the inserted element
  // if you expect more elements, then do the following:
  lastTimeoutID = setTimeout(function(){
    lastTimeoutID = null;
    // uncomment below block if you only need to do the work once.
    /*
    notificationDiv.removeEventListener("DOMNodeInserted", main, false);
    */

    // do your work here.
  }, 500); // waiting 500ms for next element to be added, otherwise doing work.
  if (lastTimeoutID) {
    clearTimeout(lastTimeoutID);
    lastTimeoutID = null;
  }
};
notificationDiv.addEventListener("DOMNodeInserted", main, false);

Весь приведенный выше код тайм-аута может быть удален в зависимости отна то, что вы делаете, пользовательский скрипт.

0 голосов
/ 20 июня 2010

Может быть, вы можете добавить цикл setTimeout. Что-то вроде

setTimeout(function(){
/* check for divs */

if(/* divs are found */){
//apply code
}
else {
setTimeout(/* loop again */);
}

},1000);
...