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

时间:2010-03-10 22:54:00

标签: javascript document.write

所以我有一个外部的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为null,但如果我在something.js的末尾放置相同的函数调用,它就可以了。现在这不是确切的情况,所以我知道对于这个特例,这不是最好的方法。

7 个答案:

答案 0 :(得分:3)

我是这样做的:

<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。

答案 1 :(得分:2)

我认为这是因为myFunction();在包含它的整个.js文件被调用之前被调用,尝试延迟myFunction();调用几秒钟并再次测试以确保这是问题

答案 2 :(得分:0)

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

答案 3 :(得分:0)

  1. 将动态script块放入 您文档的head(如果不是 已)
  2. 删除myFunction()来电。
  3. myFunction()电话放入其他电话 script阻挡在较低的地方 文件。
  4. 第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>
    

答案 4 :(得分:0)

我通常不会写两个单独的答案,但这是一个非常不同的答案,这也是可行的。

在something.js的底部拨打something_ready()。不要在something.js中定义something_ready(),在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,你可能没有。如果没有,我提供的其他答案将有效。

答案 5 :(得分:0)

这有用吗?

<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>

答案 6 :(得分:0)

最简单的方法是编写两个&lt; script&gt;块。

<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>

当使用 document.write 时,文本会直接写入文档,就在&lt; script&gt;之后。标签。因此,当浏览器遇到&lt; script&gt;标记,它等待脚本完成加载,然后继续向下页面。加载的脚本中发生的任何 document.write 可能会影响页面的其余部分(例如,如果您执行“document.write('&lt; div&gt;')”,则会影响其余部分的布局)。

所以,如果你使用两个&lt; script&gt;标签,浏览器遇到第一个标签,并使用 document.write 输出新的&lt; script&gt;标签。只要那个&lt; script&gt;标签完成后,浏览器继续向下移动页面,并立即遇到新的,动态添加的&lt; script&gt;标签。这个&lt;脚本&gt;标签告诉浏览器加载外部Javascript。浏览器将等待执行第二个原始&lt; script&gt;标记直到此&lt; script&gt;标签已完成加载。然后您的函数 myFunction 将可用。

在一个&lt; script&gt;中完成所有操作的原因标记不起作用是因为 document.write 直到&lt; script&gt;之后才会发生已完成运行( myFunction 尚未推出)。它适用于两个&lt; script&gt;的原因标签是因为浏览器等到每个&lt; script&gt;标记连续运行, document.write 放置一个新的&lt; script&gt;标记在行。