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