JavaScript 并不总是在 Chrome 扩展中工作,我应该什么时候运行它?

2023-12-31

我有一个 Chrome 扩展,它将 CSS 和 Javascript 注入到页面中,虽然 CSS 总是被注入,但 Javascript 仅有时起作用,其他时候则不起作用。如果不工作,我认为它在它必须处理的东西存在之前就已经运行了。

Javascript 只是简单地移动一个div在另一个之上使用insertBefore但这并不总是发生,我认为这是因为它加载的时间。

我的清单目前是:

{
  ...
  "content_scripts": [{
    "matches": [ "*://example.com/*" ],
     "js": [
        "js/jquery-1.8.3.min.js", "js/myjavascript.js"
      ],
      "run_at": "document_end",
      "css": [
        "css/mycss.css"
      ]
  }]
} 

I have run_at set to document_end目前,因为它似乎运行得更流畅(当它确实工作时),所以我认为这就是需要改变的地方。

如果有人有任何建议,我们将不胜感激。

EDIT:添加了有关此问题答案的后续问题here https://stackoverflow.com/questions/14227689/waitforkeyelements-stop-a-script-firing-on-a-popup-in-chrome-extension,我觉得如果我将其添加到这个问题中可能对其他人有用。


如果代码并不总是有效,则表明元素是由页面的 javascript 创建/加载的。因此,您需要使用标准的 AJAX 感知技术来移动该 div。

这些技术包括:计时器、突变观察者、突变事件和拦截 AJAX XHR(如果适用)。这些都在其他 Stack Overflow 问题中讨论过,但是: 突变事件已被弃用/存在错误;拦截 XHR 会变得混乱,可能不适用于此处;突变观察者可能会变得复杂。

我建议下载并添加waitForKeyElements() 实用程序 https://gist.github.com/2625891到您的清单。

然后是移动它的代码<div>仅仅变成:

waitForKeyElements (
    "jQuery selector for div(s) you want to move",
    moveSelectDivs
);
function moveSelectDivs (jNode) {
    jNode.insertBefore ("APPROPRIATE JQUERY SELECTOR");
}

将清单设置为run at document_end http://developer.chrome.com/extensions/content_scripts.html#run_at。这相当于DOMContentLoaded-- 这是什么时候$(document).ready()火灾。默认run_at开火太晚并且在不可预测的时间开火。run_at document_start不会有任何好处,因为:计时器、突变观察者等都不会在DOMContentLoaded事件——无论如何,对于当前版本的 Chrome(其他浏览器没有相同的限制)。



替代方法,动作最快但网页速度较慢:

关于:

(页面正在加载,然后您可以看到 div 移动),这是我希望避免的事情。

之前做任何事情只有两种方法DOMContentLoaded在 Chrome 中工作:

  1. 您可以设置mycss.css隐藏 div,直到您移动它。从性能角度来看,这可能是最具成本效益的方法。
  2. 或者,您可以覆盖document.createElement()。这将尽快响应新元素(假设它是之前创建的)DOMContentLoaded),但它可能会显着减慢页面的整体速度。

设置要运行的内容脚本document_start,并且必须注入覆盖代码。所以,脚本看起来像:

addJS_Node (null, null, scriptMain);

function scriptMain () {
    var _orig_createElement = document.createElement;

    document.createElement  = function (tag) {
        var element = _orig_createElement.call (document, tag);

        var movingNode      = document.querySelector ("MOVING DIV SELECTOR");
        if (movingNode) {
            var target      = document.querySelector ("TARGET DIV SELECTOR");
            if (target) {
                target.parentNode.insertBefore (movingNode, target);

                document.createElement = _orig_createElement;
            }
        }

        return element;
    };
}

function addJS_Node (text, s_URL, funcToRun) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}


不要尝试为此使用 jQuery。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 并不总是在 Chrome 扩展中工作,我应该什么时候运行它? 的相关文章

