Apakah mungkin untuk menghapus gaya sebaris dengan jQuery?

236

Plugin jQuery menerapkan gaya inline ( display:block). Saya merasa malas dan ingin menimpanya display:none.

Apa cara (malas) terbaik?

Haroldo
sumber
79
Minta bantuan pada SO :)
Dave Swersky
15
Cara terbaik dan cara malas belum tentu sama.
Joel
1
Saya sering mendengar argumen bahwa pengembang terbaik malas ... blog.codinghorror.com/how-to-be-lazy-dumb-and-successful
kaelle
dua cara dapat mencapai i, e menggunakan removeAttr () atau .css () merujuk codepedia.info/jquery-remove-inline-style
Satinder singh

Jawaban:

381

Pembaruan: sementara solusi berikut berfungsi, ada metode yang jauh lebih mudah. Lihat di bawah.


Inilah yang saya buat, dan saya harap ini berguna - untuk Anda atau orang lain:

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

Ini akan menghapus gaya sebaris itu.

Saya tidak yakin ini yang Anda inginkan. Anda ingin menimpanya, yang, sebagaimana telah ditunjukkan, mudah dilakukan oleh $('#element').css('display', 'inline').

Apa yang saya cari adalah solusi untuk HAPUS gaya inline sepenuhnya. Saya memerlukan ini untuk plugin yang saya tulis di mana saya harus sementara mengatur beberapa nilai CSS inline, tetapi ingin kemudian menghapusnya; Saya ingin stylesheet mengambil kembali kendali. Saya bisa melakukannya dengan menyimpan semua nilai aslinya dan kemudian meletakkannya kembali sejajar, tetapi solusi ini terasa jauh lebih bersih bagi saya.


Ini dia dalam format plugin:

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

Jika Anda memasukkan plugin ini di halaman sebelum skrip Anda, Anda bisa menelepon

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

dan itu harus melakukan trik.


Pembaruan : Saya sekarang menyadari bahwa semua ini sia-sia. Anda cukup mengosongkannya:

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

dan secara otomatis akan dihapus untuk Anda.

Berikut kutipan dari dokumen :

Menyetel nilai properti style ke string kosong - misalnya $('#mydiv').css('color', '')- menghapus properti itu dari elemen jika sudah diterapkan secara langsung, baik dalam atribut gaya HTML, melalui .css()metode jQuery , atau melalui manipulasi DOM langsung dari properti style. Namun, itu tidak menghapus gaya yang telah diterapkan dengan aturan CSS di stylesheet atau <style>elemen.

Saya tidak berpikir jQuery melakukan sihir apa pun di sini; sepertinya styleobjek melakukan ini secara asli .

Joseph Silber
sumber
3
@ximi - Terima kasih kawan. Saya sudah memikirkan hal ini, dan saya memutuskan bahwa ini bukan buang-buang waktu. Itu bisa diadopsi untuk memeriksa gaya inline, yang saat ini tidak ada dukungan untuk jQuery ( .css('property')memberi Anda nilai, tetapi tidak memberi tahu Anda apakah itu berasal dari gaya inline).
Joseph Silber
Saya sampai pada kesimpulan yang sama secara independen - string kosong tampaknya melakukan apa yang kita inginkan. Itu tidak secara resmi didokumentasikan dalam API, tetapi mudah-mudahan akan terus bekerja.
Jon z
@Jonz - Ini adalah resmi didokumentasikan (meskipun saya tidak tahu kapan itu ditambahkan, saya tidak ingat melihat di sana ketika saya awalnya diposting ini). Juga, saya tidak berpikir jQuery melakukan apa pun di sini. styleObjek asli tampaknya berperilaku dengan cara yang sama. Saya mengubah jawaban saya dengan informasi ini.
Joseph Silber
Apakah ini berfungsi dengan hal-hal seperti font-family, atau apakah - mengacaukan regex?
TMH
4
@ oh - Kenapa tidak Anda gunakan saja $('#element').css('display', '')?
Joseph Silber
158

.removeAttr("style") untuk menghilangkan seluruh tag gaya ...

.attr("style") untuk menguji nilai dan melihat apakah gaya inline ada ...

.attr("style",newValue) untuk mengaturnya ke sesuatu yang lain

Heisenberg
sumber
18
Ini akan memengaruhi semua gaya inline, bukan hanya display.
SLaks
1
kedengarannya bagus, cobalah mencobanya dan beri tahu Anda, saya tidak pernah menggunakan gaya inline yang biasanya sangat senang untuk menghapus semua gaya inline
Haroldo
11
@Slaks yah, itulah yang saya maksudkan dengan "singkirkan seluruh tag gaya";)
heisenberg
Hai. apakah ada cara untuk memeriksa apakah beberapa 'gaya' telah diterapkan ke ... $ ('*'), dari sumber apa pun seperti gaya berjajar, menata atribut seperti font, b, kuat, file css .. sebelum mencoba untuk hapus / reset apa saja atau atur ulang semua foto dengan mudah?
Milche Patern
Karena menghapus setiap gaya sebaris secara individual tidak menghapus styleatribut (sekarang kosong) , ini masih layak dicatat
Brilliand
26

Cara termudah untuk menghapus gaya sebaris (dihasilkan oleh jQuery) adalah:

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

Kode sebaris harus menghilang dan objek Anda harus menyesuaikan gaya yang telah ditentukan dalam file CSS Anda.

Bekerja untukku!

Rick van 't Wout Hofland
sumber
13

Anda dapat mengatur gaya menggunakan cssmetode jQuery :

