1 /**
  2  * @fileOverview dom
  3  * @author yiminghe@gmail.com, lifesinger@gmail.com
  4  */
  5 KISSY.add('dom/base', function (S, UA, undefined) {
  6 
  7     var WINDOW = S.Env.host;
  8 
  9     var NODE_TYPE =
 10     /**
 11      * @lends DOM
 12      */
 13     {
 14         ELEMENT_NODE:1,
 15         ATTRIBUTE_NODE:2,
 16         TEXT_NODE:3,
 17         CDATA_SECTION_NODE:4,
 18         ENTITY_REFERENCE_NODE:5,
 19         ENTITY_NODE:6,
 20         PROCESSING_INSTRUCTION_NODE:7,
 21         COMMENT_NODE:8,
 22         DOCUMENT_NODE:9,
 23         DOCUMENT_TYPE_NODE:10,
 24         DOCUMENT_FRAGMENT_NODE:11,
 25         NOTATION_NODE:12
 26     };
 27     var DOM = {
 28 
 29         /**
 30          * Whether has been set a custom domain,
 31          * @param {window} [win] Test window. Default current window.
 32          * @return {Boolean}
 33          */
 34         isCustomDomain:function (win) {
 35             win = win || WINDOW;
 36             var domain = win.document.domain,
 37                 hostname = win.location.hostname;
 38             return domain != hostname &&
 39                 domain != ( '[' + hostname + ']' );	// IPv6 IP support
 40         },
 41 
 42         /**
 43          * Get appropriate src for new empty iframe.
 44          * Consider custom domain.
 45          * @param {window} [win] Window new iframe will be inserted into.
 46          * @return {String} Src for iframe.
 47          */
 48         getEmptyIframeSrc:function (win) {
 49             win = win || WINDOW;
 50             if (UA['ie'] && DOM.isCustomDomain(win)) {
 51                 return  'javascript:void(function(){' + encodeURIComponent("" +
 52                     "document.open();" +
 53                     "document.domain='" +
 54                     win.document.domain
 55                     + "';" +
 56                     "document.close();") + "}())";
 57             }
 58             return undefined;
 59         },
 60 
 61         NodeTypes:NODE_TYPE,
 62 
 63         /**
 64          * Return corresponding window if elem is document or window or undefined.
 65          * Else return false.
 66          * @param {undefined|window|document} elem
 67          * @return {window|Boolean}
 68          */
 69         _getWin:function (elem) {
 70             if (elem == null) {
 71                 return WINDOW;
 72             }
 73             return ('scrollTo' in elem && elem['document']) ?
 74                 elem : elem.nodeType == DOM.DOCUMENT_NODE ?
 75                 elem.defaultView || elem.parentWindow :
 76                 false;
 77         },
 78 
 79         // Ref: http://lifesinger.github.com/lab/2010/nodelist.html
 80         _isNodeList:function (o) {
 81             // 注1:ie 下,有 window.item, typeof node.item 在 ie 不同版本下,返回值不同
 82             // 注2:select 等元素也有 item, 要用 !node.nodeType 排除掉
 83             // 注3:通过 namedItem 来判断不可靠
 84             // 注4:getElementsByTagName 和 querySelectorAll 返回的集合不同
 85             // 注5: 考虑 iframe.contentWindow
 86             return o && !o.nodeType && o.item && !o.setTimeout;
 87         },
 88 
 89         /**
 90          * Get node 's nodeName in lowercase.
 91          * @param {HTMLElement[]|String|HTMLElement|Node} selector Matched elements.
 92          * @return {String} el 's nodeName in lowercase
 93          */
 94         nodeName:function (selector) {
 95             var el = DOM.get(selector),
 96                 nodeName = el.nodeName.toLowerCase();
 97             // http://msdn.microsoft.com/en-us/library/ms534388(VS.85).aspx
 98             if (UA['ie']) {
 99                 var scopeName = el['scopeName'];
100                 if (scopeName && scopeName != 'HTML') {
101                     nodeName = scopeName.toLowerCase() + ':' + nodeName;
102                 }
103             }
104             return nodeName;
105         }
106     };
107 
108     S.mix(DOM, NODE_TYPE);
109 
110     return DOM;
111 
112 }, {
113     requires:['ua']
114 });
115 
116 /**
117  * 2011-08
118  *  - 添加键盘枚举值,方便依赖程序清晰
119  */
120