1. 程式人生 > >jquery html 動態新增元素繫結事件

jquery html 動態新增元素繫結事件

由於實際的需要,有時需要往網頁中動態的插入HTML內容,並在插入的節點中繫結事件處理函式。我們知道,用Javascript向HTML文件中 插入內容,有兩種方法,

一種是在寫HTML程式碼寫入JS,然後插入到文件中;

另外一種是通過ajax的方式,從伺服器獲取資料,然後用js把獲取的資料經 過處理後插入文件中;

兩種方法各有特點,本文將分析新插入到文件中的元素的事件繫結問題,並假定新插入的物件不做內聯的事件繫結(即不用類似 <a onclick=””>的形式)。所有的示例將會用到jQuery和原生Javascript。

情況一: HTML程式碼存放在JS中,請看以下程式碼:

複製程式碼
    <body>
    <p>第1行內容</p>
    <p>第2行內容</p>
    <p>第3行內容</p>
    <script>
    var appendhtml=document.createElement("p");
    appendhtml.innerHTML="這是插入的內容";
    document.body.appendChild(appendhtml);
    var nodep=document.getElementsByTagName("p");
    
for (var i=0;i<nodep.length;i++){ nodep[i].onclick=function(){ console.log("Click Event!"); } } </script> </body>
複製程式碼

上面的程式碼是用原生的Javascript生成的,當此程式碼執行時,js會在頁面中生成第四個P標籤,且點選這四個標籤的時候,都會觸發相應的動 作。那麼是不是就是說,用js生成的HTML內容,都可以被繫結相應的事件呢?答案是否定的,在上面程式碼的script標籤中,有兩個程式碼段,程式碼段一是 用來向HTML中插入內容的,程式碼段二是用來繫結事件的,如果把程式碼段一和程式碼段二互換位置,發現JS生成的第四個P標籤沒有繫結上click事件。用以 下程式碼的jquery測試:

1 2 3 4 5 6 $(function(){ $("p").click(function(){ console.log("Click Event"); }) $("<p>這是生成的內容</p>").appendTo("body"); })

發現結果也一樣,事件執行成功與否也程式碼段的順序有直接的關係。其實原來很好分析,無論是利用getElementsByTagName還是jquery的選擇器,當需要的內容還沒有被插入時,選擇器只會選擇頁面中已經存在的元素所以事先沒有存在元素是繫結不了事件的。

但是,實際情況是,工作中有可能需要把後來生成的元素繫結上事件,並註冊上事件處理函式。例如本網站的留言系統,第一次載入只會顯示固定條數的評 論,如果評論超過一定數量,剩下的會用ajax的方式進行載入。所有的留言最後都有個回覆功能,點選可以恢復相應的留言,也就是說,動態載入上來的留言, 也許要繫結click事件,並註冊上回復留言的函式。當然偷懶的方法是,為ajax載入上來的內容再註冊一個click並再繫結一次相應的函式,但這加大 了程式碼的冗餘度,增加系統開銷,還會使程式碼變得難以理解。那麼更好的解決辦法是什麼呢?

留言系統的回覆功能

可以這樣理解,無論HTML內容是不是JS生成的,只要沒有跨域,所有頁面內的元素都屬於這個頁面,都能夠繫結事件,JS中有個非常重要的概念叫事件冒泡,簡單來講,就是子元素產生的事件,會一直冒泡到最頂級父元素,並能夠被父元素監測到。請看下圖:

事件冒泡

那麼,我能不能在被插入元素的父元素上監測冒泡產生的事件,並回調相應的函式呢?答案是當然是肯定的。來看下面的例子,注意網頁面裡插入內容是在JS程式碼的最後。

複製程式碼
    <script>
    $(function(){
     $("body").delegate("p","click",function(){
        console.log("Click Event");
     })
    $("<p>這是生成的內容</p>").appendTo("body");
    })
    </script>
複製程式碼

