Можно ли удалить встроенные стили с помощью jQuery?

236

Плагин jQuery применяет встроенный стиль ( display:block). Я чувствую себя ленивым и хочу переопределить это display:none.

Какой самый лучший (ленивый) способ?

Haroldo
источник
79
Обратитесь за помощью к SO :)
Дейв Сверски
15
Лучший способ и Ленивый способ не обязательно совпадают.
Джоэл
1
Я часто слышал аргумент, что лучшие разработчики ленивы ... blog.codinghorror.com/how-to-be-lazy-dumb-and-successful
kaelle
два способа достижения этого, например, с помощью removeAttr () или .css (), см. codepedia.info/jquery-remove-inline-style
singh

Ответы:

381

Обновление: пока работает следующее решение, есть гораздо более простой способ. Увидеть ниже.


Вот то, что я придумал, и я надеюсь, что это пригодится - вам или кому-либо еще:

$('#element').attr('style', function(i, style)
{
    return style && style.replace(/display[^;]+;?/g, '');
});

Это удалит этот встроенный стиль.

Я не уверен, что это то, что вы хотели. Вы хотели переопределить это, что, как уже отмечалось, легко выполняется $('#element').css('display', 'inline').

То, что я искал, было решением УДАЛИТЬ встроенный стиль полностью. Мне нужно это для плагина, который я пишу, где я должен временно установить некоторые встроенные значения CSS, но позже хочу удалить их; Я хочу, чтобы таблица стилей вернула себе контроль. Я мог бы сделать это, сохранив все исходные значения и затем вернув их обратно в строку, но это решение кажется мне намного чище.


Вот это в формате плагина:

(function($)
{
    $.fn.removeStyle = function(style)
    {
        var search = new RegExp(style + '[^;]+;?', 'g');

        return this.each(function()
        {
            $(this).attr('style', function(i, style)
            {
                return style && style.replace(search, '');
            });
        });
    };
}(jQuery));

Если вы включите этот плагин на странице перед вашим скриптом, вы можете просто позвонить

$('#element').removeStyle('display');

и это должно сработать.


Обновление : теперь я понял, что все это бесполезно. Вы можете просто установить его пустым:

$('#element').css('display', '');

и он будет автоматически удален для вас.

Вот цитата из документов :

Установка значения свойства стиля в пустую строку - например, $('#mydiv').css('color', '')удаляет это свойство из элемента, если оно уже было применено напрямую, будь то в атрибуте стиля HTML, с помощью .css()метода jQuery или с помощью прямого DOM-манипулирования свойством стиля. Однако он не удаляет стиль, который был применен с помощью правила CSS в таблице стилей или <style>элементе.

Я не думаю, что jQuery делает что-то магическое здесь; кажется, что styleобъект делает это изначально .

Джозеф Силбер
источник
3
@ximi - Спасибо, парень. Я думал об этом, и я решил, что это не такая пустая трата времени. Он может быть использован для проверки встроенных стилей, для которых в настоящее время нет поддержки в jQuery ( .css('property')дает вам значение, но он не сообщает вам, пришел ли он из встроенного стиля).
Джозеф Силбер
Я пришел к тому же самому выводу - пустая строка, кажется, делает то, что мы хотим. Это официально не задокументировано в API, но, надеюсь, продолжит работать.
Jon Z
@Jonz - Это будет официально задокументирован (хотя я не знаю , когда он был добавлен, я не помню , что там , когда я первоначально отправил это). Кроме того, я не думаю, что jQuery здесь что-то делает. Нативный styleобъект, кажется, ведет себя таким же образом. Я исправил свой ответ этой информацией.
Джозеф Сильбер
Работает ли это с такими вещами, как font-family, или - портит регулярное выражение?
TMH
4
@mosh - Почему бы тебе просто не использовать $('#element').css('display', '')?
Джозеф Силбер
158

.removeAttr("style") просто избавиться от целого тега стиля ...

.attr("style") проверить значение и посмотреть, существует ли встроенный стиль ...

.attr("style",newValue) установить что-то другое

Гейзенберга
источник
18
Это повлияет на все встроенные стили, а не только display.
SLaks
1
звучит неплохо, попробуйте и дайте вам знать, я никогда не использую встроенные стили, как правило, поэтому рад очистить все встроенные стили
Haroldo
11
@ Слакс хорошо, вот что я имел в виду под «избавиться от целого тега стиля»;)
Гейзенберг
Здравствуй. Есть ли способ проверить, был ли применен какой-то «стиль» к ... $ ('*') из любого источника, например, встроенного стиля, с атрибутом стиля, таким как font, b, strong, css file ... перед попыткой удалить / сбросить что-нибудь или просто сбросить все одним выстрелом?
Мильче Патерн
Поскольку удаление каждого встроенного стиля в отдельности не приводит к удалению styleатрибута (теперь пустого) , это все же заслуживает внимания.
Brilliand
26

Самый простой способ удалить встроенные стили (сгенерированные jQuery):

$(this).attr("style", "");

Встроенный код должен исчезнуть, и ваш объект должен адаптировать стиль, предопределенный в ваших файлах CSS.

Работал на меня!

Рик ван Тут Хофланд
источник
13

Вы можете установить стиль, используя cssметод jQuery :

