Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
音频赢得';不要使用JavaScript静音-需要使用mutationobserver删除音频标记_Javascript_Html5 Audio_Mutation Observers - Fatal编程技术网

音频赢得';不要使用JavaScript静音-需要使用mutationobserver删除音频标记

音频赢得';不要使用JavaScript静音-需要使用mutationobserver删除音频标记,javascript,html5-audio,mutation-observers,Javascript,Html5 Audio,Mutation Observers,我尝试使用以下用户脚本从某个网站删除所有音频: // ==UserScript== // @name addicto // @namespace nms // @include http://* // @include https://* // @version 1 // @grant none // ==/UserScript== addEventListener('DOMContentLoaded', ()=>{ let si

我尝试使用以下用户脚本从某个网站删除所有音频:

// ==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.
});
/==UserScript==
//@name addicto
//@名称空间nms
//@包括http://*
//@包括https://*
//@version 1
//@grant none
//==/UserScript==
addEventListener('DOMContentLoaded',()=>{
let sites=['mako.co.il'];
让href=window.location.href;
for(设i=0;i{
audio.muted=true;
});
}
}
//如果href在“sites”数组中包含迭代的值,则执行一些操作。
});
这段代码不起作用,我认为观察所有随机出现的
audio
标记并改变DOM正是我需要更好地处理这一问题的原因

这个突变观察者怎么写?我从来没有写过突变观察者,我觉得这个例子非常简短,非常基本,正是我所需要的,来体验我刚才描述的逻辑的代码上下文,我非常感谢任何试图向我和其他有类似问题的人展示它的人。

  • 枚举
    突变
    和每个突变的
    附加节点
  • 枚举节点的子元素,因为在页面加载期间使用超高速getElementsByTagName而不是超流querySelectorAll合并了突变
  • 不要使用在页面上下文中运行用户脚本的
    @grant none
    ,除非您确实需要直接访问页面的JavaScript对象
  • 使用
    @run at document start
    在页面加载期间静音音频

  • 枚举
    突变
    和每个突变的
    附加节点
  • 枚举节点的子元素,因为在页面加载期间使用超高速getElementsByTagName而不是超流querySelectorAll合并了突变
  • 不要使用在页面上下文中运行用户脚本的
    @grant none
    ,除非您确实需要直接访问页面的JavaScript对象
  • 使用
    @run at document start
    在页面加载期间静音音频


这可能不是问题,但请注意,您的脚本不会使所有可能通过选项卡传播的声音源静音,只会使作为HTMLAudioElement追加到DOM中的声音源静音。它将丢失所有不在DOM中的HTMLAudioElements、所有视频元素、所有音频上下文,以及附加到DOM的所有上述+元素(如果在iframe中)。如果一个真正的扩展是一个选项,那么使用
update(tabId,{muted:true})
method可能不会有问题,但是请注意,脚本不会使所有可能由选项卡传播的声音源静音,只会将作为HTMLAudioElement附加在DOM中的声音源静音。它将丢失所有不在DOM中的HTMLAudioElements、所有视频元素、所有音频上下文,以及附加到DOM的所有上述+元素(如果在iframe中)。如果一个真正的扩展是一个选项,那么它可能更容易与
update(tabId,{mute:true})
method一起使用,这对我来说非常有趣,在实现之前,我将至少阅读两三次。我有两个问题。为什么
(node.children和&node.children[0])
?我的意思是,如果在第一部分(
node.children
)中,您选择了所有的子项,为什么要在后面标记第一个子项(0)?另外,关于
/@run at document start
?在我写的20个剧本中,我从来没有用过它。我知道这是默认行为,但也许我错了。文本节点没有
子节点
,因此第一次检查跳过它们,
子节点[0]
表示“至少有一个元素子节点”2<代码>文档开始表示脚本处理仍在加载的页面。对不起,文本节点?你的意思是
textContent
?我发誓我错过了这里的意思。textContent是一个方便的实际访问器。对我来说读起来非常有趣,在实现之前,我至少还要读两三遍。我有两个问题。为什么
(node.children和&node.children[0])
?我的意思是,如果在第一部分(
node.children
)中,您选择了所有的子项,为什么要在后面标记第一个子项(0)?另外,关于
/@run at document start
?在我写的20个剧本中,我从来没有用过它。我知道这是默认行为,但也许我错了。文本节点没有
子节点
,因此第一次检查跳过它们,
子节点[0]
表示“至少有一个元素子节点”2<代码>文档开始表示脚本处理仍在加载的页面。对不起,文本节点?你的意思是
textContent
?我发誓我错过了这里的意思。textContent是一个方便的实际访问器。
// ==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.firstElementChild) {
          for (const child of node.getElementsByTagName('audio')) {
            audio.muted = true;
          }
        }
      }
    }
  }).observe(document, {subtree: true, childList: true});
}