让IE7首先加载javascript然后调用函数

时间:2013-02-05 01:35:52

标签: javascript internet-explorer-7

IE7出现以下错误:'myapp'未定义

//home.html
<script type="application/x-javascript" src="//www.mysite.com/myjs.js"></script>
<script type="text/javascript" charset="utf-8">
    new myapp.myfunc();
</script>

javascript文件:

//myjs.js
myapp = {
    myfunc : function(){
        alert('hello world');
    }
};

*我知道有很多方法可以重写home.html上使用的代码,但我想在不改变它的情况下完成这项工作。我发现了一个具有类似结构且没有JS错误的工作示例(IE7,IE6)。 https://google-developers.appspot.com/custom-search-ads/docs/sample

编辑: &lt;脚本&gt;代码将提供给外部客户端,因此我希望尽可能简单。参见示例链接。

3 个答案:

答案 0 :(得分:0)

Occam's razor表明IE / MSHTML不支持带有script的{​​{1}}元素。这可能与application/x-javascript is not a registered MIME media type, nor was it ever necessary

这一事实有关

或者它与type="application/x-javascript"在该环境中不受支持的URI-reference这一事实有关。使用完全限定的URI,例如//www.mysite.example.com/myjs.js。 (请使用注册的示例域名作为示例。)

您还应该声明要用作变量的标识符:

http://www.mysite.example.com/myjs.js

如果不这样做,如果文档中存在名为var myapp = { … }; 的元素,则可能会出现问题。在JScript / MSHTML中,标识符解析将在作用域链中找到以myapp作为其属性的宿主对象。该属性的值将是对相应元素对象的引用,并且尝试覆盖该属性值将导致运行时错误。

答案 1 :(得分:-1)

body's Load event添加事件处理程序。在该事件处理程序中,进行myapp.myfunc()调用。

答案 2 :(得分:-1)

每当您使代码可供使用时,您总是希望确保您在页面上成为一个好公民。这意味着您不希望创建不必要的全局变量,并确保您创建的变量足够独特。这就是为什么将代码包装在一个立即调用的函数表达式中是个好主意。

此外,使用javascript完成整个操作通常更容易。这就是Google分析和Facebook插件加载代码的方式。

<script type="text/javascript">
(function() {
  var loadScript = function(src, callback) {
    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = src;
    // modern browsers
    script.onload = callback;
    // IE 6 & 7
    script.onreadystatechange = function() {
      if (this.readyState == 'complete') {
        callback();
      }
    }
    head.appendChild(script);
  };
  loadScript('path/to/myscript.js', function() {
     //script loaded
  });
})();
</script>