Czy można usunąć style wbudowane za pomocą jQuery?

236

Wtyczka jQuery stosuje styl wbudowany ( display:block). Czuję się leniwy i chcę to zastąpić display:none.

Jaki jest najlepszy (leniwy) sposób?

Haroldo
źródło
79
Poproś o pomoc w sprawie SO :)
Dave Swersky
15
Najlepszy i Leniwy sposób niekoniecznie są takie same.
Joel
1
Często słyszałem argument, że najlepsi programiści są leniwi ... blog.codinghorror.com/how-to-be-lazy-dumb-and-successful
kaelle
dwa sposoby można osiągnąć, np. za pomocą removeAttr () lub .css () patrz codepedia.info/jquery-remove-inline-style
Satinder singh

Odpowiedzi:

381

Aktualizacja: podczas gdy poniższe rozwiązanie działa, istnieje o wiele łatwiejsza metoda. Patrz poniżej.


Oto, co wymyśliłem i mam nadzieję, że to się przyda - Tobie lub komukolwiek innemu:

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

Spowoduje to usunięcie tego wbudowanego stylu.

Nie jestem pewien, czy tego właśnie chciałeś. Chciałeś to zmienić, co, jak już wspomniano, jest łatwe do zrobienia $('#element').css('display', 'inline').

To, czego szukałem, to rozwiązanie, aby całkowicie usunąć styl wbudowany. Potrzebuję tego do wtyczki, którą piszę, w której muszę tymczasowo ustawić niektóre wbudowane wartości CSS, ale chcę je później usunąć; Chcę, aby arkusz stylów przejął kontrolę. Mógłbym to zrobić, przechowując wszystkie oryginalne wartości, a następnie przywracając je do pierwotnego stanu, ale to rozwiązanie wydaje mi się znacznie czystsze.


Oto format wtyczki:

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

Jeśli umieścisz tę wtyczkę na stronie przed skryptem, możesz po prostu zadzwonić

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

i to powinno załatwić sprawę.


Aktualizacja : Teraz zdałem sobie sprawę, że to wszystko jest daremne. Możesz po prostu ustawić puste:

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

i zostanie automatycznie dla Ciebie usunięty.

Oto cytat z dokumentów :

Ustawienie wartości właściwości stylu na pusty ciąg - np. $('#mydiv').css('color', '')- usuwa tę właściwość z elementu, jeśli została już bezpośrednio zastosowana, czy to w atrybucie stylu HTML, poprzez .css()metodę jQuery , czy poprzez bezpośrednią manipulację DOM właściwości stylu. Nie usuwa jednak stylu, który został zastosowany z regułą CSS w arkuszu stylów lub <style>elemencie.

Nie sądzę, że jQuery robi tutaj magię; wydaje się, że styleobiekt robi to natywnie .

Joseph Silber
źródło
3
@ximi - Dzięki stary. Myślałem o tym i zdecydowałem, że to nie była taka strata czasu. Można go zastosować do sprawdzania stylów wbudowanych, dla których obecnie nie ma obsługi w jQuery ( .css('property')daje wartość, ale nie mówi, czy pochodzi ze stylu wbudowanego).
Joseph Silber,
Doszedłem do tego samego wniosku niezależnie - pusty ciąg wydaje się robić to, co chcemy. Nie jest to oficjalnie udokumentowane w API, ale mam nadzieję, że nadal będzie działać.
Jon z
@Jonz - jest oficjalnie udokumentowany (chociaż nie wiem, kiedy został dodany; nie pamiętam, żeby go tam widziałem, kiedy go pierwotnie opublikowałem). Poza tym nie sądzę, że jQuery tutaj coś robi. Obiekt rodzimy stylewydaje się zachowywać w ten sam sposób. Poprawiłem swoją odpowiedź tymi informacjami.
Joseph Silber,
Czy to działa z takimi rzeczami jak rodzina czcionek, czy też - nie psuje wyrażenia regularnego?
TMH
4
@mosh - Dlaczego po prostu nie używasz $('#element').css('display', '')?
Joseph Silber,
158

.removeAttr("style") aby pozbyć się całego tagu stylu ...

.attr("style") aby przetestować wartość i sprawdzić, czy istnieje styl wbudowany ...

.attr("style",newValue) ustawić to na coś innego

heisenberg
źródło
18
Wpłynie to na wszystkie style wbudowane, nie tylko display.
SLaks,
1
brzmi nieźle, spróbuj i daj znać, nigdy nie używam stylów wbudowanych, więc z radością usuwam wszystkie style wbudowane
Haroldo,
11
@Slaks dobrze, to miałem na myśli przez „pozbyć się całego tagu stylu”;)
heisenberg
Cześć. czy istnieje sposób, aby sprawdzić, czy jakiś „styl” został zastosowany do ... $ („*”), z dowolnego źródła, takiego jak styl wbudowany, atrybut stylu, taki jak font, b, strong, plik css .. przed próbą usunąć / zresetować coś lub po prostu zresetować wszystkie jeden strzał?
Milche Patern
Ponieważ usunięcie każdego stylu wstawianego osobno nie usuwa styleatrybutu (teraz pusty) , jest to nadal warte odnotowania.
Brilliand
26

Najprostszym sposobem na usunięcie stylów wbudowanych (wygenerowanych przez jQuery) jest:

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

Kod wewnętrzny powinien zniknąć, a obiekt powinien dostosować styl predefiniowany w plikach CSS.

Pracował dla mnie!

Rick van 't Wout Hofland
źródło
13

Możesz ustawić styl za pomocą cssmetody jQuery :

