非同步操作動態添加節點,導致在代碼中給添加的節點全局綁定事件或者獲取元素無效,上代碼: 那麼,問題出在哪裡呢? 事實上,ajax從後臺獲取數據再顯示到我們的頁面中的過程是非同步的,也就是說當我們利用ajax從後臺獲取值得時候,在ajax之後的代碼是一直往下執行著走的,而不會等著你ajax獲取並創建節點完 ...
非同步操作動態添加節點,導致在代碼中給添加的節點全局綁定事件或者獲取元素無效,上代碼:
$(function () { var IP = '...'; // 頁面中的預設編號起始值 和 公用IP首碼 showData(); function showData() { if ($('.content')) $('.content').remove(); $.ajax({ url:IP + '/get', type:'get', success:function (data) { var newInfo = ''; if(!data) return alert('對不起,沒有數據可供操作!'); newInfo +='<div class="btnBox">' + '<a href="javascript:;" class="remove">刪除</a>' + '<a href="javascript:;" class="change">修改</a>' + '</div>'; });$('body').append(newInfo); }, error:function (err) { alert(err); } }); } } //這是一段很明顯的通過JQuery-ajax前後臺交互並動態添加的代碼; //但是,如果你在該方法(showData())外面來給上述動態添加的a標簽添加事件或者獲取值的時候可能會出現無效的情況: $('.remove').click(function(){ alert('這是刪除按鈕!'); }); //頁面中則不會彈出(這是刪除按鈕!)的彈框;
那麼,問題出在哪裡呢?
事實上,ajax從後臺獲取數據再顯示到我們的頁面中的過程是非同步的,也就是說當我們利用ajax從後臺獲取值得時候,在ajax之後的代碼是一直往下執行著走的,而不會等著你ajax獲取並創建節點完成後再往下繼續執行,這便是非同步請求的機制,對於這個問題我們怎麼解決呢:
$(function () { var IP = '...'; // 頁面中的預設編號起始值 和 公用IP首碼 showData(); function showData() { if ($('.content')) $('.content').remove(); $.ajax({ url:IP + '/get', type:'get', success:function (data) { var newInfo = ''; if(!data) return alert('對不起,沒有數據可供操作!'); newInfo +='<div class="btnBox">' + '<a href="javascript:;" class="remove">刪除</a>' + '<a href="javascript:;" class="change">修改</a>' + '</div>'; });$('body').append(newInfo); // 當動態添加節點完成之後再給其中的按鈕綁定事件 $('.remove').click(function(){ alert('這是刪除按鈕!'); }); }, error:function (err) { alert(err); } }); } }
將綁定事件的代碼改到ajax內部,這樣讓動態添加完成之後再給其中的按鈕綁定事件,就可以達到我們所需要的效果了,這便是ajax的非同步機制
在以後的項目開發中,希望朋友們能夠正確理解ajax的機制,希望本篇隨筆能夠對你有所幫助!