Обдумайте правильное использование API DOM для достижения желаемого, а не сложное регулярное выражение, которое может работать не очень хорошо:
function deleteRule(selector) {
// Get the collection of stylesheets and iterate over them
var ss = document.styleSheets;
// Exit if no stylesheets
if (!ss.length)
return;
// Create an uppercase tagname version of our selector for IE
var uSelector = selector.replace(/^[a-z]+|\s+[a-z]+/gi, function ($0) {
return $0.toUpperCase();
});
// Create a map so we don't get SO's code block scrollbars involved
var map = {};
map[selector] = map[uSelector] = 1;
// `deleteRule` for standards, `removeRule` for IE
var del = "deleteRule" in ss[0] ? "deleteRule" : "removeRule";
for (var a = 0, maxA = ss.length; a < maxA; a++) {
// `cssRules` for standards, `rules` for IE
var rules = ss[a].cssRules || ss[a].rules;
for (var b = 0, maxB = rules.length; b < maxB; b++) {
// Check for selector existence in our map
if (rules[b].selectorText in map)
ss[a][del](b); // remove using our stored delete method
}
}
}
Имейте в виду, что браузеры могут переформатировать селектор правила таблицы стилей ввключить пробел (поэтому body>div.selector
становится body > div.selector
).Вы должны постараться быть максимально совместимыми с пробелами в CSS-селекторах.Если вы хотите удалить правило из определенной таблицы стилей, а не из всех таблиц стилей, удалите первый цикл for
и укажите вместо него объект таблицы стилей.
Пример