$('something:visible').css('display', 'none');
SLaks
источник
@ Коби: Он спрашивает о любом встроенном стиле.
Слакс
эээ, что? Я, наверное, что-то не понимаю. Я думаю о том <div style="display:block;">, $('div').hide().
Коби
3
@Kobi: hideрассматривается один особый случай изменения встроенных стилей. Этот ответ касается всех случаев. ( hide/showтакже есть ограничение как два, два значения которых переключаются. т.е. none-> block или none-> inline.)
Joel
@Joel: hide/ showзапомнит старое значение displayи восстановит его правильно.
Слакс
@SLaks: Круто. Должно быть, это было добавлено недавно, так как я помню, что раньше у меня были проблемы с этим.
Джоэл
12

Вы можете создать плагин jquery следующим образом:

jQuery.fn.removeInlineCss = (function(){
    var rootStyle = document.documentElement.style;
    var remover = 
        rootStyle.removeProperty    // modern browser
        || rootStyle.removeAttribute   // old browser (ie 6-8)
    return function removeInlineCss(properties){
        if(properties == null)
            return this.removeAttr('style');
        proporties = properties.split(/\s+/);
        return this.each(function(){
            for(var i = 0 ; i < proporties.length ; i++)
                remover.call(this.style, proporties[i]);
        });
    };
})();

использование

$(".foo").removeInlineCss(); //remove all inline styles
$(".foo").removeInlineCss("display"); //remove one inline style
$(".foo").removeInlineCss("color font-size font-weight"); //remove several inline styles
Yukulélé
источник
1
Этот ответ содержит очень аккуратный однострочный трюк, который полезен даже без jQuery и о котором не знают многие разработчики - вызов elem.style.removeProperty('margin-left')удалит только margin-leftиз styleатрибута (и вернет значение этого свойства). Для IE6-8 это elem.style.removeAttribute().
craigpatik
9

Ленивый путь (который заставит будущих дизайнеров проклинать ваше имя и убивать вас во сне):

#myelement 
{
    display: none !important;
}

Отказ от ответственности: я не защищаю этот подход, но это, безусловно, ленивый путь.

Joel
источник
2
Это, безусловно, лучший ответ на вопрос, потому что в духе плохой практики "ленивый". Ура!
ktamlyn
6
$('div[style*=block]').removeAttr('style');
antpaw
источник
Как насчет просто $ ('div [style]'). RemoveAttr ('style') ;?
Skybondsor
@skybondsor не будет удалять его только для элементов блока, как он хотел
antpaw
О да. Я думал, что он хотел удалить встроенные стили из всего.
Skybondsor
6

Если вы хотите удалить свойство в атрибуте стиля, а не просто установить его на что-то другое, вы используете removeProperty()метод:

document.getElementById('element').style.removeProperty('display');

ОБНОВЛЕНИЕ:
я сделал интерактивную скрипку, чтобы поиграть с различными методами и их результатами. По- видимому, не существует большая разница между set to empty string, set to faux valueи removeProperty(). Все они приводят к одному и тому же отступлению, которое является либо заранее заданным правилом CSS, либо значением браузера по умолчанию.

WoodrowShigeru
источник
5

Если отображение является единственным параметром в вашем стиле, вы можете выполнить эту команду, чтобы удалить все стили:

$('#element').attr('style','');

Означает, что если ваш элемент выглядел так раньше:

<input id="element" style="display: block;">

Теперь ваш элемент будет выглядеть так:

<input id="element" style="">
paulalexandru
источник
2

Измените плагин, чтобы больше не применять стиль. Это было бы намного лучше, чем удаление стиля после.

Джош Стодола
источник
1
отсюда и «ленивый»! нельзя найти, какой бит какого плагина это!
Гарольдо
4
Я не знаю, как вы определяете ленивый, я просто ответил, как я это сделаю. Кажется, имеет смысл исправить проблему там, где она возникла, а не исправлять вещи вне плагина. Я предвижу мессессесс при этом.
Джош Стодола
Каким образом? Если вы редактируете плагин, у вас могут возникнуть проблемы после обновления до новой версии, которая отменит ваши изменения и испортит макет. Кто вспомнит через год или около того, что вы сделали там одну маленькую корректировку? Я всегда пытаюсь найти другое решение, кроме изменения исходного кода плагина
Zefiryn
2

$el.css({ height : '', 'margin-top' : '' });

и т.д...

Просто оставьте второй параметр пустым!

Берт
источник
1
Если вы, ребята, что-то проголосовали, пожалуйста, оставьте комментарий.
Он Нрик
1
Я думаю , вы получили downvotes , потому что вы не ответили на задан вопрос : "jQuery plugin is applying an inline style (display:block). I'm feeling lazy and want to override it with display:none". Хотя ваш текст правильный, ваш код не решает вопрос.
Ушел кодирование
Решил проблему, которая у меня была. Tnx.
Йодалр
0

$("#element").css({ display: "none" });

Сначала я попытался удалить встроенный стиль в css, но он не работает и новый стиль, такой как display: ни один не будет перезаписан. Но в JQuery это работает так.

Cocoa3338
источник
0

У меня была похожая проблема со свойством width. Я не смог удалить! Важное из кода, и так как он нуждался в этом стиле в новом шаблоне, я добавил Id (modalstyling) к элементу, а затем добавил следующий код в шаблон:

<script type="text/javascript">
    $('#modalstyling').css('width', '');    //Removal of width !important
    $('#modalstyling').width('75%');        //Set custom width
</script>
Mbotet
источник