Jquery-如何确保它';它没有被覆盖

Jquery-如何确保它';它没有被覆盖,jquery,google-chrome-extension,race-condition,Jquery,Google Chrome Extension,Race Condition,我正在做一个Chrome扩展。我正在向页面中注入一个脚本,并注入jquery以便在脚本中可用 我添加了另一个名为Boomerang的扩展,从那时起,jquery就没有定义。到目前为止,我尝试的是: myJquery = jQuery.noConflict(); 有时有效,有时无效。如果我在控制台中检查myJquery,它有时存在,有时未定义,$或JQuery也是如此。比赛条件 jQuery.noConflict(); 在一个等待我的所有资产被注入的函数中(在我找到它们之前用一个“setInt

我正在做一个Chrome扩展。我正在向页面中注入一个脚本,并注入jquery以便在脚本中可用

我添加了另一个名为Boomerang的扩展,从那时起,jquery就没有定义。到目前为止,我尝试的是:

myJquery = jQuery.noConflict();
有时有效,有时无效。如果我在控制台中检查
myJquery
,它有时存在,有时未定义,
$
JQuery
也是如此。比赛条件

jQuery.noConflict();
在一个等待我的所有资产被注入的函数中(在我找到它们之前用一个“setInterval”来检查),其工作原理是一样的——有时是,有时不是

我有点不知所措。看来回飞棒是问题的根源,但如果它发生在这里,其他扩展也可能发生。有没有一种方法我不知道如何将我的函数定义到它们自己的名称空间或类似的地方

[编辑] 我反编译了Boomerang的代码,发现他们使用的堆栈与我完全相同:Gmail.js和Jquery。以下是他们的代码中我认为有缺陷的代码:

function h() {
    V = String(document.location);
    "undefined" === typeof window.jQuery && 0 > V.indexOf("ContactManager") ? Eb =
        setTimeout(h, 500) : (a = ia = window.jQuery.noConflict(!0), window.b4g.$ = a, setTimeout(Lc, 0), setTimeout(z, 0))
}

我真的不明白这个
窗口.jQuery.noConflict(!0)
的意思,但它看起来不太好…

所以,我解决了它。这就是我所做的。我延迟了jQuery及其依赖项的注入,只注入了主脚本。通过递归setTimeout,我能够从注入的脚本本身注入jQuery,方法是使用自定义事件
document.dispatchEvent(new CustomEvent(“eventName”),调用centent_脚本文件
。当content_脚本捕获到这一点时,它会将jQuery注入页面,并发送另一个自定义事件,我用它来触发主函数,使用jQuery将需要插入的所有内容插入dom

编辑jquery.js并将其默认变量名更改为绝对唯一的名称。似乎问题是由那些不考虑无冲突jquery名称的插件引起的。您也可以编辑插件。假设您正在将jQuery注入
脚本
DOM元素到页面中,请尝试在内容脚本中使用
的“run\u at”:“document\u start”
否,我的观点是,当前您正在从一个在“document\u end”或“document\u idle”运行的内容脚本中注入代码,所以请尝试在“document\u start”执行此操作,请参阅内容脚本文档。好的,这是我不必亲自尝试扩展就能做到的。