Javascript 如何在不使用eval()或requireJS的情况下检测插件或脚本是否已加载?

Javascript 如何在不使用eval()或requireJS的情况下检测插件或脚本是否已加载?,javascript,jquery,ajax,eval,instance,Javascript,Jquery,Ajax,Eval,Instance,我正在开发一个插件,它允许将第三方代码注入页面(作为iframe或直接注入DOM) 我的问题是“直接注入”,因为我需要确保,如果在我的主页以及我正在加载和注入的页面中需要,我不会添加任何额外的时间 例如(我不能使用requireJS),我的page.html如下所示: <html> <head> <script type="text/js" src="jquery.js"></script> // exports window.$

我正在开发一个插件,它允许将第三方代码注入页面(作为
iframe
或直接注入DOM)

我的问题是“直接注入”,因为我需要确保,如果在我的主页以及我正在加载和注入的页面中需要,我不会添加任何额外的时间

例如(我不能使用requireJS),我的
page.html
如下所示:

<html>
  <head>
   <script type="text/js" src="jquery.js"></script> // exports window.$
   <script type="text/js" src="foo.js"></script>    // exports window.foo 
  </head>
  <body>
    <!-- things that make foo load anotherPage.html and append its content here -->
  </body>
 </html>
页面加载是通过Ajax完成的,当我处理请求另一个页面
返回的
数据时,
html
完成后,我会得到一个包含所有元素的列表:

    cleanedString = ajaxResponseData
        .replace(priv.removeJSComments, "")
        .replace(priv.removeHTMLComments,"")
        .replace(priv.removeLineBreaks, "")
        .replace(priv.removeWhiteSpace, " ")
        .replace(priv.removeWhiteSpaceBetweenElements, "><");
    // this will return a list with head and body elements
    // e.g. [meta, title, link, p, div, script.foo]
    content = $.parseHTML(cleanedString, true);
    // insert into DOM
    someTarget.append(content);
cleanedString=ajaxResponseData
.replace(priv.removeJSComments,“”)
.替换(priv.removeHTMLComments,“”)
.替换(priv.removeLineBreaks,“”)
.replace(priv.removeWhiteSpace,“”)

.replace(priv.removeWhiteSpaceBetweenElements),“>这是我的自封闭模块模式的一个示例,我称之为“哨兵”:


sentinel模式可以在任何地方(内部或外部)工作,不关心脚本加载顺序,并且可以与任何脚本加载库一起工作。您可以以相同的方式在jQuery分支下面列出其他依赖项,只需将贪婪的代码放在sentinel包装函数的底部。

if(self.$&&self.foo){do stuff;}嗯。听起来太简单了。让我试试。你甚至可以让它等待:(函数wait(){if(!self.$){return setTimeout(wait,100);};do Stuff()}());但是如果我不知道
foo
的名字怎么办?在requireJs中,我会知道我的模块
foo.js
导出
foo
,所以当模块被重新请求时,它不会再次加载。我的模式不会双重加载那里的东西。本质上,它是requireJs等人所做的分解和简化版本,而你可以对其进行修改,使其更适合您的需要;如果有can.re:cmt,我很乐意伸出援助之手。是的,您需要从每个脚本文件中使用冒烟枪。因为您暗示每个脚本都提供了依赖项,所以您应该能够从页面中访问/嗅探该依赖项。最坏的情况是,您可以将冒烟枪附加到自定义脚本文件中以供se使用mi不可见的脚本,如多边形填充。
    cleanedString = ajaxResponseData
        .replace(priv.removeJSComments, "")
        .replace(priv.removeHTMLComments,"")
        .replace(priv.removeLineBreaks, "")
        .replace(priv.removeWhiteSpace, " ")
        .replace(priv.removeWhiteSpaceBetweenElements, "><");
    // this will return a list with head and body elements
    // e.g. [meta, title, link, p, div, script.foo]
    content = $.parseHTML(cleanedString, true);
    // insert into DOM
    someTarget.append(content);
 (function wait(){ 

   if(!self.$){
       if(!wait.waitingJQ){
             wait.waitingJQ=true;
             addScriptTag(JQUERY_URL); 
       }
       return setTimeout(wait, 44);
   } 

   doStuffThatNeedsJquery();

 }());