這是,發現所有的P元素點選都產生了輸出,說明程式碼執行成功。這裡我們用到了jQuery的delegate函式,來看一下官方解釋:

Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.
根據特定的根元素,把一個或者多個事件註冊到指定的元素上,不論這個元素現在是否存在。

在jQuery1.7.3以上的版本中,on方法也可以做這件事,官方有示例說明,這裡不再贅述。

比如有一些情況多次從後臺獲取動態內容到前臺,點選的時候會觸發多次,還要使用  $("body").undelegate();  解除之前的繫結 然後再一次重新繫結。

1 2 3 4 $("body").undelegate(); $("body").delegate(".reply_check_btn""click"function () { alert('adsadsa'); });

jQuery中繫結事件一般使用bind,或者click,但是這隻能是對已經載入好的元素定義事件,那些後來新增插入的元素則需要另行繫結。在1.7版本以前使用live。但是在1.8版本以後推薦使用on。這裡介紹jQuery中如何給動態新增的元素繫結事件
在實際開發中會遇到要給動態生成的html元素繫結觸發事件的情況

例如

?
1 2 3 <div id="testdiv"> <ul></ul> </div>

需要給<ul>裡面動態新增的<li>標籤新增click事件

jquery 1.7版以前使用live動態繫結事件

?
1 2 $("#testdiv ul li").live("click",function(){ });

jquery 1.7版以後使用on動態繫結事件

