【问题标题】:Can't trigger click with jQuery in a Chrome extension无法在 Chrome 扩展程序中使用 jQuery 触发点击
【发布时间】:2015-04-08 12:43:33
【问题描述】:

我正在尝试使用一行 jQuery 代码制作 Chrome 扩展,但它不起作用。我正在尝试触发对元素的点击。

chrome的控制台根本没有显示任何错误, 当我只将 jQuery 代码放在控制台中时,它工作正常。

我的代码:

content.js

$(document).ready(function() {
  $('.like_post:contains(Like)').click();
});

background.js

chrome.windows.getCurrent( function(currentWindow) {
  chrome.tabs.query({active: true, windowId: currentWindow.id}, function(activeTabs){
    chrome.tabs.executeScript(
      activeTabs[0].id, {file: 'jquery-2.1.3.min.js', allFrames: true}
    );
    chrome.tabs.executeScript(
      activeTabs[0].id, {file: 'content.js', allFrames: true}
    );
  });
  console.log(currentWindow.id);
});

ma​​nifest.json

{
  "name": "plugin name",
  "version": "0",
  "description": "What do I do as an extension",

  "manifest_version": 2,
  "browser_action": {
    "name": "project with jquery",
    "icons": ["icon.png"],
    "default_icon": "icon.png"
  },
  "content_scripts": [ {
    "js": [ "jquery-2.1.3.min.js", "background.js", "content.js" ],

    "matches": [ "http://*/*", "https://*/*"]
  }]
}

我还下载了jquery-2.1.3.min.js 文件并将其放在扩展文件夹中。

谁能解释为什么它不起作用???

【问题讨论】:

  • 我认为您对 Chrome 扩展以及 Javascript/jQuery 也不太了解。首先你想点击什么?没有 <SOMETHING> 元素,它不存在,所以 jQuery 选择器无法选择它。另外,您为什么将您的脚本称为background.js 并将其用作内容脚本?是不是有点混乱?或者你的意思是在后台使用它?目前还不清楚您要做什么。
  • 您的 jquery 代码似乎不完整且错误。这是实际代码吗。
  • 某事是我试图点击的东西,在这种情况下它只是一个按钮的类。它无关紧要,因为正如我在帖子中所说,当我将 jquery 代码放在控制台中时它可以工作。所以你建议我用这段代码制作一个 background.js chrome.browserAction.onClicked.addListener(function(tab) { chrome.tabs.executeScript(tab.id, { allFrames: true, file: "content_script.js" },函数() { if (chrome.runtime.lastError) { console.error(chrome.runtime.lastError.message); } }); });和一个带有 jquery 代码的 content_script.js?
  • @roshan 正如我所说,当我将这行代码放入控制台并按回车时,它工作正常。
  • 你真的让你的代码变得更糟了。我会解释根本问题,但你以前的版本更正确。

标签: javascript jquery google-chrome google-chrome-extension


【解决方案1】:

问题的根本原因是扩展内容脚本在isolated world 中执行。这样做的原因之一是您的代码不会与页面的代码冲突:例如,您可以使用不同版本的 jQuery。

因此,您的内容脚本拥有自己的 jQuery 副本。 jQuery 的.click() 的工作方式是维护一个由点击触发的事件处理程序列表。

..你可能已经看到了问题。内容脚本的 jQuery 副本不知道页面的处理程序副本列表,以及cannot trigger them

顺便说一句,这解释了为什么当你把它放在控制台时它会起作用 - 默认情况下,console executes in the page's context 并触发页面的 jQuery 副本。

有一些方法可以解决这个问题,但最简单的方法是发出一个 proper DOM 事件,该事件将被页面代码捕获。示例见this question

【讨论】:

  • 好的,我想我知道问题所在,但我有一个问题,但如果你 link [/link] 答案几乎就是我想要做的,虽然我复制粘贴了他的代码等等,它也没有工作。
  • 那你就没有问题了。链接上的答案用 jQuery 修改了一些东西;您尝试触发应由页面处理的事件。它不会那么容易工作。
  • 啊...好的...所以我必须修改代码。看看真正的jquery代码是code $(document).ready(function(){ $('.like_post:contains(Like)').click();}); code 有什么可以帮我修改的吗?
  • 我可以提供帮助,但如果您放慢速度,自己阅读和思考会更好。首先浏览我的答案中的所有链接。
  • 我如何通过电子邮件与您联系?我的电子邮件是 kwstasna@hotmail.com,如果你能把你的发给我,我可以告诉你它是关于什么的。你就会明白为什么我卡在了 javascript 代码中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 2023-03-10
  • 2012-10-30
  • 2014-09-25
相关资源
最近更新 更多