国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript動態綁定詳解

2024-05-06 15:26:43
字體:
來源:轉載
供稿:網友

問題描述:

假設我們的網頁中動態生成了一個按鈕,在這個按鈕生成之前我們按照一般的事件綁定方法為此按鈕綁定了觸發事件,但是問題是綁定的事件并沒有生效(JavaScript中為元素綁定的事件失效)

分析

1.首先我們來看一下這個按鈕是怎么回事:

問題中按鈕有一個很關鍵的特性:動態生成,也就是說是在網頁加載完成之后執行某些操作才產生的,它一開始是不存在的;

2.然后我們來分析一下事件的綁定

對于動態生成的元素,它不同于一般的網頁既有元素,它的事件綁定不能通過普通的事件綁定實現。

3.關于JavaScript事件綁定的小解(針對本題盜圖解析)

這里寫圖片描述

由圖中我們可以看到事件冒泡即由最具體的元素(文檔嵌套最深節點)接收,然后逐步上傳至document

事件捕獲會由最先接收到事件的元素然后傳向最里邊(我們可以將元素想象成一個盒子裝一個盒子,而不是一個積木堆積)

然后我們進入dom事件流

DOM2級事件規定事件包括三個階段:

① 事件捕獲階段

② 處于目標階段

③ 事件冒泡階段

我們分析一下第一階段就可以知道為什么了,js中一般事件綁定是在網頁生成的時候針對具體元素去綁定的,那么請問:網頁初始生成時按鈕存在嗎?答:NOP。這就是為什么事件沒有綁定上去,因為都沒找到元素啊啊啊啊啊,綁個毛線

解決方法(jQuery on方法)

通過將事件綁定到存在的父元素上讓子元素的事件有效

jQuery on用法格式:

$(selector).on(event,childSelector,data,function,map)

示例,比如說id為btn的元素為動態生成,它的父元素為btnParent(必須是網頁加載時就有的元素,也可以直接綁定到body上去)那么我們可以這樣為它綁定處理事件

$("#btnParent").on("click","#btn",function(){  console.log('binded!'); });

如果想要更深層次的理解,那么請跟我一起閱讀一下jQuery.on()的源碼實現

on: function( types, selector, data, fn, /*INTERNAL*/ one ) {  var type, origFn;  // 類型可以使類型映射或者句柄映射  if ( typeof types === "object" ) {    // ( types-Object, selector, data )    if ( typeof selector !== "string" ) {      // ( types-Object, data )      data = data || selector;      selector = undefined;    }    // 遍歷types對象,針對每一個屬性綁定on()方法    // 將types[type]作為fn傳入    for ( type in types ) {      this.on( type, selector, data, types[ type ], one );    }    return this;  }  // 參數修正  // jQuery這種參數修正的方法很好  // 可以兼容多種參數形式  // 可見在靈活調用的背后做了很多處理  if ( data == null && fn == null ) {    // ( types, fn )    fn = selector;    data = selector = undefined;  } else if ( fn == null ) {    if ( typeof selector === "string" ) {      // ( types, selector, fn )      fn = data;      data = undefined;    } else {      // ( types, data, fn )      fn = data;      data = selector;      selector = undefined;    }  }  if ( fn === false ) {    // fn傳入false時,阻止該事件的默認行為    // function returnFalse() {return false;}    fn = returnFalse;  } else if ( !fn ) {    return this;  }  // one()調用on()  if ( one === 1 ) {    origFn = fn;    fn = function( event ) {      // Can use an empty set, since event contains the info      // 用一個空jQuery對象,這樣可以使用.off方法,      // 并且event帶有remove事件需要的信息      jQuery().off( event );      return origFn.apply( this, arguments );    };    // Use same guid so caller can remove using origFn    // 事件刪除依賴于guid    fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );  }  // 這里調用jQuery的each方法遍歷調用on()方法的jQuery對象  // 如$('li').on(...)則遍歷每一個li傳入add()  // 推薦使用$(document).on()或者集合元素的父元素  return this.each( function() {    jQuery.event.add( this, types, fn, data, selector );  });},            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 左云县| 维西| 仁寿县| 金门县| 凯里市| 五大连池市| 桐柏县| 开封县| 双流县| 西安市| 安乡县| 西峡县| 太和县| 利川市| 富源县| 神农架林区| 德昌县| 拉孜县| 康乐县| 揭西县| 灵寿县| 贡嘎县| 陵水| 凤凰县| 措勤县| 北流市| 灯塔市| 东至县| 时尚| 象山县| 承德县| 辽源市| 临澧县| 巴彦淖尔市| 昌宁县| 博爱县| 左权县| 木里| 武义县| 龙川县| 阳城县|