เป็นไปได้ไหมที่จะลบรูปแบบอินไลน์ด้วย jQuery


236

ปลั๊กอิน jQuery กำลังใช้รูปแบบอินไลน์ ( display:block) display:noneฉันรู้สึกขี้เกียจและต้องการที่จะแทนที่ได้ด้วย

อะไรคือวิธีที่ดีที่สุด (ขี้เกียจ)


79
ขอความช่วยเหลือจาก SO :)
Dave Swersky

15
วิธีที่ดีที่สุดและวิธีขี้เกียจไม่จำเป็นต้องเหมือนกัน
Joel

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 ผ่าน.css()วิธีของ jQuery หรือผ่านการจัดการ DOM โดยตรงของคุณสมบัติสไตล์ อย่างไรก็ตามจะไม่ลบสไตล์ที่ใช้กับกฎ CSS ในสไตล์ชีทหรือ<style>องค์ประกอบ

ฉันไม่คิดว่า jQuery กำลังทำเวทมนต์อยู่ที่นี่; ดูเหมือนว่าstyleวัตถุไม่นี้โดยกำเนิด


3
@ximi - ขอบคุณมาก ฉันกำลังคิดเกี่ยวกับเรื่องนี้และฉันตัดสินใจว่านี่ไม่ใช่เรื่องเสียเวลา สามารถนำมาใช้เพื่อตรวจสอบสไตล์แบบอินไลน์ซึ่งปัจจุบันยังไม่มีการสนับสนุนใน jQuery ( .css('property')ให้คุณค่าแก่คุณ แต่ไม่ได้บอกคุณว่ามาจากสไตล์อินไลน์หรือไม่)
Joseph Silber

ฉันมาถึงข้อสรุปเดียวกันอย่างอิสระ - สตริงว่างดูเหมือนว่าจะทำสิ่งที่เราต้องการ ไม่มีการบันทึกอย่างเป็นทางการใน API แต่หวังว่าจะยังคงทำงานต่อไปได้
Jon z

@ จอนซ์ - มีการบันทึกอย่างเป็นทางการ (แม้ว่าฉันจะไม่รู้ว่ามันเพิ่มเมื่อไหร่ แต่ฉันจำไม่ได้ว่าเห็นมันเมื่อฉันโพสต์สิ่งนี้) นอกจากนี้ฉันไม่คิดว่า jQuery กำลังทำอะไรที่นี่ styleวัตถุพื้นเมืองดูเหมือนว่าจะทำงานในลักษณะเดียวกัน ฉันแก้ไขคำตอบของฉันด้วยข้อมูลนี้
Joseph Silber

สิ่งนี้ใช้ได้กับสิ่งต่าง ๆ เช่นฟอนต์ตระกูลหรือ - ทำให้สับสนหรือไม่
TMH

4
@mosh - ทำไมคุณไม่ใช้$('#element').css('display', '')ล่ะ
Joseph Silber

158

.removeAttr("style") เพื่อกำจัดแท็กสไตล์ทั้งหมด ...

.attr("style") เพื่อทดสอบค่าและดูว่ามีรูปแบบอินไลน์หรือไม่ ...

.attr("style",newValue) เพื่อตั้งค่าเป็นอย่างอื่น


18
ซึ่งจะส่งผลกระทบต่อทุกdisplayรูปแบบอินไลน์ไม่เพียง
slaks

1
ฟังดูไม่ดีลองและแจ้งให้คุณทราบว่าฉันไม่เคยใช้รูปแบบอินไลน์ตามปกติมีความสุขมากที่จะล้างรูปแบบอินไลน์ทั้งหมด
Haroldo

11
@Slaks ดีว่าเป็นสิ่งที่ผมหมายโดย "ได้รับการกำจัดของแท็กสไตล์ทั้ง";)
ไฮเซนเบิร์ก

สวัสดี มีวิธีการตรวจสอบหรือไม่ว่า 'สไตล์' บางอย่างถูกนำไปใช้กับ ... $ ('*') จากแหล่งใด ๆ เช่นรูปแบบอินไลน์สไตล์การใส่สไตล์เช่นตัวอักษร b, แข็งแรง, css ไฟล์ .. ก่อนที่จะพยายาม ลบ / รีเซ็ตอะไรหรือเพียงแค่รีเซ็ตทั้งช็อตเดียว?
Milche Patern

เนื่องจากการลบทุกสไตล์แบบอินไลน์ทีละรายการจะไม่ลบstyleแอตทริบิวต์(ว่างเปล่าตอนนี้) ดังนั้นจึงเป็นสิ่งที่ควรทราบ
Brilliand

26

วิธีที่ง่ายที่สุดในการลบรูปแบบอินไลน์ (สร้างโดย jQuery) คือ:

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

โค้ดอินไลน์ควรหายไปและวัตถุของคุณควรปรับเปลี่ยนสไตล์ที่กำหนดไว้ล่วงหน้าในไฟล์ CSS ของคุณ

ทำงานให้ฉัน!


13

คุณสามารถกำหนดสไตล์โดยใช้cssวิธีการของ jQuery :

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

@Kobi: เขาถามถึงสไตล์แบบอินไลน์
Slaks

เอ่ออะไรนะ? ฉันอาจไม่เข้าใจบางสิ่ง ฉันคิดเกี่ยวกับ,<div style="display:block;"> $('div').hide()
Kobi

