JQuery ile satır içi stilleri kaldırmak mümkün mü?


236

Bir jQuery eklentisi satır içi bir stil ( display:block) uyguluyor . Tembel hissediyorum ve bunu geçersiz kılmak istiyorum display:none.

En iyi (tembel) yol nedir?


79
SO hakkında yardım isteyin :)
Dave Swersky

15
En iyi yol ve Tembel yol mutlaka aynı değildir.
Joel

1
En iyi geliştiricilerin tembel olduğu iddiasını sık sık duydum ... blog.codinghorror.com/how-to-be-lazy-dumb-and-successful
kaelle

removeAttr () veya .css () kullanarak i, e'ye iki yolla ulaşabilirsiniz. codepedia.info/jquery-remove-inline-style
Satinder singh

Yanıtlar:


381

Güncelleme: aşağıdaki çözüm çalışırken, çok daha kolay bir yöntem var. Aşağıya bakınız.


İşte ben geldim ve umarım bu işe yarar - size veya başka birine:

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

Bu, satır içi stilini kaldıracaktır.

İstediğin bu olduğundan emin değilim. Daha önce de belirtildiği gibi, kolayca yapılabilen onu geçersiz kılmak istediniz $('#element').css('display', 'inline').

Aradığım şey, satır içi stili tamamen KALDIRMAK için bir çözümdü. Ben geçici olarak bazı satır içi CSS değerleri ayarlamak zorunda yazıyorum bir eklenti için bu gerekir, ancak daha sonra bunları kaldırmak istiyorum; Stil sayfasının kontrolü geri almasını istiyorum. Tüm orijinal değerlerini saklayıp sonra tekrar sıraya koyarak bunu yapabilirdim, ama bu çözüm bana çok daha temiz geliyor.


İşte eklenti formatında:

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

Bu eklentiyi komut dosyanızdan önceki sayfaya eklerseniz,

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

ve bu hile yapmalı.


Güncelleme : Şimdi tüm bunların boş olduğunu fark ettim. Sadece boş olarak ayarlayabilirsiniz:

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

ve sizin için otomatik olarak kaldırılır.

İşte dokümanlardan bir alıntı :

Bir style özelliğinin değerinin boş bir dizeye ayarlanması (ör. $('#mydiv').css('color', '')- HTML stili özelliğinde, jQuery'nin .css()yöntemi yoluyla veya style özelliğinin doğrudan DOM manipülasyonu yoluyla doğrudan uygulanmışsa, bu özelliği bir öğeden kaldırır . Ancak, bir stil sayfasında veya <style>öğesinde CSS kuralı ile uygulanan bir stili kaldırmaz .

JQuery'nin burada sihir yaptığını sanmıyorum; nesne bunu doğal olarak yapıyor gibi görünüyorstyle .


3
@ximi - Teşekkürler dostum. Bunu düşünüyordum ve bunun zaman kaybı olmadığına karar verdim. Şu anda jQuery'de desteklenmeyen satır içi stilleri kontrol etmek için benimsenebilir ( .css('property')size değer verir, ancak bunun satır içi bir stilden gelip gelmediğini söylemez).
Joseph Silber

Aynı sonuca bağımsız olarak geldim - boş dize istediğimizi yapıyor gibi görünüyor. Resmi olarak API'da belgelenmemiştir, ancak umarım çalışmaya devam edecektir.
Jon z

@Jonz - O edilir resmen (o eklendiğinde bilmiyorum gerçi; Ben başlangıçta bu orada yayınlanmıştır zaman gördüğümü hatırlamıyorum) belgelenmiştir. Ayrıca, ben jQuery burada bir şey yapmak olduğunu sanmıyorum. Yerel stylenesne aynı şekilde davranıyor gibi görünüyor. Cevabımı bu bilgilerle değiştirdim.
Joseph Silber

Bu yazı tipi ailesi gibi şeylerle çalışır mı yoksa - normal ifadeyi karıştırır mı?
TMH

4
@mosh - Neden sadece kullanmıyorsun $('#element').css('display', '')?
Joseph Silber

158

.removeAttr("style") tüm stil etiketinden kurtulmak için ...

.attr("style") değeri test etmek ve bir satır içi stilin var olup olmadığını görmek için ...

.attr("style",newValue) başka bir şeye ayarlamak için


18
Bu etkileyecek tüm değil, sadece satır içi stiller display.
SLaks

1
kulağa iyi geliyor denemek ve size bildirmek, normalde tüm satır içi stilleri temizlemek için çok mutlu inline stilleri kullanmıyorum
Haroldo

11
@Slaks iyi, "tüm stil etiketinden kurtulmak" ile kastettiğim budur;)
heisenberg

Selam. eğimli bir stil gibi herhangi bir kaynaktan, yazı tipi, b, güçlü, css dosyası gibi stil özniteliği ... $ ('*') için bazı 'stil' uygulanıp uygulanmadığını kontrol etmenin bir yolu var mı? herhangi bir şeyi kaldırmak / sıfırlamak veya sadece tek bir çekim sıfırlamak?
Milche Patern

Her satır içi stili ayrı ayrı kaldırmak (şimdi boş) styleözniteliğini kaldırmaz , bu yine de kayda değer.
Brilliand

26

Satır içi stilleri (jQuery tarafından oluşturulan) kaldırmanın en kolay yolu:

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

Satır içi kod kaybolmalı ve nesneniz CSS dosyalarınızda önceden tanımlanmış stili uyarlamalıdır.

