【问题标题】:addEventListener in content script not working内容脚本中的 addEventListener 不起作用
【发布时间】:2012-04-04 06:51:23
【问题描述】:

我有一个带有 popup.html 和注入内容脚本的 chrome 扩展。使用注入的内容脚本,我正在尝试访问 youtube 的 javascript API 函数,除了一个:addEventListener 之外,它都可以正常工作。

Youtube 的 javascript API 的事件监听器监听视频状态的变化。因此,如果到达视频的结尾,状态将变为 0。

var currentVideo = document.getElementById('movie_player');
currentVideo.addEventListener("onStateChange", "onytplayerStateChange");

function onytplayerStateChange() {
   console.log("The state of the player has changed");
}

这段代码在正常环境中运行良好,但在内容脚本中无法运行。为什么我无法在内容脚本中捕捉到不断变化的事件?有什么想法吗?

【问题讨论】:

标签: javascript google-chrome google-chrome-extension youtube-javascript-api


【解决方案1】:

内容脚本在当前页面范围内运行。事件处理程序必须通过另一个 <script> 标签注入,如以下答案所述:Building a Chrome Extension with Youtube Events:

var actualCode = 'function onytplayerStateChange() {'
               + '    console.log("The state of the player has changed");'
               + '}';

var script = document.createElement('script');
script.textContent = actualCode;
(document.head||document.documentElement).appendChild(script);
script.parentNode.removeChild(script);

PS。 DOM 可用于内容脚本,因此绑定事件处理程序确实有效。

【讨论】:

  • 绝对是一个菜鸟问题,但是如何在 actualCode 变量中插入具有不同字符的代码?我想添加一个网址(example.com),但它返回“意外字符串”。
  • @user1279300 有关更多详细信息,请参阅链接的答案,包括包含代码的更方便的方法(“方法 1”)。当您将代码直接放在脚本中时,引号、换行符和其他特殊字符必须使用反斜杠进行转义。
  • 谢谢罗伯。如果我用这些问题惹恼了你,我很抱歉,但这是另一个问题。我实际上希望事件侦听器与内容脚本的其余部分进行通信。我希望在视频末尾打开生成的 URL。因此,如果当前状态 = 0 -> 转到内容脚本中指定的 URL。有没有办法将变量动态添加到“actualCode”片段中?
  • @user1279300 在链接的答案中,我链接到另一个答案 (Chrome extension - retrieving Gmail's original message),其中显示了注入脚本和扩展程序之间通信的示例。这是从注入的代码与内容脚本进行通信所必需的。相反,Content Script > Injected script,可以通过注入另一个 <script> 元素来实现,例如调用第一个注入的 <script> 中定义的函数。
  • 注意,在 ES6 中,您可以在 actualCode 变量值上使用反引号,而不是 + concats。在 ES5 中,您可以在每行的末尾使用反斜杠。 stackoverflow.com/a/805113/105539
猜你喜欢
  • 2012-11-03
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 2013-06-10
  • 2021-04-19
  • 2013-03-16
  • 1970-01-01
相关资源
最近更新 更多