我試圖顯示一個表並導致某些操作發生,如果用戶單擊表中的單元格。我的javascript(使用jquery-3.1.1.min)看起來是這樣的:
$(function() {
function tdHeader(key) {
return '<td class="mytable-cell" data-key="' + key + '">';
}
function clickHandler() {
alert("Key: " + $(this).data("key"));
}
function displayTable() {
var tabHTML = '<table class="mmmtab">';
tabHTML += '<tr><th>Data1</th><th>Data2</th><th>Data3</th></tr>';
for (var i = 0; i < 3; i++) {
tabHTML += '<tr>';
for (var j = 0; j < 3; j++) {
key = i + "-" + j;
tabHTML += tdHeader(key) + ((i + 1) * (j + 1)) + '</td>';
}
tabHTML += '</tr>';
}
tabHTML += '</table>';
$("#mytable").html(tabHTML);
$(".mytable-cell").click(clickHandler); // Version 1
// $(".mytable-cell").click(function() {clickHandler();}); // Version 2
}
displayTable();
});
什麼我發現是,如果我使用版本1設置回調,那麼如果我點擊一個單元格中,警報框顯示正確的密鑰。但是,如果我使用版本2,則警報框會顯示「密鑰:未定義」。
發生了什麼事情,以及爲什麼它會影響我使用哪種回調?
[假設我需要版本2,因爲我想傳遞一些本地數據到處理程序,我可以通過將$(this).data("key")
作爲參數傳遞給處理程序來解決我的問題。但我仍然想知道爲什麼它會這樣做。]
這兩個解決方案的工作 - 謝謝。 – ajb
這將在正確的上下文中調用'clickHandler',但不會傳遞傳遞給事件回調的參數。所以你不能訪問'clickHandler'中的'event'對象。我不會在這種情況下使用綁定,通常只有當你想要綁定一個特定的上下文到一個函數供以後使用時(比如'$(「。mytable-cell」)),你才使用'bind'。click(obj.foo。 bind(obj))'),'call'和'apply',如果你想改變當前調用的上下文@ajb –