2014-11-22 5 views
0

jquery-1.4.3.min.js를 사용하는 이전 프로젝트를 업데이트하고 있습니다. 이것은 제가 작업하고 있던 새로운 것들을 방해하고 있었기 때문에 최신 버전으로 대체해야했습니다. 그리고 지금 Uncaught를 얻습니다. TypeError : 정의되지 않은 'substr'속성을 읽을 수 없습니다.Uncaught TypeError : 정의되지 않은 Jquery의 속성 'substr'을 읽을 수 없습니다.

잠시 동안이 작업을하고 있었고 나는 혼란 스럽습니다. 어떤 도움이라도 대단히 감사합니다!

$(window).scroll(function() { 
    $inview = $('section:in-viewport header').parent().attr('id'); 
    if ($('a[hash=#' + $inview + ']') !== null) { 
     $link = $('a[hash=#' + $inview + ']').parent().attr('id').substr(4); 
    } 

    if ($link != $nCurrentActive && scrolling == 1) { 
     $nav.removeClass('active'); 
     offMenu($nCurrentActive); 
     $nCurrentActive = $link; 
     $('#nav-'+$nCurrentActive).addClass('active'); 
     onScrollMenu($nCurrentActive); 
    } 
}); 
+0

안녕하세요. 일부 HTML로 피들을 제공 할 수 있습니까? – kuldipem

+0

ID에'','''또는'[space]'문자가 포함되어있는 경우 속성 선택기를 제대로 이스케이프하고 싶을 수 있습니다. – Terry

답변

1

를 필요한 경우

$link = $('a[hash=#' + $inview + ']').parent().attr('id').substr(4); 

에서의 선은 다음 코드에서 여러 실수가 있습니다 전체 비트입니다. 그것들 중 하나만 고치는 것은 쓸모가 없습니다.

  • var을 사용하여 로컬 변수를 선언하지 않았습니다. 이 실수는 절대해서는 안됩니다.
  • 전역 변수 (예 : $nCurrentActive, $nav, scrolling)를 사용하면 상태를 유지할 수 있습니다. 그러지 마. 그래, 나는 그것이 편리하다는 것을 안다. 그냥 하지마.
  • $을 사용하면 jQuery 객체 ($inview, $link)가 포함되지 않은 변수 앞에 변수를 추가 할 수 있습니다. 그러지 마.
  • jQuery 호출 결과를 null과 비교합니다. jQuery 호출 결코 결과는 null에 결과가 있기 때문에 이것은 쓸모가 없다.
  • 함수 결과에 이 실제로 ($(...).attr("id").substr(...))을 반환했는지 확인하지 않고 substr()을 함수 결과에 호출합니다. 그게 오류의 원인입니다.

더 나은 :

$(window).scroll(function() { 
    var sectionId, sectionLinkId, navId; 

    sectionId = $('section:in-viewport header').parent().attr('id'); 
    if (!sectionId) return; 

    sectionLinkId = $('a[hash=#' + sectionId + ']').parent().attr('id'); 
    if (!sectionLinkId) return; 

    navId = sectionLinkId.substr(4); 
    offMenu(navId); 
    $("*[id^=nav]").removeClass("active").filter("#nav+" + navId).addClass("active"); 
    onScrollMenu(navId); 
}); 

기타 사항 :

  • 당신은 좋은 변수 이름을 사용하지 않는 것. 변수 이름에 변수가 실제로 반영되어 있다면 더 세게 생각하십시오.
  • CSS 클래스 작업 ($(".navLink"))은 입니다.$("*[id^=nav]")보다 좋습니다.
  • $nCurrentActive과 같은 전역 변수를 사용할 필요가 없으므로 사용하지 않아야합니다. $(".navLink.active")을 사용하십시오. 그게 바로 클래스입니다.
  • ID와 ID의 일부가 왜 복잡하게 생겼습니까? HTML 구조가 기본 섹션 링크를 선택하기 위해 단순히 $('section:in-viewport a.primarySectionLink')을 수행 할 수있는 수준 이었으면 좋지 않습니까?
  • 여러 수준의 중첩 된 if 문을 방지하는 한 가지 방법은 함수의 전제 조건이 충족되지 않았을 때 (위 참조) 일찍 반환하는 것입니다.
  • offMenu()onScrollMenu()으로 전화하지 않아도됩니다. 메뉴가 Window 스크롤 이벤트를 처리하도록합니다. 왜이 두 함수 사이에 종속성을 설정하고 싶습니까?
  • 두 개 이상의 섹션이 뷰포트에있는 경우를 처리하지 않습니다.
관련 문제