Превалирующий! Важный стиль

Название в значительной степени подводит итог.

Внешняя таблица стилей имеет следующий код:

td.EvenRow a {
  display: none !important;
}

Я пробовал использовать:

element.style.display = "inline";

а также

element.style.display = "inline !important";

но ни то, ни другое не работает. Можно ли переопределить стиль! Important с помощью javascript.

Это для расширения greasemonkey, если это имеет значение.

Перейти к stackoverflow.com/a/463134/632951

Pacerier 14.04.2017 09:59

@Pacerier экономия времени!

Eduard 20.05.2018 21:00

@Pacerier, это идеальное решение, не тратьте зря время на чтение ниже. Вот решение, примененное font-size: el.style.setProperty('font-size', newSize+'px', 'important')

run_the_race 19.11.2020 15:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
157
3
218 018
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Ответ принят как подходящий

Я считаю, что единственный способ сделать это - добавить стиль в качестве нового объявления CSS с суффиксом '! Important'. Самый простой способ сделать это - добавить новый элемент <style> в заголовок документа:

function addNewStyle(newStyle) {
    var styleElement = document.getElementById('styles_js');
    if (!styleElement) {
        styleElement = document.createElement('style');
        styleElement.type = 'text/css';
        styleElement.id = 'styles_js';
        document.getElementsByTagName('head')[0].appendChild(styleElement);
    }
    styleElement.appendChild(document.createTextNode(newStyle));
}

addNewStyle('td.EvenRow a {display:inline !important;}')

Правила, добавленные с помощью вышеупомянутого метода, будут (если вы используете суффикс! Important) переопределят другие ранее установленные стили. Если вы не используете суффикс, обязательно примите во внимание такие понятия, как «специфичность».

Его можно заменить однострочным. См. Ниже: stackoverflow.com/questions/462537/…

Premasagar 23.10.2009 15:20

Как вы найдете селектор, который действительно запускает стиль? Я думаю, что для этого потребуется разобрать все таблицы стилей, а это довольно сложная работа.

user123444555621 02.02.2011 15:03

element.style имеет метод setProperty, который может принимать приоритет в качестве третьего параметра:

element.style.setProperty("display", "inline", "important")

Это не работал в старых IE, но это должно быть нормально в текущих браузерах.

Работает в IE 9 msdn.microsoft.com/en-us/library/ie/ff975226%28v=vs.85%29.as‌ px

Salman von Abbas 10.04.2015 19:13

Лучшее решение, поскольку оно не отменяет весь атрибут стиля и является способом работы W3C.

stfn 09.05.2016 23:25

его недостатком является то, что я не могу использовать имена свойств в camelCase, например boxShadow.

Pavan 12.07.2018 15:35

@Pavan Вместо этого просто использовать форму с переносом или, если вам нужно автоматически преобразовать ее, просто напишите функцию.

nyuszika7h 29.12.2018 16:46

лучший ответ. не заставляет вас управлять другими свойствами встроенного стиля.

yegorchik 14.01.2021 19:05

Для этого вы можете использовать несколько простых однострочников.

1) Установите "стиль" атрибут для элемента:

element.setAttribute('style', 'display:inline !important');

или же...

2) Измените свойство cssText объекта style:

element.style.cssText = 'display:inline !important';

Любой из них сделает свою работу.

===

Кстати - если вам нужен полезный инструмент для управления правилами !important в элементах, я написал плагин jQuery под названием «important»: http://github.com/premasagar/important

Я думаю, что использовать cssText проще, чем добавить тег style.

Guss 14.12.2010 17:29

@Guss - Первый пример, который я привел, касается атрибута style, а не тега / элемента.

Premasagar 18.12.2010 02:56

Да, я знаю - я сравнил ваш ответ с выбранным @J-P и попытался сказать, что, по-моему, ваш ответ лучше.

Guss 19.12.2010 18:16

@Guss - ах, ах, понятно. Я запутался. Спасибо.

Premasagar 20.12.2010 07:27

Чтобы предотвратить переопределение других свойств, вы можете использовать element.style.cssText += ';display:inline !important;';

user123444555621 02.02.2011 15:03

Это лучший ответ, чем выбранный, наверняка +1 для повышения.

Nathan C. Tresch 18.09.2012 02:05

Пришел сюда из Google, так счастлив, что нашел этот ответ. Все, что мне было нужно - ничего, чего я не делал.

MeanMatt 17.10.2014 04:39

@ user123444555621, Premasagar. Можно также использовать лучший вариант: element.style.setProperty.

Pacerier 14.04.2017 08:51

Если все, что вы делаете, это добавляете CSS на страницу, я бы посоветовал вам использовать надстройку Stylish и написать пользовательский стиль вместо пользовательского скрипта, потому что пользовательский стиль более эффективен и уместен.

См. эта страница с информацией о том, как создать пользовательский стиль