随机推荐

  • 从基于 Linux 的 C 程序打开并读取 Excel?

    我正在尝试找到一组源代码 这些源代码允许我从 C 程序中打开并读取 Linux 上的 Excel 文件的内容 如果我能找到只做这两件事的东西 我真的不想将它链接到 OpenOffice SDK carl 如果以下内容适合您 那么您可以从以下
  • 连接字符串错误(错误:40)

    我已在 Windows Server 2008 计算机上安装了 SQL Server 2012 Express 机器的名称是 THEMACHINE 安装时 我将 SQL Server 2012 设置为 默认实例 现在我像这样设置连接字符串
  • Travis.yml 因内容简约而失败?

    我有当前的travis yml在我的 Github 上 see http about travis ci org docs user languages php for more hints language php list any PH
  • 使用 :after CSS 伪元素而不插入内容

    是否可以使用 afterCSS 伪元素用于偏移对齐 而不实际插入任何内容content 除非指定内容 否则它似乎不会呈现 所以只是想知道这是否可能或者是否有任何已知的解决方法 举个例子 nav primary li level0 a aft
  • 如何将PHP变量中的NULL值插入MySQL,远离SQL注入?

    我有一个歌曲上传表单 我不会直接在 MySQL 中输入 NULL 值 例如 mysql query INSERT INTOsongs album id VALUES NULL 我会将 NULL 从 PHP 变量插入到 MySQL 并且肯定不
  • 如何从 DLL 返回实例?

    我正在编写一个DLL 我必须将 TBitmap 的实例返回到主机应用程序 DLL还有另一个UNIT 它是一个Form 它有一个TImageList用于存储图像 我编写了一个函数 想要从 TImageList 返回一个图像 从 DLL 到主机
  • 为什么我可以轻松解码 jwt.io 上的 auth0 id_token?

    好的 我正在开发一个 Angular 2 应用程序 我添加了 auth0 身份验证 但对我来说 它处理会话的方式非常不安全 jwt 令牌未加密并保存在 localStorage 中 这些声明对任何人来说都是可见的 它们可以很容易地被解码和揭
  • Silverlight 中的 SHA512 不可用,是否有可用的托管库?

    SHA512ManagedSilverlight 适用于 Windows Phone 7 CTP SDK 中缺少该功能 最多只能使用 SHA256 有谁知道我可以使用的 NET 类提供独立的 C 或 VB net SHA512 实现 我需要
  • 如何在控制台中检查 Ember.js 对象?

    有没有什么方法可以获取 Ember js 对象在 JavaScript 控制台中真正包含的内容 如果你这样做console log this 您将获得几乎所有对象几乎相同的数据结构 如下所示 这并不是很有帮助 而且它让您不知道对象上实际设置
  • 奇怪的构造函数

    好吧 我在这里会很简单 我只有一段 C 代码 我不确定我是否真的理解并且需要一些帮助 好吧 为了简单起见 我有一个定义如下的类 真正的类有点复杂 但这才是重要的 class myClass public Runnable Semaphore
  • html textArea 使用 Angular 调整大小事件

    我有一个类似行的布局 在行上 嵌入的 div 中有几个文本区域 如下所示 div class row 192 div class inner p text p div div
  • 我的 Google Compute Engine 实例上偶尔出现 Google 404

    我在 GCE 实例上托管一个网站 我将domain com 的DNS 指向我在Google Cloud 上保留的静态IP 该实例在端口 80 上运行 nginx 并将请求转发到在 8080 上运行的节点应用程序 它已经顺利运行了几个月 但今
  • 使用 Google Analytics trackPageview() 跟踪外部链接不起作用

    我已将外部链接跟踪设置为 Google Analytics 中的目标 根据 这是有问题的页面 http playmoreatthey org http playmoreatthey org 页面上的外部链接的格式如下 a href http
  • SCP说文件已下载,但文件没有出现

    我正在使用 ssh 在远程服务器上工作 但是当我尝试使用 scp 以这种格式下载文件时 scp email protected cdn cgi l email protection somefile zip Desktop 它询问我的密码
  • 如何通过Selenium打开Chrome浏览器控制台?

    我想通过按键盘按键打开 Chrome 浏览器控制台Ctrl Shift j在硒网络驱动程序中 我可以使用以下方法执行此操作Robot类 但我想要这个没有Robot班级 我已经使用了使用 sendKeys 的 Actions 类和 Keys
  • 使用 Windows 范围内的 beta UTF-8 支持功能时在 Winforms 中调整 RTF 时出现的错误

    我想我在 Windows 或 NET 中发现了一个错误 并且正在寻找解决方法 要重现该问题 请首先启用 Windows 功能 Beta 使用 Unicode UTF 8 获得全球语言支持 您可能需要重新启动机器 现在只需在Winforms
  • 从 C++ 调用 Haskell

    我正在尝试从 C 调用 Haskell 我尝试使用this https github com jarrett cpphs解释 并且已经问了一个问题SO https stackoverflow com q 42976708 5324537 然
  • 使用 sudo 运行时在 shell 脚本中获取 $USER?

    如果我使用 sudo 运行 shell 脚本 如何获得正确的 USER 我将它们作为 Mac 安装包中的安装后脚本运行 其中它们会自动进行 sudo 编辑 但我需要使用用户名执行操作 不过 HOME 是正确的 不优雅的方法是从主路径中提取名
  • 是否可以制作一个水平的 NumberPicker?

    小部件NumberPickerAndroid 中是垂直的 数字显示上方和下方有增加和减少按钮 能不能做成水平的 按钮位于号码的左侧和右侧 我一直在寻找类似的解决方案 并根据中的屏幕截图创建了一个实现这个问题 https stackoverf
  • JavaScript 并不总是在 Chrome 扩展中工作,我应该什么时候运行它?

    我有一个 Chrome 扩展 它将 CSS 和 Javascript 注入到页面中 虽然 CSS 总是被注入 但 Javascript 仅有时起作用 其他时候则不起作用 如果不工作 我认为它在它必须处理的东西存在之前就已经运行了 Javas