2012-05-16 4 views
1

마크 업에서 일반 링크를 사용하는 AJAX 탐색 사이트 (코드는 CSS-Tricks)를 작성 중이지만 .js를 통한 해시 링크로 바꿉니다.정의 된 함수에서 클릭 한 링크를 어떻게 선택할 수 있습니까?

사용자가 동일한 콘텐츠를 방금 다시로드 할 링크를 클릭하지 못하도록하고 싶습니다. 홈 페이지 (첫 번째로드시)가 아닌 다른 페이지에서 해시를 사용하기 때문에이 문제는 스스로 해결됩니다 (사용자가 현재 URL 해시에 대한 해시 링크를 클릭하면 아무 일도 일어나지 않습니다).

필자는 이것을 (필자는 재사용해야하기 때문에) 함수로 정의 할 때까지 작동하는 해결책을 가졌습니다. 클릭 한 링크를 얻으려면 $ (this)를 사용하고 현재 페이지의 경우 false를 반환합니다. 그러나 이제는 클릭 된 링크가 아니라 배열 객체로 창을 반환합니다.

대신 클릭 한 링크를 어떻게 선택할 수 있습니까?

// Use hashes instead of reloads to navigate the site. 
function initiateHashNav(linkContainers) { 
    var $this = $(this); 
    $(linkContainers).delegate('a', 'click', function() { 
    // Restrict clicking on link for current page. 
    if ($this.attr('href') == window.location.href) { 
     return false; 
    } else { 
     // The hash shouldn't contain window.location (clean URLs are happy URLs!). 
     window.location.hash = $this.attr('href').substr(window.location.origin.length); 
     return false; 
    } 
    }); 
} 

답변

1

그냥 같은 올바른 범위에 $this의 선언을 이동 : 자바 스크립트

function initiateHashNav(linkContainers) { 
    $(linkContainers).delegate('a', 'click', function() { 
    var $this = $(this); 
    // Restrict clicking on link for current page. 
    if ($this.attr('href') == window.location.href) { 
     return false; 
    } else { 
     // The hash shouldn't contain window.location (clean URLs are happy URLs!). 
     window.location.hash = $this.attr('href').substr(window.location.origin.length); 
     return false; 
    } 
    }); 
} 

의 모든 기능은 범위이다. in의 각 스코프에는 컨텍스트 (this)가있어, 설정되어 있지 않은 경우는 window object가 컨텍스트가됩니다.

jQuery.fn.delegate는 일치하는 요소를 이벤트 핸들러의 컨텍스트로 설정하므로 this은 대리자 이벤트 처리기 내에있는 HtmlAncherElement입니다. 하지만 외부의 함수 initiateHashNav에는 설정된 컨텍스트가 없으므로 그냥 윈도우 객체입니다

+0

가끔은 자신이 싫어. – curtisblackwell

관련 문제