2017-04-11 118 views
0

我有一個onclick事件將一個$(this)參數傳遞給一個函數。將參數傳遞給jQuery中的單擊事件

<tr class="myTr"> 
    <td> 
    Han Solo 
    </td> 
</tr> 

<script> 
$('body').on('click','.myTr',function(){ 
    doSomething($(this)); 
}); 
</script> 

現在,我想再添加一個步驟。我想顯示一個按鈕,點擊此按鈕後,應該調用doSomething()

<tr class="myTr"> 
    <td> 
    Han Solo 
    </td> 
</tr> 
<button id="myBtn" style="display:none">Submit</button> 

<script> 
    $('body').on('click','.myTr',function(){ 
    $('#myBtn').show(); 
    }); 
    $('#myBtn').click(function(){ 
    doSomething(???); 
    }); 
</script> 

如何將$(this)傳遞給第二次單擊事件?

我可以很容易的$(this)存儲作爲按鈕的標籤,像這樣:

$('body').on('click','.myTr',function(){ 
    $('#myBtn').attr('origin', $(this)); 
    $('#myBtn').show(); 
}); 
$('#myBtn').click(function(){ 
    var tr = $(this)attr('origin'); 
    doSomething(tr); 
}); 

但我不知道是否有解決這個更優雅的方式?

+1

使用數據屬性,而不是attr的。 '$('#myBtn')。data('origin',$(this));'和'$(this).data('origin');' – epascarello

+1

使用全局變量? – Roljhon

+1

其他選項是解除綁定並重新綁定click事件,更新腳本以使用帶有閉包的變量。我會使用數據attr。 – epascarello

回答

1

你需要設置以某種方式狀態

數據屬性:

$('body').on('click','.myTr',function(){ 
    $('#myBtn').data('origin', $(this)).show(); 
}); 
$('#myBtn').click(function(){ 
    var tr = $(this).data('origin'); 
    doSomething(tr); 
}); 

局部變量

(function() { 
    var active; 
    $('body').on('click','.myTr',function(){ 
     active = $(this); 
     $('#myBtn').show(); 
    }); 
    $('#myBtn').click(function(){  
     doSomething(active); 
    }); 
}()); 

重新綁定事件:

$('body').on('click','.myTr',function(){ 
    var active = $(this); 
    $('#myBtn') 
    .off("click.tr") 
    .on("click.tr", function() { 
     doSomething(active); 
    }) 
    .show(); 
}); 

CSS類:

$('body').on('click','.myTr',function(){ 
    $(".myTr.active").removeClass("active"); 
    $(this).addClass("active"); 
    $('#myBtn').show(); 
}); 
$('#myBtn').click(function(){ 
    var tr = $(".myTr.active"); 
    doSomething(tr); 
}); 
1

只需使用$.proxy從jQuery的

$('body').on('click','.myTr',function(){ 
 
    $('#myBtn').show(); 
 

 
    $('#myBtn').off('click').on('click', $.proxy(function(e) { 
 
     doSomething(this) 
 
     // how you access the context of the button is using $(e.currentTarget) 
 
    }, this)); 
 
}); 
 

 

 
window.doSomething = function(elem){ 
 
\t console.log(elem) 
 
}
#myBtn{ 
 
\t display:none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="button" class="myTr" value="test"> 
 
<input type="button" id="myBtn" value="button">

+0

此代碼存在缺陷,您需要解除最後一次附加的點擊。還有,你爲什麼使用'bind'而不是'on'?它已被棄用。 – epascarello

+0

@epascarello我不是jQuery專家,我只是知道如何使用我的資源並理解它們,我剛剛開始「綁定」,因爲我不太瞭解「on」。我不明白他爲什麼需要解除綁定?他只是試圖傳遞上下文,他甚至可以訪問我在代碼中聲明的按鈕本身的上下文。我不想爭辯,我只是想幫助。有一個很好的例子 – Roljhon

+1

在你的例子中點擊按鈕「myTr」兩次,比單擊myBtn。您將看到兩個console.log行,因爲現在多個onlcick事件將被綁定到該按鈕。 – epascarello

相關問題