【问题标题】:IE8 JS error: Object doesn't support this property or methodIE8 JS 错误:对象不支持此属性或方法
【发布时间】:2014-06-05 20:25:02
【问题描述】:

我正在使用我在网上找到的以下 JS 来实现响应式导航。源代码上没有关于 IE8 中出现任何错误的信息,但是我正在 BrowserStack (Win7+IE8) 中进行一些兼容性测试并收到“对象不支持此属性或方法”错误。这是整个脚本:

<script>
$(function() {  
    var pull        = $('#menu');  
        menu        = $('nav ul');  
        menuHeight  = menu.height();  

    $(pull).on('click', function(e) {  
        e.preventDefault();  
        menu.slideToggle();  
    });  
});  

$(window).resize(function(){  
    var w = $(window).width();  
    if(w > 320 && menu.is(':hidden')) {  
        menu.removeAttr('style');  
    }  
});
</script>

这是 IE8 不喜欢的行(特别是字符 6):

if(w > 320 && menu.is(':hidden')) { 

任何解决这个问题的帮助都很棒,我仍然不是最擅长 JS。

【问题讨论】:

  • .resize() 是一个独立的事件,可以在.ready() 之前,menu 定义之前发生。为避免竞争条件,您可以在 .ready() 处理程序中绑定 .resize() 事件。
  • 啊,是的。将该函数移到 document.ready 中。
  • 这基本上只有效,因为您忘记用逗号分隔变量并使其成为全局变量!
  • 所以我需要将变量拉到第一个 $(function ? 之外
  • 不是真的,你需要让它们全局

标签: javascript jquery internet-explorer-8


【解决方案1】:

我希望您意识到单个 var 语句并不适用于所有变量。您正在声明全局变量。

【讨论】:

    【解决方案2】:

    完全停止将 jQuery 对象存储在全局变量中。按需创建它们并不需要太多成本,而且您不会遇到您遇到的这个生命周期/范围问题:

    <script>
    $(function() {  
        $('#menu').on('click', function(e) {  
            e.preventDefault();  
            $('nav ul').slideToggle();  
        });  
    });  
    
    $(window).resize(function(){  
        var menu = $('nav ul'); 
        if($(window).width() > 320 && menu.is(':hidden')) {  
            menu.removeAttr('style');  
        }  
    });
    </script>
    

    这里适用的一些通用设计/代码布局思路:

    1. 尽可能避免使用全局变量。
    2. 不要在一个范围内声明某些内容,然后尝试在另一个范围内使用它(除非是全局的,否则将不起作用,请参阅规则 #1),如果全局也可能存在时间问题。
    3. 仅在使用它们的函数中需要时获取选择器结果。很少有理由在函数的生命周期之外缓存类似的东西。
    4. 如果您要在一个函数中多次引用同一个 jQuery 对象,那么您可能希望在函数执行期间将其保存到一个局部变量中(只要其结果不会在函数)。

    【讨论】:

    • 如果有人真的很快,resize 事件仍然可以在 DOM 准备好之前触发
    • @adneo - 而且,如果调整大小过早,在这里也没有什么坏处。如果菜单还不存在,jQuery 对象将是空的,它们的方法将只是 noops。这是 jQuery 的安全网之一。如果 OP 想将调整大小放在准备好的处理程序中,那也可能没问题。
    • 这个方法奏效了,我想知道为什么原始来源使用变量来处理这么小的脚本。这是常见的做法吗?就像我说的,我还是 JS/jQuery 的新手
    • 我同意,它绝对不应该,jQuery 默默地失败,我只是注意到问题下的评论,这并没有移动处理程序,但它当然不是必需的。
    • @IEcansuckit - 我通常不会将选择器的结果存储在全局变量中,因为更少的全局变量通常是好的,如果你不这样做,代码会更加独立,并且计算机可以快速获取DOM 元素在需要时通过查询(特别是响应用户发起的事件)。正如我在 .resize() 处理程序中所做的那样,如果我要在该函数中多次引用它,我会将其提取到函数中的局部变量中。
    猜你喜欢
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多