IE 中的 JavaScript 运行时错误 : Unable to get property 'top'

标签 javascript jquery

问题背景:

我有一个导航栏,可以根据所选项目 ID“平滑滚动”到相应的 div。

问题:

在 Chrome 和 FireFox 中没有问题,当我尝试从 IE(版本 11)的导航栏中选择一个选项时,显示以下 JavaScript 错误:

0x800a138f - JavaScript runtime error: Unable to get property 'top' of undefined or null reference

代码:

这是平滑滚动的 JS 代码:

<script>
    $(document).ready(function () {
        $('#nav .navbar-nav li>a').on('click', function (event) {
            event.preventDefault();
            var sectionID = $(this).attr("href");
            scrollToID(sectionID, 750);
        });

        function scrollToID(id, speed) {
            var offSet = 70;

            **ERROR LINE -  IN IE ONLY:**
            var targetOffset = $(id).offset().top - offSet;

            $('html,body').animate({ scrollTop: targetOffset }, speed);
        }
    });
</script>

编辑 - 添加 HTML 标记:

导航栏:

  <div class="navbar navbar-fixed-top">
    <nav class="navbar navbar-default" role="navigation" id="nav">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand logo"><img src="~/images/mE.png" id="logo" alt="Logo"></a>
            </div>
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                <ul class="nav navbar-nav">
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown">Menu<span class="caret"></span></a>
                        <ul class="dropdown-menu" role="menu">
                            <li><a href="#myCarousel">Projects</a></li>
                            <li><a href="#Welcome">Welcome</a></li>
                            <li><a href="#features">Workplace, Education, Development</a></li>
                            <li><a href="#About">About Me</a></li>
                            <li><a href="#Location">Location</a></li>
                        </ul>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
</div>

部门 ID:

<div class="row">
    <div class="col-sm-12 mePadding">
        <div class="carousel slide" id="myCarousel">

          /*CODE*/

        </div>
    </div>
</div>

我不明白当此代码在 Chrome 上运行良好时,“top”属性怎么可能为 null 或为空?

****编辑 2 - 添加了新的 JavaScript 代码:****

经过更多调查后,错误是由这一行引起的:

      var sectionID = $(this).attr("href");

这将返回“sectionID”的“未定义”属性。

我修改了代码以在下拉列表中实现“data-id”属性:

      <ul class="dropdown-menu" role="menu">
                            <li><a href="#" data-id="myCarousel">Projects</a></li>
                            <li><a href="#" data-id="Welcome">Welcome</a></li>
                            <li><a href="#" data-id="features">Workplace, Education, Development</a></li>
                            <li><a href="#" data-id="About">About Me</a></li>
                            <li><a href="#" data-id="Location">Location</a></li>

JavaScript 平滑滚动现在看起来像这样:

 $(document).ready(function () {
        $('#nav .navbar-nav li>a').on('click', function (event) {
            event.preventDefault();

            var sectionID = $(this).data('data-id');
            console.log('ID:'+sectionID);
            scrollToID('#' + sectionID, 750);
        });

        function scrollToID(id, speed)
        {
            //alert('SectionID is: ' + id);
            var offSet = 70;
            var obj = $(id).offset();
            var targetOffset = $(id).offset().top - offSet;
            $('html,body').animate({ scrollTop: targetOffset }, speed);
        }
    });

如果我对 div ID 进行硬编码,例如“#myCarosuel”,那么这可以完美地工作,即:

    scrollToID('#myCarosuel, 750);

最佳答案

使用您提供的 HTML 代码,即使在 IE (11) 中,您的脚本也适用于“项目”项。但是,它在其他项目(“欢迎”,...)上失败,并显示您提到的错误消息。我猜你的一个或几个id不正确:检查你的页面中是否存在“欢迎”、“功能”、“关于”和“位置”(也要注意id的大小写)。

正如我之前所写,如果应用于不正确的选择器,offset() 可能会返回 null。

关于IE 中的 JavaScript 运行时错误 : Unable to get property 'top' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26454540/

相关文章:

javascript - 尝试在 JavaScript 中使用 jQuery 制作价格表

Javascript - 通过 ID 获取 <li> 之间的文本

javascript - 引用错误 : prettyPrint is not defined

javascript - jQuery 出现一些错误,无法隐藏元素

javascript - 通过JS添加类

javascript - 如何设置一个 div (#jumbotron) 是视口(viewport)的高度减去动态变化的另一个 div (#header) 的高度

javascript - JSLint 无法识别 getElementById

javascript - 如何使用react js显示表格

javascript - Css3 第 n 个子选择器不按预期方式行事

JQuery如何选择表格单元格并设置边框并取消选择上一个单元格