2016-06-28 5 views
2

Пользовательский скрипт, над которым я работаю, успешно работает на первоначально загруженной странице GitHub. Хотя он должен быть повторно применен, когда GitHub перемещается с помощью PJAX.Прослушивание github.com События PJAX в скрипте пользователя Greasemonkey

Так что мне нужно как-то настроить прослушиватель для PJAX и запустить функцию initialize.

Заделка unsafeWindow.history.pushState не будет работать из-за политики безопасности Greasemonkey/Firefox, он будет бросать

Error: Permission denied to access object

Я пытался изучить сценарии страниц и крюк в ajaxComplete случае unsafeWindow.require('jquery'), но слушатель не был (возможно, из-за той же политики безопасности, но консоль ошибок пуста).

Есть ли лучшее решение, чем MutationObserver/DOMSubtreeModified на элемент контейнера PJAX?

Сценарий предназначен для Firefox/Greasemonkey, но если он будет работоспособен для Chrome/Tampermonkey, это не повредит.

+0

Добавить прослушиватель для '' pjax: end "' event on 'document'. Также выглядит как дубликат [Как сделать переходы страницы стиля github pjax] (http://stackoverflow.com/q/8013818). FWIW работает [пример] (https://greasyfork.org/en/scripts/5982-github-images-as-icons) - как вы видите, MutationObserver также используется, потому что скрипт сайта перезаписывает динамический контейнер * иногда * , – wOxxOm

+0

@wOxxOm Хорошо, спасибо большое! '$ (document) .on ('pjax: end', ...)' работает с копией jQuery, полученной с помощью '@ require'. Не стесняйтесь публиковать это как ответ. – estus

ответ

2

Добавить прослушиватель "pjax: конец" событие на документ:

$(document).on('pjax:end', ...) 

FWIW рабочий example в ванили JS. Как вы видите, MutationObserver также используется, потому что скрипт сайта обновляет динамический контейнер иногда дважды (полностью отбрасывая первый), поэтому после завершения обработчика pjax: end обработчик MutationObserver подключается для обнаружения удаления файла обертка, и в этом случае обработка повторяется:

document.addEventListener('pjax:end', pageChangedHandler); 

function pageChangedHandler() { 

    ....................... 

    var ovr = document.querySelector('include-fragment.file-wrap'); 
    if (ovr) { 
     new MutationObserver(function(mutations) { 
      mutations.forEach(m => { 
       var removed = m.removedNodes[0]; 
       if (removed && removed.matches('.file-wrap')) { 
        this.disconnect(); 
        pageChangedHandler(); 
       } 
      }); 
     }).observe(ovr.parentNode, {childList:true}); 
    } 
} 
+0

Еще раз спасибо. Раньше я использовал debounce с задержкой 0-10 для обработчиков MutationObserver/DOMSubtreeModified, это было хорошо. Но в моем текущем скрипте достаточно «pjax: end». – estus