2017-10-20 4 views
0

Ich habe versucht, die folgende userscript zu verwenden, um alle Audiodaten von einer bestimmten Website zu entfernen:Audio wird nicht mit JavaScript stumm geschaltet werden - Audio-Tags mit mutationobserver zu entfernen brauchte

// ==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. 
}); 

Dieser Code hat nicht funktioniert und ich nehme an Das Beobachten aller audio Tags, die zufällig kommen und das DOM mutieren, ist genau das, was ich besser bewältigen muss.

Wie kann dieser Mutationsbeobachter geschrieben werden? Ich habe noch nie einen Mutationsbeobachter geschrieben, und ich habe das Gefühl, dass dieses Beispiel sehr kurz und sehr grundlegend wäre und genau das, was ich brauche, um den Code-Kontext der Logik, die ich gerade beschrieben habe, zu würdigen versuche es mir und anderen Leuten zu zeigen, die ein ähnliches Problem haben.

+0

Könnte nicht ein Problem sein, aber beachten Sie, dass Ihr Skript nicht alle möglichen Quellen von Tönen stumm schalten, die durch eine Registerkarte gestreut werden könnte, nur diejenigen, die im Inneren des DOM als HTMLAudioElement angehängt werden. Es werden alle HTMLAudioElements, die nicht im DOM enthalten sind, alle Videoelemente, alle AudioContexte und alle oben genannten +, die an DOM angehängt sind, wenn sie sich in einem Iframe befinden, vermisst. Wenn eine echte Erweiterung eine Option ist, dann könnte es einfacher sein, [chrome.tabs API] (https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/update) mit dem zu verwenden 'update (tabId, {muted: true})' Methode – Kaiido

Antwort

2
  • Aufzählen mutations und die Elemente jeder Kind addedNodes
  • Aufzählen Knotens der Mutation, da Mutationen während des Ladens der Seite mit dem superschnellen getElementsByTagName anstelle der Superslow querySelectorAll
  • nicht @grant none verschmolzen sind, verwenden Sie das laufen Ihren userscript in der Seitenkontext, es sei denn, Sie benötigen direkten Zugriff auf die JavaScript-Objekte der Seite
  • Verwenden Sie @run-at document-start, um die Audiodaten beim Laden der Seite stumm zu schalten

// ==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

Sehr interessant für mich zu lesen und ich werde es mindestens 2 oder 3 weitere Male vor der Implementierung lesen. Ich habe 2 Fragen bitte. Warum ist '(node.children && node.children [0])'? Ich meine, wenn du in der ersten Portion ("node.children") auf alle Kinder gehst, warum markierst du dann die erste (0) gleich danach? – fayalikt

+0

Auch bezüglich '// @ run-at document-start' ist es ein Muss? Ich habe es nie in einem der 20 Skripte, die ich geschrieben habe, benutzt. Ich verstehe, dass es sowieso das Standardverhalten ist, aber vielleicht liege ich falsch. – fayalikt

+0

1. Textknoten haben keine "Kinder", so dass die ersten Überprüfungen sie überspringen, "Kinder [0]" bedeutet "mindestens ein Element Kind" 2. 'Dokument-Start' bedeutet, dass das Skript die Seite so verarbeitet, wie sie noch ist geladen. – wOxxOm

Verwandte Themen