$(function() {
$('#remove_favorite_btn').click(function (e){
e.preventDefault();
$.ajax({
type: "GET",
url: ,
success: function(data){
$('#remove_favorite_btn').attr('id', 'add_favorite_btn');
}
});
});
$('#add_favorite_btn').click(function (e){
e.preventDefault();
$.ajax({
type: "GET",
url: ,
success: function(data){
$('#add_favorite_btn').attr('id', 'remove_favorite_btn');
}
});
});
});
都在同一個頁面
當 add_favorite_btn click 後,成功則將 add_favorite_btn 的 id 屬性改為 remove_favorite_btn
此時我在按下去,照我的想法是可以直接啟動 remove_favorite_btn event
但結果他還是在運行 add_favorite_btn 的活動,而不是 remove_favorite_btn
怎麼會這樣?
遇到你想綁定事件到動態新增/變動的DOM上的時候,你要使用 event delegate。
https://jsbin.com/yomupamevi/edit?html,console,output
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
<script src="https://code.jquery.com/jquery-3.1.0.js"></script>
</head>
<body>
<button id="add">add</button>
</body>
</html>
<script>
$('body').on('click', '#add',function(){
$(this).attr('id', 'remove');
console.log("1");
});
$('body').on('click', '#remove',function(){
$(this).attr('id', 'add');
console.log("2");
});
</script>
你可以利用像這樣,用父層級DOM傳遞事件綁定到新增/變動的DOM,但是如果父層級直接用document或body綁定,DOM數量一多,會有效能問題,盡量使用最近的父層級是原則。
你可以當作是按鈕即使改變了id
,但按鈕仍然是原本那個按鈕,綁在它身上的行為自然不會有改變
下面的code可以參考看看
$('#add_favorite_btn').click(function (e) {
// 新增按鈕按下去之後,改成移除按鈕
changeToRemove(this);
});
/**
新增變成移除
*/
function changeToRemove(btn) {
// 這邊傳進來的 btn 還不是 jquery 物件
// 所以用 $(btn)
$(btn).attr('id', 'remove_favorite_btn');
// 由於jquery綁定事件會一直疊加下去,所以先解綁再綁定要做的事
$(btn).unbind('click').click(function (e) {
e.preventDefault();
// 已經解除原本的行為了,這邊綁定成正確的行為: 移除按鈕按下去會變成新增按鈕
changeToAdd(btn);
});
}
/**
移除變成新增
*/
function changeToAdd(btn) {
$(btn).attr('id', 'add_favorite_btn');
$(btn).unbind('click').click(function (e) {
e.preventDefault();
changeToRemove(btn);
});
}