2017-10-20 9 views
0

を必要と私は特定のウェブサイトからすべてのオーディオを削除するには、次のuserscriptを使用しようとしました:オーディオではJavaScriptをミュートされることはありません - mutationobserverとオーディオタグを削除が

// ==UserScript== 
// @name  addicto 
// @namespace nms 
// @include  http://* 
// @include  https://* 
// @version  1 
// @grant  none 
// ==/UserScript== 

addEventListener('DOMContentLoaded',()=>{ 
    let sites = ['mako.co.il']; 
    let href = window.location.href; 
    for (let i = 0; i < sites.length; i++) { 
    if (href.includes(sites[i])) { 
     Array.prototype.slice.call(document.querySelectorAll('audio')).forEach((audio)=>{ 
     audio.muted = true; 
     }); 
    } 
    } 

    // If href includes the value of the iteration on the "sites" array, do stuff. 
}); 

このコードは動作しませんでしたし、私は仮定しますすべてのaudioタグがランダムに入ってきてDOMを突然変異させているのが私がこれにうまく対処するために必要なものであることを確認してください。

どのようにこの突然変異観察者を書き込むことができますか?私は変異観察者を書いたことは一度もありませんし、この例が非常に短くて基本的であり、私が今説明した論理のコードコンテクストを味わう必要があるかのように感じます。それと同じ問題を抱えている他の人や私にそれを見せてください。

+0

が問題になることが、あなたのスクリプトがタブによって拡散させることができた音、HTMLAudioElementとしてDOM内で追加されるだけのもののすべての可能なソースをミュートしないことに注意していない可能性があります。 DOM内にないHTMLAudioElements、すべてのビデオ要素、すべてのAudioContext、iframe内にある場合は上記のすべてがDOMに追加されます。実際の拡張機能がオプションである場合、[chrome.tabs API](https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/update)を'update(tabId、{muted:true})'メソッド – Kaiido

答えて

2
  • 列挙mutationsと各変異のaddedNodes
  • 列挙ノードの子要素の突然変異がであなたのuserscriptを実行@grant noneを、使用しないでください超高速getElementsByTagNameの代わりにsuperslow querySelectorAll
  • を使用して、ページの読み込み中に合体されているので、ページのJavaScriptオブジェクトに直接アクセスする必要がある場合を除き、ページコンテキストでは
  • を使用して、ページ読み込み中に音声をミュートします。

// ==UserScript== 
// @name  addicto 
// @include * 
// @run-at document-start 
// ==/UserScript== 

const sites = ['mako.co.il']; 
if (sites.some(site => location.hostname.includes(site))) { 
    new MutationObserver(mutations => { 
    for (const m of mutations) { 
     for (const node of m.addedNodes) { 
     if (node.localName == 'audio') { 
      audio.muted = true; 
     } else if (node.children && node.children[0]) { 
      for (const child of node.getElementsByTagName('audio')) { 
      audio.muted = true; 
      } 
     } 
     } 
    } 
    }).observe(document, {subtree: true, childList: true}); 
} 
+0

私が読むのはとても面白いですし、実装する前に少なくとも2〜3回はそれを読むつもりです。私は2つの質問をお願いします。 '(node.children && node.children [0])はなぜですか?私は最初の部分( 'node.children')ですべての子どもたちを見ると、なぜすぐに最初の部分(0)をマークするのですか? – fayalikt

+0

また、 '// @ run-at document-start'は必須ですか?私が書いた20のスクリプトのどれでもそれを使用したことはありません。私はそれがとにかくデフォルトの動作であることを理解しますが、多分私は間違っています。 – fayalikt

+0

1.テキストノードには 'children'がありませんので、最初のチェックでスキップします。' children [0] 'は"少なくとも1つの要素の子 "を意味します2.' document-start'はスクリプトがページをまだ処理していることを意味しますロードされる。 – wOxxOm

関連する問題