2010-06-20 3 views
2

Я написали Афиша для Facebook и вместе группируют подобные уведомления. Теперь, используя только статическую HTML-страницу со старыми уведомлениями, я работал, скрипт работает на 100%.Код запуска после завершения функции ИЛИ DIV Появляется

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

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

+0

Я сам не изучил код, поэтому я не готов представить ответ, но я бы порекомендовал посмотреть, можете ли вы выяснить, где появляется объект XML HTTP Request (AJAX), и переопределять .onreadystatechange функция обратного вызова. Очевидно, что вы должны сохранить существующую функциональность через 'xmlobj.onreadystatechange = function() {onreadystatechange(); your_new_functionality();} 'Очевидно, что это будет бесконечно сложнее, потому что код Facebook, вероятно, будет запутан/сжат, но некоторая js-отладка локтя-консистентной смазки должна быть способна уговорить объект xml. –

+1

@Steven - это будет тесно связать решение с текущей реализацией Facebook. Любые изменения на их стороне повлияют на приложение. 'setInterval' кажется более разумным, до [DOM Mutation events] (http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events -eventgroupings-mutationevents) становятся обычным явлением. Кроме того, см. Http://stackoverflow.com/questions/1091661/detect-div-content-changes-with-jquery – Anurag

ответ

1

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

+0

Ради производительности я собираюсь установить setInterval, который начинается с нажатия кнопки Уведомления и выполняет проверку каждые 0,5 сек. Как и когда я могу это закончить? – NessDan

+0

Вы можете использовать 'clearInterval()'. – Babiker

+0

Спасибо, я закончил с помощью setInterval() и вызвал все JS, чтобы изменить уведомления (я также использовал CSS, чтобы скрыть уведомления по умолчанию.) Все получилось лучше, чем ожидалось :) – NessDan

-1

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

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

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

},1000); 
+0

Я вижу вашу точку зрения, но если по какой-то причине Facebook киосков, то я могу пропустить этот момент. Если Facebook загружается довольно быстро, я не хочу, чтобы мой скрипт должен был спуститься вниз по пользователю и заставить его ждать.Спасибо хоть! – NessDan

0

Вот проблема: 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); 

Весь код таймаута выше может быть съемными в зависимости от того, что это вы userscript делает.

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

  • Нет связанных вопросов^_^