javascript适用于IE以外的所有浏览器

时间:2014-05-21 17:09:12

标签: javascript html internet-explorer sorttable.js

我有一些网页加载外部JavaScript文件,如下所示:

<script src="sorttable.js"></script>

此软件包来自此处:sorttable

我在这样的onload函数中引用它:

<script type="text/javascript">
window.onload = function() { sorttable.innerSortFunction.apply(document.getElementById("Symbol-2"), []); }
</script>

这适用于Firefox和Chrome,但在IE 9.0.2版本中,它会失败并显示以下消息:

HTML1113: Document mode restart from IE9 Standards to Quirks 
SEC7111: HTTPS security is compromised by javascript:void(0) 
SCRIPT5007: Unable to get value of the property 'apply': object is null or undefined 

这是一个内部网站,9.0.2是我公司部署的版本,我无法升级到更新版本。

我可以在IE以及其他浏览器上使用吗?

3 个答案:

答案 0 :(得分:2)

看起来SortTable库正在使用某种hacky浏览器检测,试图尽早初始化库:

(摘自图书馆源代码)

/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
    document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
    var script = document.getElementById("__ie_onload");
    script.onreadystatechange = function() {
        if (this.readyState == "complete") {
            sorttable.init(); // call the onload handler
        }
    };
/*@end @*/

看起来IE拒绝这样做是因为尝试在通过HTTPS访问的页面上使用带有URL javascript:void(0)的脚本。

如果库没有特定于浏览器的初始化方法,那么该库也可以使用onload处理程序:

window.onload = sorttable.init;

但是你用自己的句柄覆盖onload处理程序,所以这永远不会执行。

我认为最简单的解决方案就是修改onload处理程序以执行初始化:

window.onload = function() { 
    sorttable.init();
    sorttable.innerSortFunction.apply(document.getElementById("Symbol-2"), []); 
};

你应该全力以赴。 init()方法有一个内部检查,以防止它执行两次初始化,因此如果已经调用它,则无需担心调用它时会出现问题。

答案 1 :(得分:1)

您很可能需要正确设置您的doctype。如果您正在使用<!DOCTYPE html>,请尝试添加

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

<meta http-equiv="X-UA-Compatible" content="IE=9">

<head>

另外,请确保doctype之前没有任何内容。包括空格和换行符。检查html的输出,而不是服务器端代码的源。

否则回退到其他doctype并重新测试其他浏览器。

答案 2 :(得分:-1)

这是IE的安全问题,虽然这可能会解决它:

   <script type="text/javascript">
       sorttable.innerSortFunction.apply(document.getElementById("Symbol-2"), []);
   </script>

脚本已经是同步的,但是如果这不起作用,请尝试将脚本移动到body标签之后