$('something:visible').css('display', 'none');
SLaks
źródło
@Kobi: Pyta o dowolny styl wbudowany.
SLaks,
tak, co? Prawdopodobnie czegoś nie rozumiem. Myślę o <div style="display:block;">, $('div').hide().
Kobi
3
@Kobi: hidedotyczy jednego specjalnego przypadku modyfikacji stylów wbudowanych. Ta odpowiedź dotyczy wszystkich przypadków. ( hide/showmają również ograniczenie jako dwie, które dwie wartości są przełączane, tj. brak-> blok lub brak-> wstawka.)
Joel
@Joel: hide/ showzapamięta starą wartość displayi przywróci ją poprawnie.
SLaks,
@SLaks: Cool. To musiało zostać dodane niedawno, ponieważ pamiętam, że miałem z tym wcześniej problemy.
Joel
12

możesz utworzyć wtyczkę jquery w ten sposób:

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]);
        });
    };
})();

stosowanie

$(".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é
źródło
1
Ta odpowiedź zawiera bardzo schludną sztuczkę w jednym wierszu, która jest przydatna nawet bez jQuery i którą niewielu deweloperów może wiedzieć - wywołanie elem.style.removeProperty('margin-left')usunie tylko margin-leftz styleatrybutu (i zwróci wartość tej właściwości). W przypadku IE6-8 jest to elem.style.removeAttribute().
craigpatik
9

Leniwy sposób (który spowoduje, że przyszli projektanci przeklną twoje imię i zamordują cię we śnie):

#myelement 
{
    display: none !important;
}

Uwaga: Nie popieram tego podejścia, ale z pewnością jest to leniwy sposób.

Joel
źródło
2
Jest to zdecydowanie najlepsza odpowiedź na pytanie, ponieważ w duchu złej praktyki „leniwy”. Twoje zdrowie!
ktamlyn
6
$('div[style*=block]').removeAttr('style');
antpaw
źródło
A co tylko z $ („div [style]”). RemoveAttr („style”) ;?
skybondsor
@skybondsor nie usunąłby go tylko dla elementów blokowych, tak jak chciał
antpaw
O tak. Myślałem, że chce usunąć ze wszystkich stylów wbudowanych.
skybondsor
6
$("[style*=block]").hide();
David Morton
źródło
6

Jeśli chcesz usunąć właściwość z atrybutu stylu - a nie tylko ustawić ją na coś innego - skorzystaj z removeProperty()metody:

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

AKTUALIZACJA:
Zrobiłem interaktywne skrzypce, aby bawić się różnymi metodami i ich wynikami. Najwyraźniej nie ma dużej różnicy między set to empty string, set to faux valuea removeProperty(). Wszystkie powodują tę samą awarię - która jest albo wstępnie określoną regułą CSS, albo wartością domyślną przeglądarki.

WoodrowShigeru
źródło
5

Jeśli wyświetlanie jest jedynym parametrem Twojego stylu, możesz uruchomić to polecenie, aby usunąć cały styl:

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

Oznacza to, że jeśli Twój element wyglądał wcześniej tak:

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

Teraz twój element będzie wyglądał następująco:

<input id="element" style="">
paulalexandru
źródło
3

Oto filtr wyboru inlineStyle, który napisałem, który podłącza się do jQuery.

$("div:inlineStyle(display:block)") // will select all divs with an inline style of display: block set

W twoim przypadku możesz użyć tego w następujący sposób:

$("div:inlineStyle(display:block)").hide();
Corban Brook
źródło
2

Zmień wtyczkę, aby nie stosować stylu. Byłoby to znacznie lepsze niż późniejsze usunięcie stylu.

Josh Stodola
źródło
1
stąd „leniwy”! Nie mogę się dowiedzieć, który to kawałek wtyczki!
Haroldo,
4
Nie wiem, jak definiujesz leniwego, właśnie odpowiedziałem, jak bym to zrobił. Wydaje się, że sensowne jest rozwiązanie problemu, skąd pochodzi, a nie załatanie sprawy poza wtyczką. Przewiduję bałagan, gdy robię to w ten sposób.
Josh Stodola
Która droga? Jeśli edytujesz wtyczkę, możesz mieć problemy po aktualizacji do nowej wersji, która zastąpi twoją zmianę i zepsuje układ. Kto zapamięta za jakiś czas, że dokonałeś tam tej małej korekty? Zawsze staram się znaleźć inne rozwiązanie niż modyfikowanie kodu źródłowego wtyczki
Zefiryn
2

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

itp...

Po prostu zostaw drugi parametr pusty!

Bert
źródło
1
Jeśli głosujecie na coś w dół, zostawcie komentarz.
He Nrik
1
Przypuszczam, że masz na downvotes bo nie odpowiedziałeś na pytanie zadawane : "jQuery plugin is applying an inline style (display:block). I'm feeling lazy and want to override it with display:none". Chociaż twój tekst jest poprawny, twój kod nie rozwiązuje pytania.
Gone Coding
Rozwiązałem problem, który miałem. Tnx.
yodalr
0

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

Na początku próbowałem usunąć styl wbudowany w css, ale to nie działa i nowy styl, taki jak display: żaden nie zostanie nadpisany. Ale w JQuery działa to tak.

Kakao 3338
źródło
0

Miałem podobny problem z właściwością width. Nie mogłem usunąć! Ważne z kodu, a ponieważ potrzebowałem tego stylu na nowym szablonie, dodałem do elementu Id (modalstyling), a następnie dodałem następujący kod do szablonu:

<script type="text/javascript">
    $('#modalstyling').css('width', '');    //Removal of width !important
    $('#modalstyling').width('75%');        //Set custom width
</script>
Mbotet
źródło