/* CopyRight (c) 2010 Baidu */ /* * Tangram * Copyright 2010 Baidu Inc. All rights reserved. * * @author: meizz * @namespace: baidu.page.createStyleSheet * @version: 2010-06-12 */ /* * Tangram * Copyright 2009 Baidu Inc. All rights reserved. * * path: baidu/browser/ie.js * author: allstar * version: 1.1.0 * date: 2009/11/23 */ /* * Tangram * Copyright 2009 Baidu Inc. All rights reserved. * * path: baidu/browser.js * author: allstar, erik * version: 1.1.0 * date: 2009/12/02 */ /* * Tangram * Copyright 2009 Baidu Inc. All rights reserved. * * path: baidu.js * author: allstar, erik * version: 1.1.0 * date: 2009/12/2 */ /** * 声明baidu包 */ var baidu = baidu || {version: "1-2-2"}; // meizz 20100513 将 guid 升级成 \x06 baidu.guid = "$BAIDU$";//提出guid,防止修改window[undefined] 20100504 berg /** * meizz 2010/02/04 * 顶级域名 baidu 有可能被闭包劫持,而需要页面级唯一信息时需要用到下面这个对象 */ window[baidu.guid] = window[baidu.guid] || {}; /** * 声明baidu.browser包 */ baidu.browser = baidu.browser || {}; /** * 判断是否为ie浏览器 */ if (/msie (\d+\.\d)/i.test(navigator.userAgent)) { baidu.ie = baidu.browser.ie = document.documentMode || parseFloat(RegExp['\x241']); } /* * Tangram * Copyright 2009 Baidu Inc. All rights reserved. * * path: baidu/dom/insertHTML.js * author: allstar, erik * version: 1.1.0 * date: 2009/12/04 */ /* * Tangram * Copyright 2009 Baidu Inc. All rights reserved. * * path: baidu/dom/g.js * author: allstar, erik * version: 1.1.0 * date: 2009/11/17 */ /* * Tangram * Copyright 2009 Baidu Inc. All rights reserved. * * path: baidu/dom.js * author: allstar, erik * version: 1.1.0 * date: 2009/12/02 */ /** * 声明baidu.dom包 */ baidu.dom = baidu.dom || {}; /** * 从文档中获取指定的DOM元素 * * @param {string|HTMLElement} id 元素的id或DOM元素 * @return {HTMLElement} DOM元素,如果不存在,返回null,如果参数不合法,直接返回参数 */ baidu.dom.g = function (id) { if ('string' == typeof id || id instanceof String) { return document.getElementById(id); } else if (id && id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) { //todo: 以后把这个判断去掉,不做验证。 return id; } return null; }; // 声明快捷方法 baidu.g = baidu.G = baidu.dom.g; /** * 获取目标元素所属的window对象 * 如果使用本函数插入带有script标签的HTML字符串,script标签对应的脚本将不会被执行。 * * @param {HTMLElement|string} element 目标元素或目标元素的id * @param {string} position 插入html的位置信息,取值为beforeBegin,afterBegin,beforeEnd,afterEnd * @param {string} html 要插入的html */ baidu.dom.insertHTML = function (element, position, html) { element = baidu.dom.g(element); if (element.insertAdjacentHTML) { element.insertAdjacentHTML(position, html); } else { // 这里不做"undefined" != typeof(HTMLElement) && !window.opera判断,其它浏览器将出错?! // 但是其实做了判断,其它浏览器下等于这个函数就不能执行了 var range = element.ownerDocument.createRange(); range.setStartBefore(element); var fragment = range.createContextualFragment(html), parent = element.parentNode, tmpEl; switch (position.toUpperCase()) { case 'BEFOREBEGIN': parent.insertBefore(fragment, element); break; case 'AFTERBEGIN': element.insertBefore(fragment, element.firstChild); break; case 'BEFOREEND': element.appendChild(fragment); break; case 'AFTEREND': (tmpEl = element.nextSibling) ? parent.insertBefore(fragment, tmpEl) : parent.appendChild(fragment); } } // 如果要代码最精简,还有一种写法 // var fragment = range.createContextualFragment(html), // parent = element.parentNode, tmpEl = element; // switch (position.toUpperCase()) { // case 'AFTERBEGIN': // element = element.firstChild; // case 'BEFOREBEGIN': // parent.insertBefore(fragment, element); // break; // case 'BEFOREEND': // element.appendChild(fragment); // break; // case 'AFTEREND': // (element = element.nextSibling) ? parent.insertBefore(fragment, element) : parent.appendChild(fragment); // } // 增加一次判断,代码可以更少 // var fragment = range.createContextualFragment(html), // parent = element.parentNode, tmpEl = element; // switch (position.toUpperCase()) { // case 'AFTERBEGIN': // element = element.firstChild; // break; // case 'BEFOREEND': // parent = element; // element = null; // break; // case 'AFTEREND': // element = element.nextSibling; // } // element ? parent.insertBefore(fragment, element) : parent.appendChild(fragment); }; baidu.insertHTML = baidu.dom.insertHTML; /* * Tangram * Copyright 2009 Baidu Inc. All rights reserved. * * path: baidu/page.js * author: erik * version: 1.1.0 * date: 2009/11/17 */ /** * 声明baidu.page包 */ baidu.page = baidu.page || {}; /** * 创建CSS样式集对象 style sheet * * @param {JSON} options 配置信息 * @config {Document} document 指定在哪个document下创建,默认是当前文档 * @config {String} url css文件的URL * @config {Number} index 在文档里的排序索引 * @return {Object} styleSheet对象 */ baidu.page.createStyleSheet = function(options){ var op = options || {}, doc = op.document || document, s; if (baidu.browser.ie) { return doc.createStyleSheet(op.url, op.index); } else { s = ""; op.url && (s=""); baidu.dom.insertHTML(doc.getElementsByTagName("HEAD")[0],"beforeEnd",s); //如果用户传入了url参数,下面访问sheet.rules的时候会报错 if(op.url){ return null; } var sheet = doc.styleSheets[doc.styleSheets.length - 1], rules = sheet.rules || sheet.cssRules; return { self : sheet ,rules : sheet.rules || sheet.cssRules ,addRule : function(selector, style, i) { if (sheet.addRule) { return sheet.addRule(selector, style, i); } else if (sheet.insertRule) { isNaN(i) && (i = rules.length); return sheet.insertRule(selector +"{"+ style +"}", i); } } ,removeRule : function(i) { if (sheet.removeRule) { sheet.removeRule(i); } else if (sheet.deleteRule) { isNaN(i) && (i = 0); sheet.deleteRule(i); } } } } }; /* * styleSheet对象 有两个方法 * addRule(selector, style, i) * removeRule(i) * 这两个方法已经做了浏览器兼容处理 * 一个集合 * rules */