代码之家  ›  专栏  ›  技术社区  ›  Russ Bradberry

动态编写脚本时无法访问javascript函数

  •  2
  • Russ Bradberry  · 技术社区  · 14 年前

    所以我有一个外部javascript文件,我们称之为 something.js 我记录下来,写下来。出于某种原因,我无法访问safari或firefox中的函数。

    有点像这样:

    <script type="text/javascript">
        document.write(decodeURI("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E"));
        myFunction();
    </script>
    

    所以这告诉我myfunction是空的,但是如果我把相同的函数调用放在something.js的末尾,它就会工作。现在这不是确切的情况,所以我知道对于这个特殊的情况,这不是最好的方法。

    7 回复  |  直到 14 年前
        1
  •  3
  •   Cheeso    14 年前

    我是这样做的:

    <script type="text/javascript" language='javascript'>
      document.write('<script type="text/javascript" id="contentloadtag" defer="defer" src="something.js"><\/script>');
      var contentloadtag=document.getElementById("contentloadtag");
      contentloadtag.onreadystatechange=function(){
        if (this.readyState=="complete") { myFunction(); }
      }
    </script>
    

    实际上,这只有在页面加载时才有意义。如果您以动态方式反复下载脚本,那么您可能希望采用另一种方法,即jsonp。

        2
  •  2
  •   Amr Elgarhy    14 年前

    我想这是因为 myFunction(); 在包含它的整个.js文件加载到浏览器之前调用,请尝试延迟 MyFunction(); 请稍等片刻,然后再次测试以确保这是问题所在。

        3
  •  0
  •   Marko Dumic    14 年前

    使用document.write打印脚本包含标记后,浏览器继续执行(尝试调用 myFunction() )在加载外部脚本之前。所以,你的剧本还没出来。

        4
  •  0
  •   E-man    14 年前
    1. 把你的动力 script 块中 head 你的文件(如果不是 已经)
    2. 移除 myFunction() 打电话。
    3. MyType() 换一种方式 脚本 在下面的某个街区 文件。

    步骤1是一个最佳实践,但我认为如果您在文档中的其他点动态地包含js文件,任何浏览器都不会阻塞。

    关键是不能在执行包含操作的同一脚本块中使用包含的js代码。

    这在Firefox中有效,我不能保证Safari。

    <html>
        <head>
            <script type="text/javascript">
                document.write(decodeURI("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E"));
            </script>
        </head>
        <body>
            <script type="text/javascript">
                myFunction();
            </script>
        </body>
    </html>
    
        5
  •  0
  •   E-man    14 年前

    我通常不会写两个独立的答案,但这是一个非常不同的答案,这同样可能奏效。

    打电话给 something_ready() 在something.js的底部。不要定义 准备好的东西() 在something.js中,在HTML文档中定义它。

    所以没有计时器,没有不必要的检查。

        <script type="text/javascript">
            document.write(decodeURI("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E"));
    
            function something_ready(){
                myFunction();
            }
        </script>
    

    这是可行的,它只是假设您有权访问something.js,而您可能没有。如果没有,我提供的另一个答案将起作用。

        6
  •  0
  •   Tracker1    14 年前

    这有用吗?

    <script type="text/javascript">
    document.write(unescape("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E"));
    document.write("<"+"script type='text/javascript>myFunction();<"+"/script>");
    </script>
    
        7
  •  0
  •   thirdender    14 年前

    最简单的方法是编写两个<脚本>块。

    <script type="text/javascript">
        document.write(decodeURI("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E"));
    </script>
    <script type="text/javascript">
        myFunction();
    </script>
    

    什么时候? 文档.write 使用时,文本将直接写入文档中,<script>标记之后。因此,当浏览器遇到<脚本>标记时,它会在继续下一页之前等待脚本完成加载。任何 文档.write 加载的脚本中发生的这种情况可能会影响页面的其余部分(例如,如果执行“document.write('<div>')”,则会影响布局的其余部分)。

    因此,如果使用两个<script>标记,浏览器将遇到第一个标记,并且它使用 文档.write 输出新的“脚本”标记。标记完成后,浏览器将继续向下浏览页面,并立即遇到动态添加的新标记。此标记告诉浏览器加载外部javascript。浏览器将等待执行第二个原始标记,直到该标记加载完毕。那么你的功能 肌力函数 将可用。

    在一个标记中执行全部操作不起作用的原因是 文档.write 在<脚本>完成运行之前不会发生( 小精灵 还不可用)。它与两个<script>标记一起工作的原因是浏览器等待每个<script>标记连续运行,并且 文档.write 将新的<脚本>标记放入行中。