這篇依然是跟 dom
相關的方法,側重點是操做 dom
的方法。javascript
讀Zepto源碼系列文章已經放到了github上,歡迎star: reading-zeptohtml
本文閱讀的源碼爲 zepto1.2.0java
remove: function() { return this.each(function() { if (this.parentNode != null) this.parentNode.removeChild(this) }) },
刪除當前集合中的元素。node
若是父節點存在時,則用父節點的 removeChild
方法來刪掉當前的元素。git
zepto
中 after
、 prepend
、 before
、 append
、insertAfter
、 insertBefore
、 appendTo
和 prependTo
都是經過這個類似方法生成器生成的。github
adjacencyOperators = ['after', 'prepend', 'before', 'append']
首先,定義了一個類似操做的數組,注意數組裏面只有 after
、 prepend
、 before
、 append
這幾個方法名,後面會看到,在生成這幾個方法後,insertAfter
、 insertBefore
、 appendTo
和 prependTo
會分別調用前面生成的幾個方法。api
function traverseNode(node, fun) { fun(node) for (var i = 0, len = node.childNodes.length; i < len; i++) traverseNode(node.childNodes[i], fun) }
這個方法遞歸遍歷 node
的子節點,將節點交由回調函數 fun
處理。這個輔助方法在後面會用到。數組
adjacencyOperators.forEach(function(operator, operatorIndex) { var inside = operatorIndex % 2 //=> prepend, append $.fn[operator] = function() { // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings var argType, nodes = $.map(arguments, function(arg) { var arr = [] argType = type(arg) if (argType == "array") { arg.forEach(function(el) { if (el.nodeType !== undefined) return arr.push(el) else if ($.zepto.isZ(el)) return arr = arr.concat(el.get()) arr = arr.concat(zepto.fragment(el)) }) return arr } return argType == "object" || arg == null ? arg : zepto.fragment(arg) }), parent, copyByClone = this.length > 1 if (nodes.length < 1) return this return this.each(function(_, target) { parent = inside ? target : target.parentNode // convert all methods to a "before" operation target = operatorIndex == 0 ? target.nextSibling : operatorIndex == 1 ? target.firstChild : operatorIndex == 2 ? target : null var parentInDocument = $.contains(document.documentElement, parent) nodes.forEach(function(node) { if (copyByClone) node = node.cloneNode(true) else if (!parent) return $(node).remove() parent.insertBefore(node, target) if (parentInDocument) traverseNode(node, function(el) { if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' && (!el.type || el.type === 'text/javascript') && !el.src) { var target = el.ownerDocument ? el.ownerDocument.defaultView : window target[