internetexplorer7-让IE7先加载javascript,然后调用函数

internet explorer 7 - Make IE7 load javascript first then call function

本文关键字:然后 调用 函数 javascript 加载 IE7 internetexplorer7-      更新时间:2023-09-26

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

编辑:<script>代码将提供给外部客户端,所以我希望它尽可能简单。请参阅示例链接。

奥卡姆的剃刀建议IE/MSHTML中的任何一个都不支持script元素和type="application/x-javascript"。这可能与application/x-javascript不是注册的MIME媒体类型有关,也从来没有必要。

或者这与//www.mysite.example.com/myjs.js在该环境中不是受支持的URI引用有关。请改用完全限定的URI,如http://www.mysite.example.com/myjs.js。(请使用注册的示例域作为示例。)

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

var myapp = {
  …
};

如果不执行此操作,则如果文档中存在名为myapp的元素,则可能会出现问题。在JScript/MSHTML中,标识符解析将在作用域链中找到一个属性为myapp的主机对象。该属性的值将是对相应元素对象的引用,尝试覆盖该属性值将导致运行时错误。

向主体的Load事件添加一个事件处理程序。在该事件处理程序中,进行myapp.myfunc()调用。

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

此外,使用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>