@qooxdoo/framework
Version:
The JS Framework for Coders
243 lines (211 loc) • 6.61 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2008 1&1 Internet AG, Germany, http://www.1und1.de
2006 STZ-IDA, Germany, http://www.stz-ida.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Sebastian Werner (wpbasti)
* Andreas Ecker (ecker)
* Andreas Junghans (lucidcake)
************************************************************************ */
/**
* Cross-browser wrapper to work with CSS stylesheets.
* @require(qx.bom.client.Stylesheet)
*/
qx.Bootstrap.define("qx.bom.Stylesheet", {
/*
*****************************************************************************
STATICS
*****************************************************************************
*/
statics: {
/**
* Include a CSS file
*
* <em>Note:</em> Using a resource ID as the <code>href</code> parameter
* will no longer be supported. Call
* <code>qx.util.ResourceManager.getInstance().toUri(href)</code> to get
* valid URI to be used with this method.
*
* @param href {String} Href value
* @param doc {Document?} Document to modify
*/
includeFile(href, doc) {
if (!doc) {
doc = document;
}
var el = doc.createElement("link");
el.type = "text/css";
el.rel = "stylesheet";
el.href = href;
var head = doc.getElementsByTagName("head")[0];
head.appendChild(el);
},
/**
* Create a new Stylesheet node and append it to the document
*
* @param text {String?} optional string of css rules
* @return {StyleSheet} the generates stylesheet element
*/
createElement(text) {
if (qx.core.Environment.get("html.stylesheet.createstylesheet")) {
var sheet = document.createStyleSheet();
if (text) {
sheet.cssText = text;
}
return sheet;
} else {
var elem = document.createElement("style");
elem.type = "text/css";
if (text) {
elem.appendChild(document.createTextNode(text));
}
document.getElementsByTagName("head")[0].appendChild(elem);
return elem.sheet;
}
},
/**
* Insert a new CSS rule into a given Stylesheet
*
* @param sheet {Object} the target Stylesheet object
* @param selector {String} the selector
* @param entry {String} style rule
*/
addRule(sheet, selector, entry) {
if (qx.core.Environment.get("qx.debug")) {
var msg =
"qx.bom.Stylesheet.addRule: The rule '" +
entry +
"' for the selector '" +
selector +
"' must not be enclosed in braces";
qx.core.Assert.assertFalse(/^\s*?\{.*?\}\s*?$/.test(entry), msg);
}
if (qx.core.Environment.get("html.stylesheet.insertrule")) {
sheet.insertRule(selector + "{" + entry + "}", sheet.cssRules.length);
} else {
sheet.addRule(selector, entry);
}
},
/**
* Remove a CSS rule from a stylesheet
*
* @param sheet {Object} the Stylesheet
* @param selector {String} the Selector of the rule to remove
*/
removeRule(sheet, selector) {
if (qx.core.Environment.get("html.stylesheet.deleterule")) {
var rules = sheet.cssRules;
var len = rules.length;
for (var i = len - 1; i >= 0; --i) {
if (rules[i].selectorText == selector) {
sheet.deleteRule(i);
}
}
} else {
var rules = sheet.rules;
var len = rules.length;
for (var i = len - 1; i >= 0; --i) {
if (rules[i].selectorText == selector) {
sheet.removeRule(i);
}
}
}
},
/**
* Remove the given sheet from its owner.
* @param sheet {Object} the stylesheet object
*/
removeSheet(sheet) {
var owner = sheet.ownerNode ? sheet.ownerNode : sheet.owningElement;
qx.dom.Element.removeChild(owner, owner.parentNode);
},
/**
* Remove all CSS rules from a stylesheet
*
* @param sheet {Object} the stylesheet object
*/
removeAllRules(sheet) {
if (qx.core.Environment.get("html.stylesheet.deleterule")) {
var rules = sheet.cssRules;
var len = rules.length;
for (var i = len - 1; i >= 0; i--) {
sheet.deleteRule(i);
}
} else {
var rules = sheet.rules;
var len = rules.length;
for (var i = len - 1; i >= 0; i--) {
sheet.removeRule(i);
}
}
},
/**
* Add an import of an external CSS file to a stylesheet
*
* @param sheet {Object} the stylesheet object
* @param url {String} URL of the external stylesheet file
*/
addImport(sheet, url) {
if (qx.core.Environment.get("html.stylesheet.addimport")) {
sheet.addImport(url);
} else {
sheet.insertRule('@import "' + url + '";', sheet.cssRules.length);
}
},
/**
* Removes an import from a stylesheet
*
* @param sheet {Object} the stylesheet object
* @param url {String} URL of the imported CSS file
*/
removeImport(sheet, url) {
if (qx.core.Environment.get("html.stylesheet.removeimport")) {
var imports = sheet.imports;
var len = imports.length;
for (var i = len - 1; i >= 0; i--) {
if (
imports[i].href == url ||
imports[i].href == qx.util.Uri.getAbsolute(url)
) {
sheet.removeImport(i);
}
}
} else {
var rules = sheet.cssRules;
var len = rules.length;
for (var i = len - 1; i >= 0; i--) {
if (rules[i].href == url) {
sheet.deleteRule(i);
}
}
}
},
/**
* Remove all imports from a stylesheet
*
* @param sheet {Object} the stylesheet object
*/
removeAllImports(sheet) {
if (qx.core.Environment.get("html.stylesheet.removeimport")) {
var imports = sheet.imports;
var len = imports.length;
for (var i = len - 1; i >= 0; i--) {
sheet.removeImport(i);
}
} else {
var rules = sheet.cssRules;
var len = rules.length;
for (var i = len - 1; i >= 0; i--) {
if (rules[i].type == rules[i].IMPORT_RULE) {
sheet.deleteRule(i);
}
}
}
}
}
});