Чи можна видалити вбудовані стилі за допомогою jQuery?


236

Плагін jQuery застосовує стиль вбудованого ( display:block). Я відчуваю себе лінивим і хочу перекрити цеdisplay:none .

Який найкращий (лінивий) спосіб?


79
Попросіть допомоги на SO :)
Дейв Сверський

15
Найкращий спосіб і Ледачий спосіб не обов'язково однакові.
Джоель

1
Я часто чув аргументи про те, що кращі розробники лінуються ... blog.codinghorror.com/how-to-be-lazy-dumb-and-successful
kaelle

двома способами можна досягти i, e, використовуючи RemoveAttr () або .css (), зверніться до codepedia.info/jquery-remove-inline-style
Satinder 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, методом jQuery .css()або шляхом прямого DOM-маніпулювання властивістю стилю. Однак це не видаляє стиль, застосований із правилом CSS у таблиці стилів або <style>елементі.

Я не думаю, що jQuery не робить тут ніякої магії; здається, styleоб’єкт робить це споконвічно .


3
@ximi - Спасибі людина. Я думав про це, і вирішив, що це не така втрата часу. Він може бути прийнятий для перевірки стилів вбудованих даних, для яких в даний час немає підтримки в jQuery ( .css('property')дає значення, але він не говорить вам, чи походить він з вбудованого стилю).
Джозеф Сільбер

Я дійшов такого ж висновку самостійно - порожня рядок, здається, робить саме те, що ми хочемо. Це офіційно не зафіксовано в API, але, сподіваємось, він продовжить працювати.
Jon z

@Jonz - Це буде офіційно задокументований (хоча я не знаю , коли він був доданий, я не пам'ятаю , що там , коли я спочатку відправив це). Крім того, я не думаю, що jQuery тут робить щось. Народний styleоб’єкт, здається, поводиться так само. Я доповнив свою відповідь цією інформацією.
Джозеф Сільбер

Чи це працює з такими речами, як сімейство шрифтів, чи - зіпсує регулярний вираз?
TMH

4
@mosh - Чому ви просто не використовуєте $('#element').css('display', '')?
Джозеф Сільбер

158

.removeAttr("style") просто позбутися цілого тегу стилю ...

.attr("style") перевірити значення та перевірити, чи існує стиль вбудованого ...

.attr("style",newValue) встановити його на щось інше


18
Це вплине на всі стилі вбудованих, а не лише display.
СЛАкс

1
добре звучить, спробуйте, і дайте вам знати, я ніколи не використовую стилі inline, як правило, з радістю очищаю всі стилі inline
Haroldo

11
@Slaks добре, ось що я мав на увазі під «позбутися всього тегу стилю»;)
heisenberg

Привіт. чи є спосіб перевірити, чи було застосовано якийсь "стиль" до ... $ ('*') з будь-якого джерела, наприклад, вкладеного стилю, стилінг розподілити як шрифт, b, сильний, файл css .. перед тим, як намагатися видалити / скинути що-небудь або просто провести скидання всього одного знімка?
Мілче Патерн

Оскільки видалення кожного стилю вбудованої форми окремо не видаляє (тепер порожній) styleатрибут, це все-таки варто звернути увагу.
Brilliand

26

Найпростіший спосіб видалити вбудовані стилі (згенерований jQuery):

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

Вбудований код повинен зникнути, а ваш об'єкт повинен адаптувати стиль, визначений у ваших CSS-файлах.

Працювали для мене!


13

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

$('something:visible').css('display', 'none');

@Kobi: Він запитує про будь-який стиль inline.
СЛАкс

помилка, що? Я, мабуть, щось не розумію. Я думаю про те <div style="display:block;">, $('div').hide().
Кобі

3
@Kobi: hideрозглядає один особливий випадок зміни стилів вбудованої форми. Ця відповідь стосується всіх випадків. ( hide/showТакож мають обмеження в вигляді двох, два значення перемикаються тобто тим НЕ > блок або тим НЕ > інлайн ..)
Джоул

@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

1
Ця відповідь містить дуже акуратний однорядковий трюк, який корисний навіть без jQuery і який може знати не багато розробників - виклик elem.style.removeProperty('margin-left')видалить просто margin-leftз styleатрибута (і поверне значення цього властивості). Для IE6-8 це elem.style.removeAttribute().
craigpatik

9

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

#myelement 
{
    display: none !important;
}

Відмова: Я не виступаю за такий підхід, але, безумовно, це ледачий спосіб.


2
Це, очевидно, найкраща відповідь на питання, оскільки це в дусі поганої практики "ледачий". Ура!
ktamlyn

6
$('div[style*=block]').removeAttr('style');

Як щодо просто $ ('div [style]'). RemoveAttr ('style') ;?
skybondsor

@skybondsor не видаляв би його лише для елементів блоку, як він цього хотів
antpaw

Ага, так. Я думав, що він хоче з усього вилучити вбудовані стилі.
небосхил


6

Якщо ви хочете видалити властивість з атрибуту стилю - а не просто встановити його на щось інше - ви використовуєте removeProperty()метод:

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

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


5

Якщо дисплей є єдиним параметром у вашому стилі, ви можете запустити цю команду, щоб видалити весь стиль:

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

Це означає, що якщо ваш елемент раніше виглядав так:

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

Тепер ваш елемент буде виглядати приблизно так:

<input id="element" style="">


2

Змініть плагін, щоб більше не застосовувати стиль. Це було б набагато краще, ніж знімати стиль там-після.


1
отже, «ледачий»! не можу розібратися, щоб знайти, який біт якого плагіна це!
Гарольдо

4
Я не знаю, як ви визначаєте ледачий, я просто відповів, як би це зробити. Здається, має сенс виправити проблему там, де вона виникає, на відміну від виправлення речей поза плагіном. Я передбачаю безладдя, коли роблю це так.
Джош Стодола

Яким чином? Якщо ви відредагуєте плагін, у вас можуть виникнути проблеми після оновлення до нової версії, що змінить ваші зміни та зіпсує макет. Хто запам'ятає через рік або близько того, що ви зробили ту саму маленьку поправку? Я завжди намагаюся знайти інше рішення, ніж змінити вихідний код плагіна
Zefiryn

2

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

тощо ...

Просто залиште 2-й парам порожнім!


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.
yodalr

0

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

Спочатку я намагався видалити стиль вбудованого в css, але це не працює і новий стиль, як-от дисплей: жоден не буде перезаписаний. Але в JQuery це працює так.


0

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

<script type="text/javascript">
    $('#modalstyling').css('width', '');    //Removal of width !important
    $('#modalstyling').width('75%');        //Set custom width
</script>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.