Как применять! Важно использовать .css()?
У меня возникли проблемы с применением стиля !important
. Ive попытался:
$("#elem").css("width", "100px !important");
Это ничего; ни один стиль ширины не применяется. Есть ли способ jQuery-ish применить такой стиль, не перезаписывая cssText
(что означало бы, что Id должен сначала разобрать его и т.д.)?
Изменить. Я должен добавить, что у меня есть таблица стилей со стилем !important
, которую я пытаюсь переопределить с помощью встроенного стиля !important
, поэтому использование .width()
и тому подобное не потому что он переопределяется внешним стилем !important
.
Кроме того, вычисляется значение, которое переопределяет предыдущее значение , поэтому я не могу просто создать другой внешний стиль.
Ответы
Ответ 1
Думаю, я нашел реальное решение. Я ввел новую функцию:
jQuery.style(name, value, priority);
Вы можете использовать его для получения значений с помощью .style('name')
точно так же, как .css('name')
, получить CSSStyleDeclaration с помощью .style()
, а также установить значения - с возможностью указать приоритет как "важный". См. this.
Demo
var div = $('someDiv');
console.log(div.style('color'));
div.style('color', 'red');
console.log(div.style('color'));
div.style('color', 'blue', 'important');
console.log(div.style('color'));
console.log(div.style().getPropertyPriority('color'));
Здесь вывод:
null
red
blue
important
Функция
(function($) {
if ($.fn.style) {
return;
}
// Escape regex chars with \
var escape = function(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
};
// For those who need them (< IE 9), add support for CSS functions
var isStyleFuncSupported = !!CSSStyleDeclaration.prototype.getPropertyValue;
if (!isStyleFuncSupported) {
CSSStyleDeclaration.prototype.getPropertyValue = function(a) {
return this.getAttribute(a);
};
CSSStyleDeclaration.prototype.setProperty = function(styleName, value, priority) {
this.setAttribute(styleName, value);
var priority = typeof priority != 'undefined' ? priority : '';
if (priority != '') {
// Add priority manually
var rule = new RegExp(escape(styleName) + '\\s*:\\s*' + escape(value) +
'(\\s*;)?', 'gmi');
this.cssText =
this.cssText.replace(rule, styleName + ': ' + value + ' !' + priority + ';');
}
};
CSSStyleDeclaration.prototype.removeProperty = function(a) {
return this.removeAttribute(a);
};
CSSStyleDeclaration.prototype.getPropertyPriority = function(styleName) {
var rule = new RegExp(escape(styleName) + '\\s*:\\s*[^\\s]*\\s*!important(\\s*;)?',
'gmi');
return rule.test(this.cssText) ? 'important' : '';
}
}
// The style function
$.fn.style = function(styleName, value, priority) {
// DOM node
var node = this.get(0);
// Ensure we have a DOM node
if (typeof node == 'undefined') {
return this;
}
// CSSStyleDeclaration
var style = this.get(0).style;
// Getter/Setter
if (typeof styleName != 'undefined') {
if (typeof value != 'undefined') {
// Set style property
priority = typeof priority != 'undefined' ? priority : '';
style.setProperty(styleName, value, priority);
return this;
} else {
// Get style property
return style.getPropertyValue(styleName);
}
} else {
// Get CSSStyleDeclaration
return style;
}
};
})(jQuery);
См. этот для примеров того, как читать и устанавливать значения CSS. Моя проблема заключалась в том, что я уже установил !important
для ширины в моем CSS, чтобы избежать конфликтов с другими CSS темы, но любые изменения, которые я сделал для ширины в jQuery, не будут затронуты, поскольку они будут добавлены в атрибут стиля.
Совместимость
Для установки с приоритетом с помощью функции setProperty
В этой статье говорится, что есть поддержка IE 9+ и всех других браузеров. Я попытался с IE 8, и он провалился, поэтому я создал поддержку для него в моих функциях (см. Выше). Он будет работать во всех других браузерах с использованием setProperty, но для этого потребуется мой пользовательский код для работы в < IE 9.
Ответ 2
Проблема вызвана тем, что jQuery не понимает атрибут !important
и как таковой не применяет правило.
Возможно, вы сможете обойти эту проблему и применить правило, обратившись к нему, через addClass()
:
.importantRule { width: 100px !important; }
$('#elem').addClass('importantRule');
Или используя attr()
:
$('#elem').attr('style', 'width: 100px !important');
Однако последний подход отменяет любые ранее установленные правила стиля в строке. Поэтому используйте с осторожностью.
Конечно, есть хороший аргумент в пользу того, что метод @Nick Craver проще/мудрее.
Вышеупомянутый подход attr()
слегка изменен, чтобы сохранить исходную строку/свойства style
:
$('#elem').attr('style', function(i,s) { return s + 'width: 100px !important;' });
Ответ 3
Вы можете установить ширину напрямую, используя .width()
следующим образом:
$("#elem").width(100);
Обновлен для комментариев:
У вас есть этот вариант, но он заменит все css на элемент, поэтому не уверен, что он более жизнеспособен:
$('#elem').css('cssText', 'width: 100px !important');
Ответ 4
var elem = $("#elem");
elem[0].style.removeAttribute('width');
elem[0].style.setProperty('width', '100px', 'important');
Ответ 5
Ответ Дэвида Томаса описывает способ использования $('#elem').attr('style', …)
, но предупреждает, что его использование удалит ранее установленные стили в атрибуте style
. Вот способ использования attr()
без этой проблемы:
var $elem = $('#elem');
$elem.attr('style', $elem.attr('style') + '; ' + 'width: 100px !important');
Как функция:
function addStyleAttribute($element, styleAttribute) {
$element.attr('style', $element.attr('style') + '; ' + styleAttribute);
}
addStyleAttribute($('#elem'), 'width: 100px !important');
Вот JS Bin demo.
Ответ 6
Прочитав другие ответы и экспериментируя, это то, что работает для меня:
$(".selector")[0].style.setProperty( 'style', 'value', 'important' );
Однако это не работает в IE 8 и ниже.
Ответ 7
Вы можете сделать это:
$("#elem").css("cssText", "width: 100px !important;");
Использование "cssText" в качестве имени свойства и того, что вы хотите добавить в CSS в качестве значения.
Ответ 8
Вы можете достичь этого двумя способами:
$("#elem").prop("style", "width: 100px !important"); // this is not supported in chrome
$("#elem").attr("style", "width: 100px !important");
Ответ 9
Нет необходимости идти на сложность ответа @AramKocharyan и не нужно динамически вставлять теги стиля.
Просто перепишите стиль, но вам не нужно ничего разбирать, зачем вам?
// Accepts the hyphenated versions (i.e. not 'cssFloat')
function addStyle(element, property, value, important) {
// Remove previously defined property
if (element.style.setProperty)
element.style.setProperty(property, '');
else
element.style.setAttribute(property, '');
// Insert the new style with all the old rules
element.setAttribute('style', element.style.cssText +
property + ':' + value + ((important) ? ' !important' : '') + ';');
}
Нельзя использовать removeProperty()
, потому что он не будет удалять !important
правила в Chrome.
Невозможно использовать element.style[property] = ''
, потому что он принимает только camelCase в Firefox.
Вероятно, вы можете сделать это короче с jQuery, но эта функция ванили будет работать в современных браузерах, Internet Explorer 8 и т.д.
Ответ 10
Вот что я сделал после столкновения с этой проблемой...
var origStyleContent = jQuery('#logo-example').attr('style');
jQuery('#logo-example').attr('style', origStyleContent + ';width:150px !important');
Ответ 11
Если это не так актуально, и поскольку вы имеете дело с одним элементом, который является #elem
, вы можете изменить его id на что-то еще и #elem
его по своему усмотрению...
$('#elem').attr('id', 'cheaterId');
И в вашем CSS:
#cheaterId { width: 100px;}
Ответ 12
Это решение не отменяет ни один из предыдущих стилей, он просто применяет тот, который вам нужен:
var heightStyle = "height: 500px !important";
if ($("foo").attr('style')) {
$("foo").attr('style', heightStyle + $("foo").attr('style').replace(/^height: [-,!,0-9,a-z, A-Z, ]*;/,''));
else {
$("foo").attr('style', heightStyle);
}
Ответ 13
Самое простое и лучшее решение этой проблемы у меня было просто использовать addClass() вместо.css() или.attr().
Например:
$('#elem').addClass('importantClass');
И в вашем файле CSS:
.importantClass {
width: 100px !important;
}
Ответ 14
Вместо использования функции css()
попробуйте функцию addClass()
:
<script>
$(document).ready(function() {
$("#example").addClass("exampleClass");
});
</script>
<style>
.exampleClass{
width:100% !important;
height:100% !important;
}
</style>
Ответ 15
Нам нужно сначала удалить предыдущий стиль. Я удаляю его с помощью регулярного выражения. Вот пример изменения цвета:
var SetCssColorImportant = function (jDom, color) {
var style = jDom.attr('style');
style = style.replace(/color: .* !important;/g, '');
jDom.css('cssText', 'color: ' + color + ' !important;' + style); }
Ответ 16
Альтернативный способ добавления стиля в голову:
$('head').append('<style> #elm{width:150px !important} </style>');
Это добавляет стиль после всех ваших файлов CSS, поэтому он будет иметь более высокий приоритет, чем другие файлы CSS, и будет применяться.
Ответ 17
Может быть, это выглядит так:
кэш
var node = $('.selector')[0];
OR
var node = document.querySelector('.selector');
Установить CSS
node.style.setProperty('width', '100px', 'important');
Удалить CSS
node.style.removeProperty('width');
OR
node.style.width = '';
Ответ 18
FYI, это не работает, потому что jQuery не поддерживает его. В 2012 году был подан билет (# 11173 $(elem).css( "property" , "value! Important" )), который был в конечном итоге закрыт как WONTFIX.
Ответ 19
Я бы предположил, что вы пробовали его, не добавляя !important
?
Встроенный CSS (как JavaScript добавляет стиль) переопределяет CSS стилей. Я уверен, что дело даже в том случае, когда правило CSS стилей имеет !important
.
Другой вопрос (может быть, глупый вопрос, но его нужно спросить.): Является ли элемент, который вы пытаетесь работать на display:block;
или display:inline-block;
?
Не зная, что ваш опыт в CSS... встроенные элементы не всегда ведут себя так, как вы ожидали.
Ответ 20
Делай это так:
$("#elem").get(0).style.width= "100px!important";
Ответ 21
Это может быть или не быть подходящим для вашей ситуации, но вы можете использовать селектор CSS для многих ситуаций такого типа.
Если, например, вы хотели, чтобы 3-й и 6-й экземпляры .cssText имели другую ширину, которую вы могли бы написать:
.cssText:nth-of-type(3), .cssText:nth-of-type(6) {width:100px !important;}
Или:
.container:nth-of-type(3).cssText, .container:nth-of-type(6).cssText {width:100px !important;}
Ответ 22
Я думаю, что он работает нормально и может перезаписать любой другой CSS раньше (это: элемент DOM):
this.setAttribute('style', 'padding:2px !important');
Ответ 23
Я также обнаружил, что некоторые элементы или надстройки (например, Bootstrap) имеют некоторые особые случаи, когда они не хорошо работают с !important
или другими обходами, например .addClass/.removeClass
, и поэтому вам нужно их переключать вкл выкл.
Например, если вы используете что-то вроде <table class="table-hover">
, единственный способ успешно изменить элементы, такие как цвета строк, - это включить/выключить класс table-hover
, например
$(your_element).closest("table").toggleClass("table-hover");
Надеюсь, эта работа будет полезна кому-то!:)
Ответ 24
Мы можем использовать setProperty или cssText для добавления !important
для элемента DOM с использованием JavaScript.
Пример 1:
elem.style.setProperty ("color", "green", "important");
Пример 2:
elem.style.cssText='color: red !important;'
Ответ 25
У меня была та же проблема, которая пыталась изменить цвет текста элемента меню, когда "событие". Лучший способ, который я нашел, когда у меня возникла такая же проблема:
Первый шаг: создайте в своем CSS новый класс с этой целью, например:
.colorw{ color: white !important;}
Последний шаг: применить этот класс с помощью метода addClass следующим образом:
$('.menu-item>a').addClass('colorw');
Задача решена.
Ответ 26
Три рабочих примера
У меня была аналогичная ситуация, но я использовал.find() после долгого столкновения с.closest() в течение многих времен.
Пример кода
// Allows contain functions to work, ignores case sensitivity
jQuery.expr[':'].contains = function(obj, index, meta, stack) {
result = false;
theList = meta[3].split("','");
var contents = (obj.textContent || obj.innerText || jQuery(obj).text() || '')
for (x=0; x<theList.length; x++) {
if (contents.toLowerCase().indexOf(theList[x].toLowerCase()) >= 0) {
return true;
}
}
return false;
};
$(document).ready(function() {
var refreshId = setInterval( function() {
$("#out:contains('foo', 'test456')").find(".inner").css('width', '50px', 'important');
}, 1000); // Rescans every 1000 ms
});
альтернатива
$('.inner').each(function () {
this.style.setProperty('height', '50px', 'important');
});
$('#out').find('.inner').css({ 'height': '50px'});
Работа: http://jsfiddle.net/fx4mbp6c/
Ответ 27
На мой взгляд, самый простой способ: вы можете сделать (Ex, если вам нужно установить ширину с важным тегом)
$('exampleDiv').css('width', '');
//This will remove the width of the item
var styles = $('exampleDiv').attr('style');
//This will contain all styles in your item
//ex: height:auto; display:block;
styles += 'width: 200px !important;'
//This will add the width to the previous styles
//ex: height:auto; display:block; width: 200px !important;
$('exampleDiv').attr('style', styles);
//This will add all previous styles to your item
Ответ 28
https://jsfiddle.net/xk6Ut/256/
Альтернативный подход - это динамическое создание и обновление класса CSS в JavaScript. Для этого мы можем использовать элемент стиля и использовать идентификатор для элемента стиля, чтобы мы могли обновить класс CSS
function writeStyles(styleName, cssText) {
var styleElement = document.getElementById(styleName);
if (styleElement) document.getElementsByTagName('head')[0].removeChild(
styleElement);
styleElement = document.createElement('style');
styleElement.type = 'text/css';
styleElement.id = styleName;
styleElement.innerHTML = cssText;
document.getElementsByTagName('head')[0].appendChild(styleElement);
}
...
var cssText = '.testDIV{ height:' + height + 'px !important; }';
writeStyles('styles_js', cssText)
Ответ 29
Самым безопасным решением для этого является добавление класса, а затем выполнение магии в CSS :-), addClass()
и removeClass()
должны выполнить эту работу.
Ответ 30
Еще один простой способ решить эту проблему, добавив атрибут style:
$('.selector').attr('style', 'width:500px !important');