0

「this」の適切なスコープを失うネストされた関数があります

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ですか?

4

3 に答える 3

2

$(this)関数に渡す

  tabNavClick($(this));

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

さらに、関数 tabNavClick をクリック ハンドラーとして渡し、イベントを受け取ることができます。

  tabNavItem.on("click",tabNavClick)

  function tabNavClick(e){
      e.preventDefault();
      var that=$(this);
   }
于 2013-04-10T05:00:09.173 に答える
2

tabNavClick()目的の値が必要な場合thisは、呼び出すときにそれを指定する必要があります。

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()or.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);
}
于 2013-04-10T05:08:40.953 に答える
0

tabNavClickクリック ハンドラーとして自分自身を渡すことができます。

tabNavItem.on("click", tabNavClick);

これは、クリックされた項目を指すtabNavClick方法で呼び出します。this

イベントがバブリングするのを防ぐために、tabNavClickreturnを許可することができます。falseさらに、tabNavClickイベントを受け入れさせることもできます。

function tabNavClick(e) {
    // ...
    e.preventDefault();
}
于 2013-04-10T05:04:16.267 に答える