【问题标题】:jQuery mouseenter is fired up multiple times?jQuery mouseenter 多次启动?
【发布时间】:2017-11-23 15:40:19
【问题描述】:

我正在测试 youtube 的 chrome 扩展,但我遇到了一个问题,即 mouseenter 被多次启动。

这是我在缩略图上的简单鼠标输入:

$( "body" ).on('mouseenter', '#thumbnail', function() {
    console.log('click');
});

现在,一旦页面加载并且我将鼠标悬停在任何缩略图上,它只会被触发一次,并且每次操作都会在控制台内显示一次点击文本。

当我浏览到不同的 youtube 部分时,问题就开始了,比如说 - 趋势。现在,如果我再次将鼠标悬停在趋势页面中的缩略图上,则单击文本将在控制台中每个单个操作出现 3 次。如果我再次浏览回主页,每次悬停操作时,它的输出会增加一倍或三倍。

我尝试过 .off 方法,但没有任何区别。问题可能出在哪里?

这是我将 jquery 和函数 js 加载到网站的 js:

chrome.tabs.onUpdated.addListener(function (tabId , info) {
  if (info.status === 'complete') {
    chrome.tabs.executeScript({
        file: 'jquery-3.2.1.min.js'
    });
    chrome.tabs.executeScript({
        file: 'payload.js'
    });
  }
});

会不会是每次youtube网站在里面加载不同的页面时都会加载executeScript?

【问题讨论】:

  • edit 成为主题的问题:包括一个重复问题的minimal reproducible example。对于 Chrome 扩展程序或 Firefox WebExtensions,这几乎总是意味着包含您的 manifest.json 和一些背景、内容和/或弹出脚本/HTML。寻求调试帮助的问题(“为什么这段代码没有按我想要的方式工作?”)必须包括:(1)期望的行为,(2)特定的问题或错误以及(3)重现它所需的最短代码在问题本身中。另请参阅:What topics can I ask about here?How to Ask
  • 一种简单的方法来测试您的 payload.js 是否在同一上下文中多次加载,就是在开头添加一个无条件的 console.log()脚本。

标签: jquery google-chrome-extension youtube


【解决方案1】:

仅当页面内容动态更改时,您才需要 .off。如果更改的内容具有您限定的相同元素(例如相同的 id) - 取决于您的 onContentChange 事件 - 该内容上有两个不同的 .on 事件。因此,例如当您动态更改内容时,您必须在更改内容之前运行 .off。否则你会遇到问题。 一个典型的问题是当您使用 ajax 加载内容并分配一些 .on 事件但从未运行 .off 时。

对于您的问题,您是否尝试过在 addListener 中使用简单的 console.log 来检查您是否多次执行脚本?

【讨论】:

  • 是的,刚刚测试..这就是问题所在.. 'chrome.tabs.onUpdated.addListener' 将在 youtube 网站上的每个标签更改加载两次,这将堆积听众..
  • 我不知道你想要实现什么,但也许它有助于定义一个像 isInit = true/false 这样的全局变量并在每个 addListeneder 上对此进行测试以防止多次加载
  • 好吧,我想摆脱这个问题,因为这多个听众会给我带来各种问题。全局变量不会有任何区别,因为它不知道页面何时刷新以及何时只是一个 ajax 请求?我认为这是一个标记为已修复的 chrome 错误。还是找不到解决办法
  • 只需添加对 info.url 的检查 - 每次更新仅发生一次。
【解决方案2】:

好的,看来问题出在我的清单上。我多次更改了清单,但这次由于某种原因有效。

我删除了 payload.js 中的 executeScript 函数并从清单中加载了内容脚本:

 "content_scripts": [
    {
      "matches": ["http://*/*", "https://*/*"],
      "js": ["jquery-3.2.1.min.js","payload.js"]
    }
  ],

现在它就像一个魅力..

【讨论】:

  • 您没有在问题中包含您的 manifest.json。因此,任何人都无法知道这实际上回答了这个问题。我们必须通灵才能知道这就是答案。
  • 那是因为我很确定它不是导致问题的清单,因此我没有包含它。这个解决方案解决了我的问题,所以它会被标记为接受的答案
  • 我并不是说你的答案是错误的。我是说您的问题很糟糕,因为它不包含minimal reproducible example。另外也没有说明为什么要使用tabs.executeScript()来注入而不是manifest.json content_scripts入口,这样我们就可以确定使用content_scripts入口甚至是可能的您的问题的解决方案。这些中的每一个都独立地使您的答案变得糟糕,因为它依赖于问题中未包含的信息。虽然,诚然,我们当然可以很有把握地猜测问题是什么,但我们不需要猜测。
  • 明确地说:我对你的问题和答案都投了反对票,并投票结束你的问题,因为缺少minimal reproducible example(见#1 in the on-topic page)。如果您将 manifest.json 放在问题中并描述为什么选择使用 tabs.executeScript() 而不是 content_scripts 条目(即,我们可以理解使用 content_scripts 条目是可以接受的可能性),然后我将删除我的反对票并撤回我的近距离投票。如果您这样做了,请在此处的评论或您的问题中加入 @Makyen 联系我。
  • 冷静,我已经回答了我自己的问题,如果它让你感觉更好,你可以关闭它。我问了我的做法,因为我在 chrome 扩展开发方面的经验为 0,因此我不知道需要包含哪些文件。我总是尽量包含基本信息,这样它会提出一个简短的问题,更容易阅读或理解。
猜你喜欢
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
相关资源
最近更新 更多