【问题标题】:Javascript Error Uncaught TypeError: Cannot read property 'top' of undefinedJavascript 错误未捕获类型错误:无法读取未定义的属性“顶部”
【发布时间】:2020-03-01 01:46:04
【问题描述】:

我正在编写我的页面并且我使用了一个模板。我不太了解javascript,所以只有当我转到portfolio.html 页面并切换到移动视图时才会出现此错误。在 index.html 中没有显示任何错误。索引页面使用导航链接,例如:<li><a href="#portfolio-section" class="nav-link">Portfolio</a></li> 并且工作正常。在投资组合页面导航链接中,我想转到其他文件,如下所示:<li><a href="index.html" class="nav-link">Inicio</a></li>

我的代码给出了这个错误:

Javascript 错误未捕获类型错误:无法读取属性“顶部”的 未定义

有什么技巧可以解决吗?

我的html:

<html lang="pt-br">
<head>
  <title>Nova Pintura</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">enter code here

  <link href="https://fonts.googleapis.com/css?family=Work+Sans:400,700,900&display=swap" rel="stylesheet">

  <link rel="stylesheet" href="css/bootstrap.min.css">
  <link rel="stylesheet" href="css/jquery-ui.css">
  <link rel="stylesheet" href="css/owl.carousel.min.css">
  <link rel="stylesheet" href="css/owl.theme.default.min.css">
  <link href="https://fonts.googleapis.com/css?family=Dosis|Oswald&display=swap" rel="stylesheet">
  <link rel="stylesheet" href="css/jquery.fancybox.min.css">
  <link rel="stylesheet" href="css/bootstrap-datepicker.css">
  <link rel="stylesheet" href="fonts/flaticon/font/flaticon.css">
  <link rel="stylesheet" href="fonts/icomoon/style.css">
  <link rel="stylesheet" href="css/aos.css">
  <link rel="stylesheet" href="css/style.css">

</head>

<body data-spy="scroll" data-target=".site-navbar-target" data-offset="300">

  <div class="site-wrap">

    <div class="site-mobile-menu site-navbar-target">
      <div class="site-mobile-menu-header">
        <div class="site-mobile-menu-close mt-3">
          <span class="icon-close2 js-menu-toggle"></span>
        </div>
      </div>
      <div class="site-mobile-menu-body"></div>
    </div>
  </div>

    <header class="site-navbar py-4 js-sticky-header site-navbar-target" role="banner">

      <div class="container">
        <div class="row align-items-center">
          <div class="col-6 col-xl-2">
            <h1 class="mb-0 site-logo">
              <a href="index.html">
                <img src="images/logo/np.png" width="200" height="55" alt=""></img>
              </a>
            </h1>

          </div>

          <div class="col-12 col-md-10 d-none d-xl-block">
            <nav class="site-navigation position-relative text-right" role="navigation">
              <ul class="site-menu main-menu js-clone-nav mr-auto d-none d-lg-block">
                <li><a href="index.html" class="nav-link">Inicio</a></li>
                <li><a href="index.html#about-section" class="nav-link">Sobre Nós</a></li>
                <li><a href="portfolio.html" class="nav-link active">Portfolio</a></li>
                <li><a href="index.html#services-section" class="nav-link">Serviços</a></li>
                <li><a href="index.html#contact-section" class="nav-link">Contato</a></li>
              </ul>
            </nav>
          </div>

          <div class="col-6 d-inline-block d-xl-none ml-md-0 py-3" style="position: relative; top: 3px;"><a href="#"
              class="site-menu-toggle js-menu-toggle float-right"><span class="icon-menu h3"></span></a></div>
        </div>
      </div>
    </div>

给出错误的js函数:

// navigation
  var OnePageNavigation = function() {
    var navToggler = $('.site-menu-toggle');
    $("body").on("click", ".main-menu li a[href^='#'], .smoothscroll[href^='#'],.main-menu li a[href^='index.html'], .smoothscroll[href^='index.html'], .site-mobile-menu .site-nav-wrap li a", function(e) {
      e.preventDefault();

      var hash = this.hash;

      $('html, body').animate({
        'scrollTop': $(hash).offset().top
      }, 300, 'easeInOutExpo', function(){
        window.location.hash = hash;
      });

    });
  };
  OnePageNavigation();

  var siteScroll = function() {



    $(window).scroll(function() {

        var st = $(this).scrollTop();

        if (st > 100) {
            $('.js-sticky-header').addClass('shrink');
        } else {
            $('.js-sticky-header').removeClass('shrink');
        }

    }) 

  };

【问题讨论】:

  • 您的文档中没有任何带有id about-section 的元素,因此当您执行$('#about-section') 时,此jQuery 对象将不包含任何元素,其.offset() 将返回undefined。不确定你到底想做什么,但至少,添加一个检查var $el = $(hash); if($el.length) { $(...).animate(....

标签: javascript


【解决方案1】:

Cannot read property 'propName' of undefined 是非常常见的错误。这是不言自明的。换句话说,对象不包含属性,因为它不存在。快速扫描您的代码'scrollTop': $(hash).offset().top 是问题所在。确保在使用之前检查该属性。

下面的sn-p会确保你的对象与属性一起存在

'scrollTop': $(hash) &&& $hash.offset() && $hash.offset().top ? $hash.offset().top : aDefaultValue; ///You should assign your own default value

【讨论】:

  • 我试过你的 sn-p 并不起作用,即使移动菜单未打开,滚动时出现的页面内容也不再出现,模板如何更改滚动顶部功能会影响所有地点。奇怪的是,当我单击导航栏链接时,错误仅在移动视图的投资组合页面中可见。 index.html 移动和桌面视图中的链接正在工作,并且在portfolio.html 桌面视图中也是如此。任何其他提示也许可以解决?
  • 对不起,我帮不了你。除了我发的。我建议你弄清楚$(hash).offset() 如何以及为什么返回未定义。因为那是错误。希望我能提供更多帮助。
  • "一个对象不包含一个属性" 不,这意味着你试图访问 undefined 上的一个属性是不允许的。至于你为什么这样做,可能是因为你认为的对象实际上不是。
【解决方案2】:

今天我遇到了同样的问题(代码和你的完全一样),我设法通过更正上面的解决方案之一解决了这个问题:

替换

'scrollTop': $(hash).offset().top

'scrollTop': $(hash) &amp;&amp; $hash.offset() &amp;&amp; $hash.offset().top &amp;&amp; $hash.offset().top(0)

如果您使用任何需要更改 href ="" 参数的语言,请不要忘记在脚本中进行更改。

例如,如果我使用 django,我将不得不使用 href = "{% url 'index'%}",那么您必须执行以下操作:

替换[href^='#'][href^='{% url']

(因为我在页面之间的引用总是必须以"{% url)开头

我希望我能帮上忙,尽管已经过去了这么多时间,而且您可能已经找到了解决方案:D

【讨论】:

  • 替换'scrollTop':$(hash).offset().top
  • 每个 'scrollTop': $(hash) && $hash.offset() && $hash.offset().top && $hash.offset().top(0)
  • 当我发布格式时它就消失了:(
  • 替换 [href^='#']
  • Per [href^='{% url'] (将 {% url '替换为您的 href 将遵循的“默认”)
猜你喜欢
  • 2016-05-17
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多