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