Изменение css - это только часть того, что делает мое расширение gm

Enrico 01.04.2010 04:47

Ниже приведен фрагмент кода для установки важного параметра для атрибута стиля с помощью jquery.

$.fn.setFixedStyle = function(styles){
    var s = $(this).attr("style");
    s = "{"+s.replace(/;/g,",").replace(/'|"/g,"");
    s = s.substring(0,s.length-1)+"}";
    s = s.replace(/,/g,"\",\"").replace(/{/g,"{\"").replace(/}/g,"\"}").replace(/:/g,"\":\"");
    var stOb = JSON.parse(s),st;
    if (!styles){
     $.each(stOb,function(k,v){
      stOb[k] + = " !important";
     });
    }
    else{
     $.each(styles,function(k,v){
      if (v.length>0){
        stOb[k] = v+" !important";
      }else{
        stOb[k] += " !important";  
      }
     });
    }
    var ns = JSON.stringify(stOb);
    $(this).attr("style",ns.replace(/"|{|}/g,"").replace(/,/g,";"));
};

Использование довольно простое: просто передайте объект, содержащий все атрибуты, которые вы хотите установить как важные.

$("#i1").setFixedStyle({"width":"50px","height":""});

Есть два дополнительных варианта.

1.Чтобы просто добавить важный параметр к уже существующему атрибуту стиля, передайте пустую строку.

2. Чтобы добавить важный параметр для всех присутствующих атрибутов, ничего не передавайте. Он установит все атрибуты как важные.

Вот оно в действии. http://codepen.io/agaase/pen/nkvjr

Основываясь на отличном ответе @ Premasagar; если вы не хотите удалять все остальные встроенные стили, используйте это

//accepts the hyphenated versions (i.e. not 'cssFloat')
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' : '') + ';');
}

Can't use removeProperty() because it wont remove !important rules in Chrome.
Can't use element.style[property] = '' because it only accepts camelCase in FireFox.

Можно также использовать лучший вариант: element.style.setProperty.

Pacerier 14.04.2017 08:52

https://developer.mozilla.org/en-US/docs/Web/CSS/initial

использовать начальное свойство в css3

 <p style = "color:red!important"> 
    this text is red 
       <em style = "color:initial"> 
          this text is in the initial color (e.g. black)
       </em>
    this is red again
 </p>

Исходное значение не сбрасывается. Вы устанавливаете не цвет p, а цвет em. Действительно, измените color: initial на color: green, и это тоже сработает.

Pacerier 14.04.2017 10:11

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)

Если вы хотите обновить / добавить один стиль в атрибут стиля элемента DOM, вы можете использовать эту функцию:

function setCssTextStyle(el, style, value) {
  var result = el.style.cssText.match(new RegExp("(?:[;\\s]|^)(" +
      style.replace("-", "\\-") + "\\s*:(.*?)(;|$))")),
    idx;
  if (result) {
    idx = result.index + result[0].indexOf(result[1]);
    el.style.cssText = el.style.cssText.substring(0, idx) +
      style + ": " + value + ";" +
      el.style.cssText.substring(idx + result[1].length);
  } else {
    el.style.cssText += " " + style + ": " + value + ";";
  }
}

style.cssText - поддерживается для всех основных браузеров.

Пример использования:

var elem = document.getElementById("elementId");
setCssTextStyle(elem, "margin-top", "10px !important");

Вот ссылка на демо

Какую дополнительную информацию или улучшения дает этот ответ?

Pogrindis 21.12.2016 17:31

Эта функция короткая, простая и понятная. Вы можете добавить важную опцию. Он не удаляет все стили элементов. Он перезаписывает или добавляет единый стиль в атрибут стилей элементов. Вам не нужны JS-фреймворки. И самое главное, эта функция работает в каждом браузере.

Marek Skrzyniarz 21.12.2016 19:24

Вместо того, чтобы вводить стиль, если вы вводите класс (например, 'show') через java-скрипт, он будет работать. Но здесь вам понадобится css, как показано ниже. добавленное правило CSS класса должно быть ниже исходного правила.

td.EvenRow a{
  display: none !important;
}

td.EvenRow a.show{
  display: block !important;
}

Там у нас есть еще одна возможность удалить значение свойства из CSS.

Как при использовании метода replace в js. Но вы должны точно знать идентификатор стиля, или вы можете написать цикл for для его определения с помощью (подсчитайте стили на странице, затем проверьте, включает ли какой-либо из них или соответствует ли значение !important. И вы можете посчитайте также - сколько их содержит, или просто напишите глобальный метод замены [regexp: / str / gi])

Мой очень простой, но я прикрепляю jsBin, например:

https://jsbin.com/geqodeg/edit?html,css,js,output

Сначала я установил фон тела в CSS для желтого !important, затем переопределил JS для darkPink.

Другие вопросы по теме