【问题标题】:Firefox incompatibility?火狐不兼容?
【发布时间】:2015-11-21 19:04:25
【问题描述】:

http://ahmedstudio.za.pl/firefoxerror/

它可以在 chrome、opera 中运行,但与 Firefox 不兼容。 整个 javascript 的东西都没有应用。

这直接在我的 javascript.js 中:

window.onload = function() {

        todo("body", 50);
        alert("alert!");

        setTimeout(function () {
            todo("body", 0);

        }, 1000)

}

function todo(element, size) {
     //blahblah
 }

【问题讨论】:

  • 你能链接到整个页面吗?您是否在控制台中收到任何错误?
  • "ReferenceError: loading is not defined"
  • 您显示的代码中没有loading 标识符。你在todo 函数中使用它吗?
  • 如果从<body> 标签中删除onload="loading()" 会发生什么?
  • 您正在用无效的函数调用替换所有 onload 处理程序。在尝试修复混乱时,其他浏览器可能拒绝重新定义onload,而其余代码纯属偶然。

标签: javascript firefox compatibility


【解决方案1】:

即使它实际上并不能解决您的问题,我也想分享一下我关于用无效函数调用替换事件处理程序的发现。我写了这个小fiddle

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
  <script>
    jQuery(function(){
      $("body").on("load", function(){
        $(this).append("Should not run")
      });
    });
  </script>
</head>
<body onload="doesNotExist()">

</body>
</html>

Firefox、Explorer 和 Edge 实际上替换了 &lt;body&gt; 事件处理程序。但是,Chrome 会忽略 onload="doesNotExist()" 并执行之前的处理程序。

在标签汤领域,很难确定哪种解决方法是正确的,但它绝对是一个可以解释你的症状的错误。

【讨论】:

  • 假设 jQuery 只是使用 addEventListener (从内存中,它们是),根据规范,它们应该触发事件以便调用所有侦听器。因此,Chrome 的行为是错误的。
【解决方案2】:
function load() {
        //do stuff
}

和适当的

<body onload="load()"> </body>

【讨论】:

  • 他已经在使用 jQuery。回到 1997 年并内联偶数处理程序没有多大意义 ;-)
【解决方案3】:

这在我身上运行良好。我什至尝试用这个 sn-p 创建一个虚拟页面,但无法复制它。这里是 sn-p。由于您共享的 sn-p 不包含 jquery,我选择使用相同的代码。

 <!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>

</head>
<body>
<script>
    window.onload = function(){
            _todo({
                a:'body',
                b:50,
                alertFrom:'window.onload'
            });
        setTimeout(function(){
             _todo({
                a:'body',
                b:0,
                alertFrom:'setTimeOut'
                  });   
            },1000);
        };

        function _todo(options){
            var a = options.a;
            var b = options.b;
            var c=options.alertFrom
             alert(c +" "+a +" "+b);
            };
 </script>
</body>
</html>

还要注意,函数后面的分号很重要。 这是几个快照

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 2012-06-16
    • 2016-01-05
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多