最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解jQuery3.0的domManip函數(shù)

 更新時(shí)間:2016年09月01日 09:23:47   作者:snandy  
domManip函數(shù)可以說(shuō)是jquery中一個(gè)元老級(jí)工具函數(shù)了,domManip 的主要功能是為了實(shí)現(xiàn) DOM 的插入和替換。接下來(lái)通過(guò)本文給大家談?wù)刯Query3.0的domManip函數(shù)的理解,非常不錯(cuò),感興趣的朋友一起看看吧

domManip 這個(gè)函數(shù)的歷史由來(lái)已久,從 jQuery 1.0 版本開(kāi)始便存在了,一直到最新的 jQuery 版本??芍^是元老級(jí)工具函數(shù)。

domManip 的主要功能是為了實(shí)現(xiàn) DOM 的插入和替換。具體共為以下 5 個(gè)函數(shù)服務(wù)

•內(nèi)部后插入(append)

•內(nèi)部前插入(prepend)

•外部前插入(before)

•外部后插入(after)

•替換元素 (replaceWith,1.9.x 之前的版本沒(méi)有使用 domMainp)

而一個(gè) each 就生成了另外 5 個(gè)函數(shù):appendTo、prependTo、insertBefore、insertAfter、replaceAll

jQuery.each( {
  appendTo: "append",
  prependTo: "prepend",
  insertBefore: "before",
  insertAfter: "after",
  replaceAll: "replaceWith"
}, function( name, original ) {
  jQuery.fn[ name ] = function( selector ) {
    var elems,
      ret = [],
      insert = jQuery( selector ),
      last = insert.length - 1,
      i = 0;
    for ( ; i <= last; i++ ) {
      elems = i === last ? this : this.clone( true );
      jQuery( insert[ i ] )[ original ]( elems );
      // Support: Android <=4.0 only, PhantomJS 1 only
      // .get() because push.apply(_, arraylike) throws on ancient WebKit
      push.apply( ret, elems.get() );
    }
    return this.pushStack( ret );
  };
} );

如圖

內(nèi)部調(diào)用如圖

源碼

append: function() {
  return domManip( this, arguments, function( elem ) {
    if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
      var target = manipulationTarget( this, elem );
      target.appendChild( elem );
    }
  } );
},
prepend: function() {
  return domManip( this, arguments, function( elem ) {
    if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
      var target = manipulationTarget( this, elem );
      target.insertBefore( elem, target.firstChild );
    }
  } );
},
before: function() {
  return domManip( this, arguments, function( elem ) {
    if ( this.parentNode ) {
      this.parentNode.insertBefore( elem, this );
    }
  } );
},
after: function() {
  return domManip( this, arguments, function( elem ) {
    if ( this.parentNode ) {
      this.parentNode.insertBefore( elem, this.nextSibling );
    }
  } );
},
replaceWith: function() {
  var ignored = [];
  // Make the changes, replacing each non-ignored context element with the new content
  return domManip( this, arguments, function( elem ) {
    var parent = this.parentNode;
    if ( jQuery.inArray( this, ignored ) < 0 ) {
      jQuery.cleanData( getAll( this ) );
      if ( parent ) {
        parent.replaceChild( elem, this );
      }
    }
  // Force callback invocation
  }, ignored );
}

domManip 的實(shí)現(xiàn)

domManip 的主要功能就是添加 DOM 元素,因?yàn)樘砑拥奈恢貌煌峁┝怂膫€(gè)公開(kāi)函數(shù) append、prepend、before、after,此外還有一個(gè) replaceWith。簡(jiǎn)單說(shuō) domManip 就做了兩件事

1.先完成 DOM 節(jié)點(diǎn)添加

2.如果添加的 DOM 節(jié)點(diǎn)內(nèi)有 script 標(biāo)簽,需要額外處理下。對(duì)于可執(zhí)行的 script (通過(guò)type屬性判斷)則執(zhí)行其內(nèi)的腳本代碼,其它的則不執(zhí)行。

domManip 依賴(lài)的一個(gè)重要函數(shù)就是 buildFragment,為 DOM 插入提高了性能。

domManip 內(nèi)對(duì) script 節(jié)點(diǎn)元素做了特殊處理

1.script 無(wú) type 屬性,默認(rèn)會(huì)執(zhí)行其內(nèi)的 JS 腳本

2.script 的 type="text/javascript" 或 type="text/ecmascript" ,會(huì)執(zhí)行其內(nèi)的 JS 腳本

3.script 如果有 src 屬性,會(huì)執(zhí)行 $._evalUrl 請(qǐng)求遠(yuǎn)程的 JS 文件并執(zhí)行

4.其它不會(huì)執(zhí)行 JS 腳本,有時(shí)我們會(huì)用 script 來(lái)做 html 模板,如 underscore.js,type="text/template" 或 type="text/plain" 這種,其內(nèi)的 JS 都不會(huì)被執(zhí)行

此外 dataPriv.access( node, "globalEval" ),這一句標(biāo)示了如果該 script 已經(jīng)執(zhí)行過(guò),則不會(huì)再次執(zhí)行?;蛘哒f(shuō)執(zhí)行后會(huì)設(shè)置一個(gè) globalEval: true 的標(biāo)示。

domManip 內(nèi)部依賴(lài) buildFragment、restoreScript、disableScript、jQuery._evalUrl、DOMEval 這幾個(gè)小函數(shù),而 restoreScript、jQuery._evalUrl 也僅在 domManip 用到。

// Replace/restore the type attribute of script elements for safe DOM manipulation
function disableScript( elem ) {
  elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
  return elem;
}
function restoreScript( elem ) {
  var match = rscriptTypeMasked.exec( elem.type );
  if ( match ) {
    elem.type = match[ 1 ];
  } else {
    elem.removeAttribute( "type" );
  }
  return elem;
}
jQuery._evalUrl = function( url ) {
  return jQuery.ajax( {
    url: url,
    // Make this explicit, since user can override this through ajaxSetup (#11264)
    type: "GET",
    dataType: "script",
    cache: true,
    async: false,
    global: false,
    "throws": true
  } );
};

domManip 經(jīng)歷了各個(gè)版本的演變

1.

3.0.x 之前版本的 domManip 函數(shù)是掛在 jQuery 對(duì)象上面的(jQuery.fn.domManip),即通過(guò) $().domManip 方式可以訪(fǎng)問(wèn);3.0.x 后 domManip 是一個(gè)私有函數(shù),外部無(wú)法訪(fǎng)問(wèn)

2.

1.2.x 之前 domManip 有 4 個(gè)參數(shù);1.3.x ~ 1.9.x 是 3 個(gè)參數(shù);2.x 只有 2 個(gè)參數(shù);3.x 有 4 個(gè)參數(shù)

3.

1.9.x 之前的版本 replaceWith 沒(méi)有使用 domMainp

以上所述是小編給大家介紹的jQuery3.0的domManip函數(shù),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

最新評(píng)論

彭州市| 望城县| 天水市| 汶上县| 进贤县| 图木舒克市| 房产| 仁寿县| 信阳市| 阿鲁科尔沁旗| 甘南县| 旬邑县| 林西县| 宿迁市| 会东县| 喀什市| 翼城县| 三门县| 宁都县| 海原县| 白银市| 兴业县| 清镇市| 黄山市| 龙井市| 清河县| 固安县| 巴马| 循化| 河东区| 老河口市| 津市市| 聊城市| 鄂尔多斯市| 南雄市| 桂东县| 延寿县| 沂南县| 大港区| 高尔夫| 新乐市|