1 /** 2 * @fileOverview import methods from DOM to NodeList.prototype 3 * @author yiminghe@gmail.com 4 */ 5 KISSY.add('node/attach', function (S, DOM, Event, NodeList, undefined) { 6 7 var NLP = NodeList.prototype, 8 makeArray = S.makeArray, 9 // DOM 添加到 NP 上的方法 10 // if DOM methods return undefined , Node methods need to transform result to itself 11 DOM_INCLUDES_NORM = [ 12 "nodeName", 13 "equals", 14 "contains", 15 "scrollTop", 16 "scrollLeft", 17 "height", 18 "width", 19 "innerHeight", 20 "innerWidth", 21 "outerHeight", 22 "outerWidth", 23 "addStyleSheet", 24 // "append" will be overridden 25 "appendTo", 26 // "prepend" will be overridden 27 "prependTo", 28 "insertBefore", 29 "before", 30 "after", 31 "insertAfter", 32 "test", 33 "hasClass", 34 "addClass", 35 "removeClass", 36 "replaceClass", 37 "toggleClass", 38 "removeAttr", 39 "hasAttr", 40 "hasProp", 41 // anim override 42 // "show", 43 // "hide", 44 // "toggle", 45 "scrollIntoView", 46 "remove", 47 "empty", 48 "removeData", 49 "hasData", 50 "unselectable", 51 52 "wrap", 53 "wrapAll", 54 "replaceWith", 55 "wrapInner", 56 "unwrap" 57 ], 58 // if return array ,need transform to nodelist 59 DOM_INCLUDES_NORM_NODE_LIST = [ 60 "filter", 61 "first", 62 "last", 63 "parent", 64 "closest", 65 "next", 66 "prev", 67 "clone", 68 "siblings", 69 "contents", 70 "children" 71 ], 72 // if set return this else if get return true value ,no nodelist transform 73 DOM_INCLUDES_NORM_IF = { 74 // dom method : set parameter index 75 attr:1, 76 text:0, 77 css:1, 78 style:1, 79 val:0, 80 prop:1, 81 offset:0, 82 html:0, 83 outerHTML:0, 84 data:1 85 }, 86 // Event 添加到 NP 上的方法 87 EVENT_INCLUDES = [ 88 "on", 89 "detach", 90 "fire", 91 "fireHandler", 92 "delegate", 93 "undelegate" 94 ]; 95 96 97 function accessNorm(fn, self, args) { 98 args.unshift(self); 99 var ret = DOM[fn].apply(DOM, args); 100 if (ret === undefined) { 101 return self; 102 } 103 return ret; 104 } 105 106 function accessNormList(fn, self, args) { 107 args.unshift(self); 108 var ret = DOM[fn].apply(DOM, args); 109 if (ret === undefined) { 110 return self; 111 } 112 else if (ret === null) { 113 return null; 114 } 115 return new NodeList(ret); 116 } 117 118 function accessNormIf(fn, self, index, args) { 119 120 // get 121 if (args[index] === undefined 122 // 并且第一个参数不是对象,否则可能是批量设置写 123 && !S.isObject(args[0])) { 124 args.unshift(self); 125 return DOM[fn].apply(DOM, args); 126 } 127 // set 128 return accessNorm(fn, self, args); 129 } 130 131 S.each(DOM_INCLUDES_NORM, function (k) { 132 NLP[k] = function () { 133 var args = makeArray(arguments); 134 return accessNorm(k, this, args); 135 }; 136 }); 137 138 S.each(DOM_INCLUDES_NORM_NODE_LIST, function (k) { 139 NLP[k] = function () { 140 var args = makeArray(arguments); 141 return accessNormList(k, this, args); 142 }; 143 }); 144 145 S.each(DOM_INCLUDES_NORM_IF, function (index, k) { 146 NLP[k] = function () { 147 var args = makeArray(arguments); 148 return accessNormIf(k, this, index, args); 149 }; 150 }); 151 152 S.each(EVENT_INCLUDES, function (k) { 153 NLP[k] = function () { 154 var self = this, 155 args = makeArray(arguments); 156 args.unshift(self); 157 Event[k].apply(Event, args); 158 return self; 159 } 160 }); 161 162 }, { 163 requires:["dom", "event", "./base"] 164 }); 165 166 /** 167 * 2011-05-24 168 * - 承玉: 169 * - 将 DOM 中的方法包装成 NodeList 方法 170 * - Node 方法调用参数中的 KISSY NodeList 要转换成第一个 HTML Node 171 * - 要注意链式调用,如果 DOM 方法返回 undefined (无返回值),则 NodeList 对应方法返回 this 172 * - 实际上可以完全使用 NodeList 来代替 DOM,不和节点关联的方法如:viewportHeight 等,在 window,document 上调用 173 * - 存在 window/document 虚节点,通过 S.one(window)/new Node(window) ,S.one(document)/new NodeList(document) 获得 174 */ 175