欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解jQuery3.0的domManip函數

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

domManip 這個函數的歷史由來已久,從 jQuery 1.0 版本開始便存在了,一直到最新的 jQuery 版本??芍^是元老級工具函數。

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

•內部后插入(append)

•內部前插入(prepend)

•外部前插入(before)

•外部后插入(after)

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

而一個 each 就生成了另外 5 個函數: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 );
  };
} );

如圖

內部調用如圖

源碼

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 的實現(xiàn)

domManip 的主要功能就是添加 DOM 元素,因為添加的位置不同而提供了四個公開函數 append、prepend、before、after,此外還有一個 replaceWith。簡單說 domManip 就做了兩件事

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

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

domManip 依賴的一個重要函數就是 buildFragment,為 DOM 插入提高了性能。

domManip 內對 script 節(jié)點元素做了特殊處理

1.script 無 type 屬性,默認會執(zhí)行其內的 JS 腳本

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

3.script 如果有 src 屬性,會執(zhí)行 $._evalUrl 請求遠程的 JS 文件并執(zhí)行

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

此外 dataPriv.access( node, "globalEval" ),這一句標示了如果該 script 已經執(zhí)行過,則不會再次執(zhí)行?;蛘哒f執(zhí)行后會設置一個 globalEval: true 的標示。

domManip 內部依賴 buildFragment、restoreScript、disableScript、jQuery._evalUrl、DOMEval 這幾個小函數,而 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 經歷了各個版本的演變

1.

3.0.x 之前版本的 domManip 函數是掛在 jQuery 對象上面的(jQuery.fn.domManip),即通過 $().domManip 方式可以訪問;3.0.x 后 domManip 是一個私有函數,外部無法訪問

2.

1.2.x 之前 domManip 有 4 個參數;1.3.x ~ 1.9.x 是 3 個參數;2.x 只有 2 個參數;3.x 有 4 個參數

3.

1.9.x 之前的版本 replaceWith 沒有使用 domMainp

以上所述是小編給大家介紹的jQuery3.0的domManip函數,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • jquery+json實現(xiàn)分頁效果

    jquery+json實現(xiàn)分頁效果

    這篇文章主要為大家詳細介紹了如何利用jquery結合json實現(xiàn)分頁效果,感興趣的小伙伴們可以參考一下
    2016-03-03
  • jQuery Ajax之load()方法

    jQuery Ajax之load()方法

    jQuery對Ajax操作進行了封裝,在jQuery中$.ajax()方法屬于最底層的方法,第2層是laod()、$.get()和$.post()方法,第3層是$.getScript()和$.getJSON()方法。
    2009-10-10
  • jquery為頁面增加快捷鍵示例

    jquery為頁面增加快捷鍵示例

    這篇文章主要介紹了jquery為頁面增加快捷鍵的示例,需要的朋友可以參考下
    2014-01-01
  • 基于jquery實現(xiàn)人物頭像跟隨鼠標轉動

    基于jquery實現(xiàn)人物頭像跟隨鼠標轉動

    一款非常乖巧的人物頭像跟隨鼠標轉動效果,在瀏覽器屏幕內,人物臉龐始終面向鼠標轉動,本篇文章給大家介紹基于jquery實現(xiàn)人物頭像跟隨鼠標轉動,有需要的朋友可以參考下
    2015-08-08
  • 關于jQuery新的事件綁定機制on()的使用技巧

    關于jQuery新的事件綁定機制on()的使用技巧

    本篇文章介紹了,關于jQuery新的事件綁定機制on()的使用技巧。需要的朋友參考下
    2013-04-04
  • jQuery實現(xiàn)容器間的元素拖拽功能

    jQuery實現(xiàn)容器間的元素拖拽功能

    這篇文章主要為大家詳細介紹了jQuery實現(xiàn)容器間的元素拖拽功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Jquery表單驗證失敗后不提交的解決方法

    Jquery表單驗證失敗后不提交的解決方法

    很多人可能都會遇到在調試的時候用了return了false,可為什么還會提交呢?這個問題我最近也碰到了,嘗試了多次也沒有用,后來終于發(fā)現(xiàn)了其中的問題,下面分享處理給大家,讓同樣遇到這個問題的朋友們能夠看看,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • easyUI combobox實現(xiàn)聯(lián)動效果

    easyUI combobox實現(xiàn)聯(lián)動效果

    這篇文章主要為大家詳細介紹了easyUI combobox實現(xiàn)聯(lián)動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • jquery實現(xiàn)浮動在網頁右下角的彩票開獎公告窗口代碼

    jquery實現(xiàn)浮動在網頁右下角的彩票開獎公告窗口代碼

    這篇文章主要介紹了jquery實現(xiàn)浮動在網頁右下角的彩票開獎公告窗口代碼,涉及jquery窗體的彈出及隱藏相關實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • 讀jQuery之十二 刪除事件核心方法

    讀jQuery之十二 刪除事件核心方法

    使用jQuery刪除事件(或稱解除事件綁定)有三個函數:unbind、die和undelegate。這三個方法都依賴于未公開的jQuery.event.remove(后續(xù)使用.remove簡寫)。此為刪除事件的核心方法。
    2011-07-07

最新評論