$('something:visible').css('display', 'none');
Slaks
sumber
@ Kobi: Dia bertanya tentang gaya inline.
SLaks
err, apa? Saya mungkin tidak mengerti sesuatu. Aku sedang berpikir tentang <div style="display:block;">, $('div').hide().
Kobi
3
@Kobi: hidemembahas satu kasus khusus untuk memodifikasi gaya inline. Jawaban ini membahas semua kasus. ( hide/showjuga memiliki batasan sebagai dua di mana dua nilai di-toggle. yaitu none-> block atau none-> inline.)
Joel
@ Joel: hideSaya showakan mengingat nilai lama displaydan mengembalikannya dengan benar.
SLaks
@ SLaks: Keren. Itu pasti telah ditambahkan baru-baru ini, karena saya ingat pernah mengalami masalah dengan itu sebelumnya.
Joel
12

Anda dapat membuat plugin jquery seperti ini:

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

pemakaian

$(".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é
sumber
1
Jawaban ini berisi trik satu-baris yang sangat rapi yang berguna bahkan tanpa jQuery dan yang mungkin tidak diketahui banyak pengguna — panggilan elem.style.removeProperty('margin-left')akan dihapus hanya margin-leftdari styleatribut (dan mengembalikan nilai properti itu). Untuk IE6-8 itu elem.style.removeAttribute().
craigpatik
9

Cara Malas (yang akan menyebabkan desainer masa depan mengutuk nama Anda dan membunuh Anda dalam tidur Anda):

#myelement 
{
    display: none !important;
}

Penafian: Saya tidak menganjurkan pendekatan ini, tapi itu pasti cara malas.

Joel
sumber
2
Ini jelas jawaban terbaik untuk pertanyaan karena dalam semangat praktik yang buruk "malas". Bersulang!
ktamlyn
6
$('div[style*=block]').removeAttr('style');
antpaw
sumber
Bagaimana dengan hanya $ ('div [style]'). RemoveAttr ('style') ;?
skybondsor
@skybondsor tidak akan menghapusnya hanya untuk elemen blok, seperti yang dia inginkan
antpaw
Ah iya. Saya pikir dia ingin menghapus gaya sebaris dari segalanya.
skybondsor
6
$("[style*=block]").hide();
David Morton
sumber
6

Jika Anda ingin menghapus properti dalam atribut style - tidak hanya mengaturnya ke hal lain - Anda menggunakan removeProperty()metode ini:

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

UPDATE:
Saya telah membuat biola interaktif untuk bermain-main dengan berbagai metode dan hasil mereka. Rupanya, tidak ada banyak perbedaan antara set to empty string, set to faux valuedan removeProperty(). Semuanya menghasilkan fallback yang sama - yang merupakan aturan CSS yang diberikan sebelumnya atau nilai default browser.

WoodrowShigeru
sumber
5

Jika tampilan adalah satu-satunya parameter dari gaya Anda, Anda dapat menjalankan perintah ini untuk menghapus semua gaya:

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

Berarti jika elemen Anda terlihat seperti ini sebelumnya:

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

Sekarang elemen Anda akan terlihat seperti ini:

<input id="element" style="">
paulalexandru
sumber
3

Inilah filter pemilih inlineStyle yang saya tulis yang dihubungkan ke jQuery.

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

Dalam kasus Anda, Anda dapat menggunakan ini seperti:

$("div:inlineStyle(display:block)").hide();
Corban Brook
sumber
2

Ubah plugin untuk tidak lagi menerapkan gaya. Itu akan jauh lebih baik daripada menghapus gaya sesudahnya.

Josh Stodola
sumber
1
maka dari itu 'malas'! tidak dapat arsed untuk menemukan yang sedikit dari plugin itu!
Haroldo
4
Saya tidak tahu bagaimana Anda mendefinisikan malas, saya hanya menjawab bagaimana saya akan melakukannya. Masuk akal untuk memperbaiki masalah dari mana asalnya daripada menambal sesuatu di luar plugin. Saya melihat kekacauan saat melakukannya dengan cara itu.
Josh Stodola
Jalan yang mana? Jika Anda mengedit plugin, Anda mungkin mendapatkan masalah setelah memperbarui ke versi baru yang akan menimpa perubahan Anda dan mengacaukan tata letak. Siapa yang akan ingat dalam waktu setahun atau lebih ketika Anda membuat penyesuaian kecil di sana? Saya selalu berusaha mencari solusi selain memodifikasi kode sumber plugin
Zefiryn
2

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

dll ...

Biarkan param 2 kosong!

Bert
sumber
1
Jika kalian memilih sesuatu, silakan tinggalkan komentar.
He Nrik
1
Saya kira Anda punya downvotes karena Anda tidak menjawab pertanyaan yang diajukan : "jQuery plugin is applying an inline style (display:block). I'm feeling lazy and want to override it with display:none". Meskipun teks Anda benar, kode Anda tidak menyelesaikan pertanyaan.
Hilang Pengkodean
Memecahkan masalah yang saya miliki. Tnx.
yodalr
0

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

Pada awalnya saya mencoba untuk menghapus gaya inline di css, tetapi tidak berfungsi dan gaya seperti tampilan baru: tidak ada yang akan ditimpa. Tetapi dalam JQuery berfungsi seperti ini.

Cocoa3338
sumber
0

Saya memiliki masalah serupa dengan properti width. Saya tidak bisa menghapus! Penting dari kode, dan karena itu membutuhkan gaya ini pada template baru saya menambahkan ID (modalstyling) ke elemen dan kemudian saya menambahkan kode berikut ke template:

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