2013-04-10 4 views
0

난 "이"중첩 자바 스크립트 함수 "이"

if(tabNav === true){ 

$("." + tabNavClass).show(); 
tabNavItem.first().addClass("active");//active class on first li 
tabNavItem.each(function(i){ 
    $(this).attr("rel",(i + 1)); 
});       

tabNavItem.on("click", function(e){ 

    tabNavClick(); 
    //this works, but i don't want it defined here. i want it in the tabNavClick() function 
    //var data = $(this).attr("rel"); 
    //console.log(data); 
    e.preventDefault(); 

});    

}   


//tab nav function   
function tabNavClick(){ 

// REGISTERS UNDEFINED HERE B/C LOSES SCOPE OF "THIS". FIX?!      
var that = $(this); 
var data = that.attr("rel"); 
console.log(data); 

tabNavItem.removeClass("active");//remove existing active class 

의 적절한 범위를 잃는다} 중첩 기능이 상실;

나는 var that = $(this)을 시도했지만 작동하지 않으며 .call이이 시나리오에서 작동하지 않을 것이라고 생각합니다. 내가 어떻게 $(this).attr("rel"); rel # 값 내가 undefined 대신 원하는 반환하도록합니까? 함수에

+0

이 tabNavClick' 이미 클릭 핸들러와 같은 기록 '처럼 보이는, 그래서를 등록하지 왜 그렇게? :) –

+0

@Jack 정직하게, b/c 나는 내가하는 일을 모른다. 첫 번째 플러그인을 작성하려고합니다. 클릭 핸들러가 무엇인지는 알지만 어떻게 등록하면이 상황에서 도움이됩니까? – heyjohnmurray

+0

제 답변에서 설명했습니다. –

답변

2

패스 $(this) 추가로

tabNavClick($(this)); 

    function tabNavClick(obj){ 
    var that = obj; 
    .... 

당신은 클릭 핸들러로서 기능 tabNavClick을 통과하고 당신은 단지 클릭 핸들러로 자체 tabNavClick을 전달할 수

tabNavItem.on("click",tabNavClick) 

    function tabNavClick(e){ 
     e.preventDefault(); 
     var that=$(this); 
    } 
+0

감사합니다. 진심으로 감사드립니다. – heyjohnmurray

+0

환영합니다 .. .. .. 갤드 도움이 .. 행복한 코딩 .. :) :) – bipen

0

경우 취할 수 있습니다

tabNavItem.on("click", tabNavClick); 

이렇게하면이 호출됩니다.은 클릭 한 항목을 가리키는 방식으로 this입니다.

tabNavClick은 으로 반환하여 이벤트가 버블 링하지 않도록 할 수 있습니다. 또한, 당신이 tabNavClick 만들 수뿐만 아니라 이벤트를 받아들이 :

function tabNavClick(e) { 
    // ... 
    e.preventDefault(); 
} 
2

를 원하는 this 값을 갖도록 tabNavClick()을 원하는 경우에, 당신은 지정해야합니다 당신은 그것을 호출 할 때 :

tabNavItem.on("click", function(e){ 

    tabNavClick.call(this); 
    //this works, but i don't want it defined here. i want it in the tabNavClick() function 
    //var data = $(this).attr("rel"); 
    //console.log(data); 
    e.preventDefault(); 

});  

방법 함수가 호출되어 this 값을 결정합니다. 메서드 호출이 아니며 .call() 또는 .apply()을 사용하지 않는 경우 this은 모든 함수 호출에서 재설정됩니다. 이 경우 tabNavClick.call(this)을 사용하여 this 값을 원하는 값으로 설정할 수 있습니다. 당신은 단지에서 작동하도록 개체에 대한 인수를 취할 tabNavClick을 바꿀 수의


:

tabNavItem.on("click", function(e){ 

    tabNavClick(this); 
    //this works, but i don't want it defined here. i want it in the tabNavClick() function 
    e.preventDefault(); 

});  

//tab nav function   
function tabNavClick(obj){ 

    var data = $(obj).attr("rel"); 
    console.log(data); 
} 
+0

+1 우, 나는'.call()'메소드도 좋아한다. –

+0

@ jfriend00와 바이 펜의 대답이 모두 효과가있다. 정말 고마워. 나는 내가 사용하는 것을 본 모든 예를 프로토 타입 상속 예제에서 사용되었음을 보여 주었다. .call을 더 잘 이해하기 위해 읽을 수있는 좋은 자료가 있습니까? 나는 그것에 익숙하지 않다. 그리고 당신이 말할 수있는 것에 따라, 나는 그것에 관해 확고한 이해를 가지고 있지 않다. – heyjohnmurray

+0

@heyjohnmurray - 일반적으로 MDN이 처음으로 참고 자료입니다. MDN의 [.call() (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call)을 참조하십시오. 모든 함수 호출에 사용할 수 있습니다. 다음과 같은 검색으로 Google의 MDN에서 검색 할 수 있습니다. "MDN .call".참고, 내 대답에 대한 간단한 두 번째 옵션도 추가했습니다. 이는 인수를 사용하는 단순한 함수 호출 일뿐입니다. – jfriend00