2013-04-10 63 views
0

我有失去的“本”嵌套javascript函数失去“这个”

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会在这种情况下工作。我如何获得​​以返回我想要的rel#值而不是undefined

+0

它看起来像'tabNavClick'已经写的一个单击处理程序,所以为什么不注册它因此? :) – 2013-04-10 05:06:45

+0

@Jack老实说,B/C我不知道我在做什么。我试图写我的第一个插件。我知道点击处理程序是什么,但如何注册它可以帮助我处理这种情况? – heyjohnmurray 2013-04-10 05:16:23

+0

我在我的回答中解释了它。 – 2013-04-10 05:18:44

回答

2

$(this)的功能

tabNavClick($(this)); 

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

还可以传递函数tabNavClick的点击处理,并采取事件

tabNavItem.on("click",tabNavClick) 

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

谢谢!非常感谢你。 – heyjohnmurray 2013-04-10 05:03:54

+0

欢迎.. :) .. gald它帮助..快乐编码.. :) :) – bipen 2013-04-10 05:07:32

0

你可以只通过tabNavClick本身单击处理:

tabNavItem.on("click", tabNavClick); 

这会调用tabNavClickthis指向点击的项目。

您可以让tabNavClick返回false以防止事件冒泡。此外,你可以让tabNavClick接受的事件,以及:如果你想tabNavClick()有希望的this

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

,那么你需要指定,当你把它叫做:

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 Oooh,我也喜欢'.call()'方法:) – 2013-04-10 05:12:19

+0

@ jfriend00这和bipen的答案工作。非常感谢。我不认为我可以使用.call在这里b/c所有的例子,我看到使用它只显示它被用于原型继承的例子。你有什么好的资源可以阅读,以便更好地理解.call。我对它很陌生,你可以告诉我,我没有坚定的把握它。 – heyjohnmurray 2013-04-10 05:12:58

+0

@heyjohnmurray - MDN通常是我第一次参考。请参阅MDN上的[.call()](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call)。它可以用于任何函数调用。您可以使用如下搜索在Google中的MDN上搜索任何内容:“MDN .call”。请注意,我在我的答案中添加了一个更简单的第二个选项,它只是一个带有参数的直接函数调用。 – jfriend00 2013-04-10 05:14:19