Benim için çalıştı!


13

Stili jQuery'nin cssyöntemini kullanarak ayarlayabilirsiniz :

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

@Kobi: Herhangi bir satır içi stilini soruyor.
SLaks

err, ne? Muhtemelen bir şey anlamıyorum. Ben düşünüyorum <div style="display:block;">, $('div').hide().
Kobi

3
@Kobi: hidesatır içi stilleri değiştirmek için özel bir durumu ele alır. Bu cevap tüm durumları ele almaktadır. ( hide/showayrıca iki değerin değiştirildiği iki sınırlama vardır. yani none-> blok veya none-> satır içi.)
Joel

@Joel: hide/ showeski değerini hatırlar displayve doğru şekilde geri yükler.
SLaks

@SLaks: Güzel. Daha önce sorun yaşadığımı hatırladığım için, bu son zamanlarda eklenmiş olmalı.
Joel

12

bunun gibi bir jquery eklentisi oluşturabilirsiniz:

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

kullanım

$(".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
Bu cevap bile jQuery olmadan ve pek Devs know-çağıran olabilecek faydalı bir çok düzgün bir hat trick içeriyor elem.style.removeProperty('margin-left')sadece kaldıracaktır margin-leftgelen styleözniteliği (ve bu özelliğin değerini döndürür). IE6-8 için öyle elem.style.removeAttribute().
craigpatik

9

Tembel yol (gelecekteki tasarımcıların adınızı lanetlemesine ve uykunuzda sizi öldürmesine neden olacak):

#myelement 
{
    display: none !important;
}

Feragatname: Bu yaklaşımı savunmuyorum, ama kesinlikle tembel bir yol.


2
Bu açıkça sorunun en iyi cevabı çünkü onun kötü uygulama "tembel" ruhu içinde. Şerefe!
ktamlyn

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

Peki ya sadece $ ('div [style]'). RemoveAttr ('style') ;?
skybondsor

@skybondsor istediği gibi sadece blok elemanlar için kaldırmaz
antpaw

Ah evet. Satır içi stilleri her şeyden kaldırmak istediğini sanıyordum.
skybondsor


6

Bir stil özniteliğindeki bir özelliği kaldırmak istiyorsanız - yalnızca başka bir şeye ayarlamakla kalmaz - removeProperty()yöntemi kullanırsınız:

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

GÜNCELLEME: Farklı yöntemler ve sonuçlarıyla oynamak
için etkileşimli bir keman yaptım . Görünüşe göre, orada arasındaki farkın çok değil set to empty string, set to faux valueve removeProperty(). Bunların tümü, önceden verilen bir CSS kuralı veya tarayıcının varsayılan değeri olan aynı yedekle sonuçlanır.


5

Ekranın stilinizden tek parametre olması durumunda, tüm stili kaldırmak için bu komutu çalıştırabilirsiniz:

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

Öğeniz daha önce böyle görünüyorsa:

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

Şimdi elementiniz şöyle görünecek:

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

3

İşte ben jQuery bu fişler yazdı inlineStyle seçici filtre .

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

Sizin durumunuzda bunu şöyle kullanabilirsiniz:

$("div:inlineStyle(display:block)").hide();

2

Eklentiyi artık stili uygulamayacak şekilde değiştirin. Bu, oradaki stili kaldırmaktan çok daha iyi olurdu.


1
dolayısıyla 'tembel'! hangi eklenti hangi bit bulmak için silahlı olamaz!
Haroldo

4
Tembel olarak nasıl tanımladığını bilmiyorum, sadece nasıl yapacağımı cevapladım. Eklentinin dışında bir şeyleri yamalamak yerine sorunun ortaya çıktığı yeri düzeltmek mantıklı görünüyor. Bunu yaparken dağınıklığı öngörüyorum.
Josh Stodola

Hangi yöne? Eklentiyi düzenlerseniz, değişikliğinizi geçersiz kılacak ve düzeni bozacak yeni sürüme güncelledikten sonra sorun yaşayabilirsiniz. Bir yıl içinde kim orada küçük bir ayarlama yaptığınızı hatırlayacak? Her zaman eklenti kaynak kodunu değiştirmekten başka bir çözüm bulmaya çalışıyorum
Zefiryn

2

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

vb...

2. parametreyi boş bırakın!


1
Eğer bir şeyi aşağı oylarsanız, lütfen yorum bırakın.
2014'te

1
Sana cevap vermedi çünkü downvotes var tahmin ediyorum soru sordu : "jQuery plugin is applying an inline style (display:block). I'm feeling lazy and want to override it with display:none". Metniniz doğru olmasına rağmen, kodunuz soruyu çözmez.
Kodlama Gone

Sahip olduğum problemi çözdüm. Tnx.
yodalr

0

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

İlk başta css'deki satır içi stili kaldırmaya çalıştım, ancak çalışmıyor ve ekran gibi yeni bir stil yok: hiçbirinin üzerine yazılmayacak. Ancak JQuery'de böyle çalışır.


0

Width özelliği ile benzer bir sorun vardı. Önemli! Koddan kaldıramadım ve yeni bir şablonda bu stile ihtiyaç duyduğumdan öğeye bir Id (modalstyling) ekledim ve daha sonra şablona aşağıdaki kodu ekledim:

<script type="text/javascript">
    $('#modalstyling').css('width', '');    //Removal of width !important
    $('#modalstyling').width('75%');        //Set custom width
</script>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.