【问题标题】:javascript works on all browsers except IEjavascript 适用于除 IE 以外的所有浏览器
【发布时间】:2014-05-21 17:09:11
【问题描述】:

我有一些网页会像这样加载外部 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 和其他浏览器上进行这项工作吗?

【问题讨论】:

标签: javascript html internet-explorer sorttable.js


【解决方案1】:

SortTable 库似乎正在使用某种骇人听闻的浏览器检测,试图尽早初始化该库:

(摘自库源代码)

/* 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() 方法有一个内部检查,以防止它执行两次初始化,所以如果它已经被调用,你不必担心调用它的问题。

【讨论】:

  • 当我添加对 sorttable.init() 的调用时,它会失败并显示此“SCRIPT5007:无法获取属性'innerSortFunction'的值:对象为空或未定义” - 这是因为函数仅当存在任何具有可排序类的表并且在此运行时似乎 DOM 元素不存在时,才会存在 sorttable 对象的 innerSortFunction。但是没有 sorttable.init() 它们确实存在(但后来我得到另一个错误)
  • 这可能是一个愚蠢的问题,但是您是在 onload 处理程序内还是在它之外的某个地方添加了对 sorttable.init() 的调用?
  • 在 onload 处理程序中,就像你在上面展示的那样。
  • 我一直在用这个做更多的测试,我发现如果我手动重新加载页面,这一切都有效。但我有一个重新加载功能: setTimeout("parent.frames['header_frame'].document.submitform.submit()", 60*1000 );当刷新页面时,我得到“innerSortFunction”:对象为空或未定义”错误。有什么建议吗?
  • 所以这似乎是一个时间问题。如果我将 onload 替换为等待 1 秒的超时函数,它的工作时间为 99%。我真的不想设置超时,我宁愿等待 innerSortFunction 被定义。但我不知道如何编写代码来等待。
【解决方案2】:

您很可能需要正确设置文档类型。如果您使用的是&lt;!DOCTYPE html&gt;,请尝试添加

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

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

致您的&lt;head&gt;

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

否则退回到不同的文档类型并重新测试您的其他浏览器。

【讨论】:

  • 我的 HTML 当前开始如下: 它没有 DOCTYPE .我尝试在头部之后添加 DOCTYPE 和元,但它说:HTML1115: X-UA-Compatible META tag ('IE=edge,chrome=1') 由于文档模式已经完成而被忽略。
  • 您添加了哪种文档类型,您是否确认它是发送到浏览器的第一个字节?
  • 你有一个&lt;link&gt;标签之前你的&lt;html&gt;标签??? DOCTYPE 应该是 HTML 中的第一件事;它不应该是“在头部之后”。
  • 我有一种令人作呕的感觉,该页面是通过注入该链接标签的代理提供的。那将是最坏的情况,并且不允许“添加文档类型”作为解决方案:(
  • @Joe Frambach:我添加了 HTML 文档类型。这不是页面上的第一件事。该页面是由 PHP 代码生成的。我可以将其更改为任何我想要的。我会先用 doctype 试试看。
【解决方案3】:

这是 IE 的一个安全问题,尽管这可能会解决它:

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

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

【讨论】:

  • 我非常怀疑使用 onload 处理程序是导致问题的原因。
  • 实际上,我必须收回。这使用onload处理程序的结果,但这是因为库实现者的设计不佳。
猜你喜欢
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多