我有一些网页加载外部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以及其他浏览器上使用吗?
答案 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标签之后