?
1 2 3 $("#testdiv ul").on("click","li", function() { //do something here });

轉自:http://www.cnblogs.com/timelesszhuang/p/4949167.html (改部分)


相關推薦

jquery html 動態新增元素事件

由於實際的需要,有時需要往網頁中動態的插入HTML內容,並在插入的節點中繫結事件處理函式。我們知道,用Javascript向HTML文件中 插入內容,有兩種方法, 一種是在寫HTML程式碼寫入JS,然後插入到文件中; 另外一種是通過ajax的方式,從伺服器獲取資料,然

處理jQuery append加入的元素 事件無效的方法

問題是:通過jQuery append(或者before、after,一樣)新新增進網頁的元素,常用的事件不能觸發,比如:append了id 為 abc 的元素,那麼 $(#abc).click(function(){})是沒有效果的。 1. 網上說要用live()函式,親

動態動態生成元素事件不生效解決方法

JQ動態生成的元素,無法繫結事件,查詢到的原因是:繫結事件的元素必須是構造頁面時已經存在的,假如構造元素是不存在,是後動態生成,則繫結不了,解決方法,通過on()繫結舉例:$("body").on("c

jquery html動態新增元素事件

在實際開發中會遇到要給動態生成的html元素繫結觸發事件的情況: <div id="testdiv">    <ul></ul> </div> 假設我們要給ul動態新增的<li>繫結click事件形成如下結果 &

關於 jquery html 動態新增元素事件——On()

Ajax動態生成的資料,動作繫結需要重新執行1 $(document).on('click','.btn1',function(){}); 2 3 替換: 4 5 $('btn1').on('click') = function(){};JQuery On()定義和用法on() 方法在被選元素及子元素上新

jQuery動態新增元素事件

  今天在做專案是時候發現動態新增的元素不能繫結事件,由於本人js和jquery技術有限,所以也不知道原因,一查才知道,動態新增的元素繫結事件就會失效,所以修改了一下。 jquery中繫結事件一般使用bind,或者click,但是這隻能是對已經載入好的元素定義事件,那些後來新增插入

jQuery-為動態新增元素事件(以及不重複新增新的內容)

在使用jQuery的方式為元素繫結事件時,我經常使用bind或者click,但這隻能為頁面已經載入好的元素繫結事件。像需要用ajax的方式請求遠端資料來動態新增頁面元素時,顯然以上幾種繫結事件的方式是無效的 $(selector).bind(event,d

Jquery動態新增元素事件:live() delegate() on()

給已存在的元素繫結事件時可以直接寫: $(".class a").click(function(){ }) 但是對於動態生成並append()到頁面上的元素來說,就不能直接用上面的方法來繫結事件了。 在Jquery 1.7之前我們可以通過live()和delega

利用jquery動態載入的元素事件

工作中經常會遇見利用ajax載入dom元素,這樣就不能給動態載入的元素繫結時間 此時可以利用jquery的on方法解決(老版本使用live方法) $(document).on("click",".edit-btn",function(){             aler

jQuery動態元素事件的方式

在使用jQuery的方式為元素繫結事件時,我經常使用bind或者click,但這隻能為頁面已經載入好的元素繫結事件。像需要用ajax的方式請求遠端資料來動態新增頁面元素時,顯然以上幾種繫結事件的方式是無效的,具體寫法如下圖。 $(selector).bind(event

41. jQuery-使用unbind()方法移除元素事件

1.效果圖 2.html程式碼 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>41. jQuery-使用unbind()方法移出元

AngularJS中,如何給動態生成的元素事件

1 . 我們知道在jquery中,動態生成一個元素,如果要在動態生成元素的同時,動態繫結事件,可以通過live/on方法(在jquery3.0中已經廢除了bind方法)。 2 . 在angularjs中,操作DOM一般在指令中完成,事件監聽機制是在對於已經靜態

從零開始學 Web 之 jQuery(五)操作元素其他屬性,為元素事件

一、操作元素的寬和高 1、方法一 元素.css("width"); 元素.css("height"); 最後得到的是字串型別的,比如 200px。 如果我們在設定為原來寬高2倍的時候,就要先把獲取的寬高轉換成數字型別,再乘以2,這樣操作比較麻煩,有沒有簡單的方法呢? 2、方法二 元素.width(屬性

jQuery給一個元素事件前,一次點選會多次觸發的問題所在

如果在給一個元素繫結事件後,再次繫結事件就會出現多次繫結的情況,此時就會出現多次觸發,解決方法我採用的是,在繫結事件前進行解綁,bind繫結的時間用ubbind解綁,其他繫結方法用對應的解綁方法解綁。

微信小程式 js動態給前臺元素事件

//js動態給前臺繫結事件 var myList = ["items1","items2","items3"] pageObject = { data:{ actionSheet

jquery查詢元素,事件,DOM操作

//remove 會移除元素和元素關聯的事件//detach 只會移除元素$("#btn").click(function(){alert("123123");}); 遍歷節點$("strong").each(function(i,e){ //i  下標  從0開始 //e  元素console.log(i,

關於js動態渲染的元素事件遇到的坑

總結一下今天專案中遇到的關於動態渲染元素繫結事件遇到的一些坑。 首先作為後臺管理系統除左邊側邊欄外,右邊主體部分都是動態渲染出來的。 第一:在給右側主體裡面元素繫結事件的時候,不要直接on繫結,而是用父元素代理事件來繫結,直接on是綁不上去的。 第二:因為是動態渲染的元素

為未來元素事件(JavaScript和jquery兩種方法對比)

小白 ~_~!!  日常打醬油  一般我們為已經存在的元素繫結事件,那麼直接獲取這個元素的id,直接繫結上去就可以了. 但當這個元素不存在,將會我們又會新增進去的時候,直接獲取目標元素id繫結事件就會對未來新新增的元素失效了!!.  也就是你後來新新增這個元素,是無法被觸發的

jquery未來元素事件

對未來元素繫結,不能用bind。 1、可以用live代替,但是要注意jquery的版本,根據官方文件,從1.7開始就不推薦live和delegate了,1.9裡就去掉live了。  2、不支援live之後什麼代替live呢,是on,用法如下所示: //放在$(functio

jquery中有兩種事件及移除事件

今天專案中需要用到這種方法所以記錄一下: /* 1、eventName $("button").click(function(){}) 部分事件不支援 2、on(ecentName,fn) $("button").on('click',function(){}) 所有事件