2016-06-28 8 views
2

私が正常に作業しているユーザースクリプトは、最初に読み込まれたGitHubページで動作します。 GitHubがPJAXでナビゲートされているときは、再適用する必要があります。github.comのリスニングGreasemonkeyユーザースクリプトのPJAXイベント

だから私は何とかPJAXの変更のためのリスナーを設定し、initialize関数を再度実行する必要があります。

のGreasemonkey/Firefoxのセキュリティポリシーのために、それは私がunsafeWindow.require('jquery')ajaxCompleteイベントにページのスクリプトやフックを検討しようとしましたが、リスナーがありませんでした

Error: Permission denied to access object

がスローされますので、unsafeWindow.history.pushStateにパッチを適用すると、動作しません。 (同じセキュリティポリシーが原因である可能性がありますが、エラーコンソールは空でした)。

PJAXコンテナエレメントにMutationObserver/DOMSubtreeModifiedよりも優れたソリューションがありますか?

このスクリプトはFirefox/Greasemonkeyを対象にしていますが、Chrome/Tampermonkeyで実行可能であれば、これは問題ありません。文書上のイベント:

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

FWIWバニラJSでの作業example

+0

'' pjax:end "'イベントのリスナーを 'document'に追加します。また、[pjaxでgithubスタイルのページ遷移を作成する方法](http://stackoverflow.com/q/8013818)の複製のように見えます。あなたが見ることができるように、サイトスクリプトが動的コンテナを上書きするため、MutationObserverも使用されています*時には* 。 – wOxxOm

+0

@wOxxOmよかった、ありがとう! '$(document).on( 'pjax:end'、...)'は '@ require'で得られたjQueryのコピーで動作します。これを回答として投稿してください。 – estus

答えて

2

は "終わりpjax" のリスナーを追加します。あなたが見ることができるように、サイトスクリプトがダイナミックコンテナ(時には)を2回更新するので、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

もう一度ありがとうございます。私は、MutationObserver/DOMSubtreeModifiedハンドラで0〜10の遅延でデバウンスを使用していましたが、それは良いことでした。しかし、私の現在のスクリプトでは 'pjax:end'だけで十分です。 – estus

関連する問題