Как подать заявление! Важно использовать .css ()? - PullRequest
675 голосов
/ 17 апреля 2010

У меня проблемы с применением стиля !important. Я пробовал:

$("#elem").css("width", "100px !important");

Это ничего не значит ; стиль ширины не применяется. Есть ли способ применения такого стиля в jQuery-ih без необходимости перезаписывать cssText (что означало бы, что мне сначала нужно его проанализировать и т. Д.)?

Редактировать : я должен добавить, что у меня есть таблица стилей со стилем !important, которую я пытаюсь переопределить с помощью встроенного стиля !important, поэтому использование .width() и т.п. не работает так как он переопределяется моим внешним !important стилем.

Кроме того, значение, которое переопределит предыдущее значение , вычисляется , поэтому я не могу просто создать другой внешний стиль.

Ответы [ 30 ]

553 голосов
/ 17 апреля 2010

Проблема вызвана тем, что 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;' });
319 голосов
/ 17 января 2012

Мне кажется, я нашел реальное решение. Я сделал это в новую функцию:

jQuery.style(name, value, priority);

Вы можете использовать его для получения значений с .style('name'), как и .css('name'), для получения CSSStyleDeclaration с .style(), а также для установки значений - с возможностью указать приоритет как «важный». См. это .

Демо

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);

См. this для примеров того, как читать и устанавливать значения CSS. Моя проблема заключалась в том, что я уже установил !important для ширины в своем CSS, чтобы избежать конфликтов с CSS другой темы, но на любые изменения, которые я внес в ширину в jQuery, это не повлияет, так как они будут добавлены в атрибут style.

Совместимость

Для настройки с приоритетом с использованием функции setProperty, В этой статье говорится, что есть поддержка IE 9+ и всех других браузеров. Я пытался с IE 8, и он потерпел неудачу, поэтому я встроил поддержку для своих функций (см. Выше). Он будет работать во всех других браузерах, использующих setProperty, но для работы в

140 голосов
/ 17 апреля 2010

Вы можете установить ширину напрямую, используя .width(), например:

$("#elem").width(100);

Обновлено для комментариев: У вас также есть эта опция, но она заменит все css на элементе, поэтому не уверен, что он более жизнеспособен:

$('#elem').css('cssText', 'width: 100px !important');
71 голосов
/ 13 сентября 2013
var elem = $("#elem");
elem[0].style.removeAttribute('width');
elem[0].style.setProperty('width', '100px', 'important');
52 голосов
/ 30 июля 2012

Ответ Дэвида Томаса описывает способ использования $('#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 .

28 голосов
/ 03 августа 2014

Прочитав другие ответы и поэкспериментировав, вот что у меня работает:

$(".selector")[0].style.setProperty( 'style', 'value', 'important' );

Это не работает в IE 8 и ниже.

23 голосов
/ 13 сентября 2014

Вы можете сделать это:

$("#elem").css("cssText", "width: 100px !important;");

Использование "cssText" в качестве имени свойства и того, что вы хотите добавить в CSS в качестве значения.

17 голосов
/ 09 июля 2015

Вы можете достичь этого двумя способами:

$("#elem").prop("style", "width: 100px !important"); // this is not supported in chrome
$("#elem").attr("style", "width: 100px !important");
14 голосов
/ 04 октября 2013

Нет необходимости вдаваться в сложность ответа @ 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 и т. Д.

12 голосов
/ 15 мая 2013

Вот что я сделал после столкновения с этой проблемой ...

var origStyleContent = jQuery('#logo-example').attr('style');
jQuery('#logo-example').attr('style', origStyleContent + ';width:150px !important');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...