3
@Kobi: hideกล่าวถึงกรณีพิเศษหนึ่งกรณีในการแก้ไขรูปแบบอินไลน์ คำตอบนี้ตอบทุกกรณี ( hide/showนอกจากนี้ยังมีข้อ จำกัด เป็นสองซึ่งสองค่าจะถูกสลับเช่นไม่มี -> บล็อกหรือไม่มี -> แบบอินไลน์)
Joel

@Joel: hide/ showจะจดจำค่าเก่าของdisplayและเรียกคืนได้อย่างถูกต้อง
Slaks

@SLaks: เจ๋ง จะต้องมีการเพิ่มเมื่อเร็ว ๆ นี้เพราะฉันจำได้ว่ามีปัญหากับมันก่อน
Joel

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 และมี devs ไม่มากที่อาจทราบได้ว่าการโทร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

อ่าใช่ ฉันคิดว่าเขาต้องการที่จะลบรูปแบบอินไลน์ออกจากทุกสิ่ง
skybondsor


6

หากคุณต้องการที่จะลบคุณสมบัติภายในสไตล์แอตทริบิวต์ - ไม่ใช่แค่ตั้งค่าเป็นอย่างอื่น - คุณใช้removeProperty()วิธีการ:

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

UPDATE:
ฉันได้ทำซอโต้ตอบเพื่อเล่นกับวิธีการต่าง ๆ และผลลัพธ์ของพวกเขา เห็นได้ชัดว่ามีไม่มากของความแตกต่างระหว่างset to empty string,set to faux valueremoveProperty()และ พวกเขาทั้งหมดส่งผลในทางเลือกเดียวกัน - ซึ่งเป็นกฎ CSS ที่กำหนดไว้ล่วงหน้าหรือค่าเริ่มต้นของเบราว์เซอร์


5

ในกรณีที่จอแสดงผลเป็นพารามิเตอร์เดียวจากสไตล์ของคุณคุณสามารถเรียกใช้คำสั่งนี้เพื่อลบสไตล์ทั้งหมด:

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

หมายความว่าหากองค์ประกอบของคุณมีลักษณะเช่นนี้มาก่อน:

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

ตอนนี้องค์ประกอบของคุณจะมีลักษณะเช่นนี้:

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


2

เปลี่ยนปลั๊กอินเพื่อไม่ใช้สไตล์อีกต่อไป นั่นจะดีกว่าการลบสไตล์หลังจากนั้น


1
ดังนั้น 'ขี้เกียจ'! ไม่สามารถ arsed เพื่อค้นหาว่ามีปลั๊กอินตัวใด!
Haroldo

4
ฉันไม่รู้ว่าคุณนิยามคนขี้เกียจฉันแค่ตอบว่าฉันจะทำมันอย่างไร ดูเหมือนว่าเหมาะสมที่จะแก้ไขปัญหาที่มันเกิดขึ้นซึ่งตรงข้ามกับการแก้ไขสิ่งที่อยู่นอกปลั๊กอิน ฉันคาดหวังความยุ่งเหยิงเมื่อทำอย่างนั้น
Josh Stodola

ทางไหน หากคุณแก้ไขปลั๊กอินคุณอาจพบปัญหาหลังจากอัปเดตเป็นเวอร์ชันใหม่ซึ่งจะแทนที่การเปลี่ยนแปลงของคุณและทำให้เลย์เอาต์เสียหาย ใครจะจำได้ในเวลาหนึ่งปีหรือประมาณนั้นที่คุณได้ทำการปรับเล็กน้อยนั่น? ฉันพยายามค้นหาวิธีอื่นนอกเหนือจากการปรับเปลี่ยนซอร์สโค้ดปลั๊กอิน
Zefiryn

2

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

ฯลฯ ...

เพียงปล่อยว่างไว้ที่พารามิเตอร์ 2!


1
หากพวกคุณลงคะแนนเสียงบางอย่างโปรดแสดงความคิดเห็น
เขา Nrik

1
ฉันเดาว่าคุณจะได้รับการโหวตเพราะคุณไม่ได้ตอบคำถามที่ถาม : "jQuery plugin is applying an inline style (display:block). I'm feeling lazy and want to override it with display:none". แม้ว่าข้อความของคุณจะถูกต้อง แต่รหัสของคุณไม่สามารถแก้ปัญหาได้
Gone Coding

แก้ไขปัญหาที่ฉันมี tnx
yodalr

0

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

ตอนแรกฉันพยายามที่จะลบรูปแบบอินไลน์ใน CSS แต่มันไม่ทำงานและรูปแบบใหม่เช่นการแสดง: ไม่มีจะถูกเขียนทับ แต่ใน JQuery มันใช้งานได้เช่นนี้


0

ฉันมีปัญหาที่คล้ายกันกับคุณสมบัติความกว้าง ฉันไม่สามารถลบ! important จากโค้ดและเนื่องจากมันต้องการสไตล์นี้ในเทมเพลตใหม่ฉันจึงเพิ่ม Id (modalstyling) ให้กับองค์ประกอบและหลังจากนั้นฉันจึงเพิ่มรหัสต่อไปนี้ลงในเทมเพลต:

<script type="text/javascript">
    $('#modalstyling').css('width', '');    //Removal of width !important
    $('#modalstyling').width('75%');        //Set custom width
</script>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.