Có thể loại bỏ các kiểu nội tuyến với jQuery không?


236

Một plugin jQuery đang áp dụng một kiểu nội tuyến ( display:block). Tôi cảm thấy lười biếng và muốn ghi đè lên nó display:none.

Cách tốt nhất (lười biếng) là gì?


79
Yêu cầu trợ giúp về SO :)
Dave Swersky 17/03/2016

15
Cách tốt nhất và cách lười biếng không nhất thiết phải giống nhau.
Joel

1
Tôi thường nghe lập luận rằng các nhà phát triển tốt nhất thường lười biếng ... blog.codinghorror.com/how-to-be-lazy-dumb-and-successful
kaelle 7/1/2016

hai cách có thể đạt được i, e bằng cách sử dụng removeAttr () hoặc .css () tham khảo codepedia.info/jquery-remove-inline-style
Satinder singh

Câu trả lời:


381

Cập nhật: trong khi giải pháp sau hoạt động, có một phương pháp dễ dàng hơn nhiều. Xem bên dưới.


Đây là những gì tôi nghĩ ra và tôi hy vọng điều này có ích - cho bạn hoặc bất kỳ ai khác:

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

Điều này sẽ loại bỏ phong cách nội tuyến đó.

Tôi không chắc đây là thứ bạn muốn. Bạn muốn ghi đè lên nó, như đã chỉ ra, dễ dàng thực hiện $('#element').css('display', 'inline').

Những gì tôi đang tìm kiếm là một giải pháp để loại bỏ hoàn toàn phong cách nội tuyến. Tôi cần cái này cho một plugin tôi đang viết trong đó tôi phải tạm thời đặt một số giá trị CSS nội tuyến, nhưng sau đó muốn xóa chúng; Tôi muốn bản định kiểu lấy lại quyền kiểm soát. Tôi có thể làm điều đó bằng cách lưu trữ tất cả các giá trị ban đầu của nó và sau đó đưa chúng trở lại nội tuyến, nhưng giải pháp này cho tôi cảm thấy sạch sẽ hơn nhiều.


Đây là định dạng 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));

Nếu bạn bao gồm plugin này trong trang trước tập lệnh của mình, thì bạn có thể chỉ cần gọi

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

và điều đó nên làm các mẹo.


Cập nhật : Bây giờ tôi nhận ra rằng tất cả điều này là vô ích. Bạn chỉ có thể đặt nó thành trống:

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

và nó sẽ tự động được gỡ bỏ cho bạn.

Đây là một trích dẫn từ các tài liệu :

Đặt giá trị của thuộc tính kiểu thành một chuỗi trống - ví dụ: $('#mydiv').css('color', '')loại bỏ thuộc tính đó khỏi một phần tử nếu nó đã được áp dụng trực tiếp, cho dù trong thuộc tính kiểu HTML, thông qua .css()phương thức của jQuery hoặc thông qua thao tác DOM trực tiếp của thuộc tính kiểu. Tuy nhiên, nó không xóa một kiểu đã được áp dụng với quy tắc CSS trong biểu định kiểu hoặc <style>phần tử.

Tôi không nghĩ jQuery đang làm bất kỳ phép thuật nào ở đây; có vẻ như các styleđối tượng thực hiện điều này natively .


3
@imumi - Cảm ơn người đàn ông. Tôi đã suy nghĩ về điều này và tôi đã quyết định rằng đây không phải là một sự lãng phí thời gian. Nó có thể được chấp nhận để kiểm tra các kiểu nội tuyến, hiện không có hỗ trợ cho jQuery ( .css('property')cung cấp cho bạn giá trị, nhưng nó không cho bạn biết liệu nó có xuất phát từ kiểu nội tuyến hay không).
Joseph Silber

Tôi đi đến cùng một kết luận một cách độc lập - chuỗi rỗng dường như chỉ làm những gì chúng ta muốn. Nó không được ghi lại chính thức trong API, nhưng hy vọng sẽ tiếp tục hoạt động.
Jon z

@Jonz - Nó được ghi lại chính thức (mặc dù tôi không biết khi nào nó được thêm vào; tôi không nhớ đã nhìn thấy nó ở đó khi tôi đăng bài này lần đầu). Ngoài ra, tôi không nghĩ jQuery đang làm bất cứ điều gì ở đây. Các styleđối tượng bản địa dường như cư xử theo cách tương tự. Tôi đã sửa đổi câu trả lời của tôi với thông tin này.
Joseph Silber

Liệu cái này có hoạt động với những thứ như font-family, hay the - làm rối loạn regex không?
TMH

4
@mosh - Tại sao bạn không sử dụng $('#element').css('display', '')?
Joseph Silber

157

.removeAttr("style") để loại bỏ toàn bộ thẻ kiểu ...

.attr("style") để kiểm tra giá trị và xem nếu một kiểu nội tuyến tồn tại ...

.attr("style",newValue) để đặt nó vào một cái gì đó khác


18
Điều này sẽ ảnh hưởng đến tất cả các phong cách nội tuyến, không chỉ display.
SLaks 17/03/2016

1
Nghe có vẻ tốt, hãy thử và cho bạn biết, tôi không bao giờ sử dụng các kiểu nội tuyến thông thường nên rất vui khi xóa tất cả các kiểu nội tuyến
Haroldo 17/03/2016

11
@Slaks tốt, đó là những gì tôi có nghĩa là "thoát khỏi toàn bộ thẻ phong cách";)
heisenberg

Chào. có cách nào để kiểm tra xem một số 'kiểu' đã được áp dụng cho ... $ ('*') hay không, từ bất kỳ nguồn nào như kiểu inline, kiểu dáng thuộc tính như phông chữ, b, mạnh, tệp css .. trước khi từ chối loại bỏ / thiết lập lại bất cứ điều gì hoặc chỉ đơn giản là thiết lập lại tất cả một shot?
Milche P Parent

Vì việc xóa từng kiểu nội tuyến riêng lẻ không xóa thuộc tính (bây giờ trống) style, điều này vẫn đáng lưu ý.
Brilliand

26

Cách dễ nhất để loại bỏ các kiểu nội tuyến (được tạo bởi jQuery) sẽ là:

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

Mã nội tuyến sẽ biến mất và đối tượng của bạn sẽ điều chỉnh kiểu được xác định trước trong các tệp CSS của bạn.

Đã làm cho tôi!


13

Bạn có thể đặt kiểu bằng cssphương thức của jQuery :

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

@Kobi: Anh ấy hỏi về bất kỳ phong cách nội tuyến.
SLaks 17/03/2016

có lỗi không Tôi có lẽ không hiểu điều gì đó. Tôi đang suy nghĩ về <div style="display:block;">, $('div').hide().
Kobi

3
@Kobi: hidegiải quyết một trường hợp đặc biệt về sửa đổi kiểu nội tuyến. Câu trả lời này giải quyết tất cả các trường hợp. ( hide/showcũng có một giới hạn là hai trong đó hai giá trị được bật. tức là không-> chặn hoặc không-> nội tuyến.)
Joel

@Joel: hide/ showsẽ nhớ giá trị cũ của displayvà khôi phục lại chính xác.
SLaks 17/03/2016

@SLaks: Tuyệt. Điều đó phải được thêm vào gần đây, vì tôi nhớ đã gặp rắc rối với nó trước đây.
Joel

12

bạn có thể tạo một plugin jquery như thế này:

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

sử dụng

$(".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
Câu trả lời này chứa một thủ thuật một dòng rất gọn gàng, hữu ích ngay cả khi không có jQuery và không nhiều nhà phát triển có thể biết gọi điện thoại elem.style.removeProperty('margin-left')sẽ loại bỏ margin-leftkhỏi stylethuộc tính (và trả về giá trị của thuộc tính đó). Đối với IE6-8 elem.style.removeAttribute().
craigpatik

9

Cách Lười biếng (sẽ khiến các nhà thiết kế trong tương lai nguyền rủa tên bạn và giết bạn trong giấc ngủ):

#myelement 
{
    display: none !important;
}

Tuyên bố miễn trừ trách nhiệm: Tôi không ủng hộ cách tiếp cận này, nhưng chắc chắn đó là cách lười biếng.


2
Đây rõ ràng là câu trả lời tốt nhất cho câu hỏi bởi vì nó theo tinh thần của thực hành xấu "lười biếng". Chúc mừng!
ktamlyn

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

Điều gì về chỉ $ ('div [style]'). RemoveAttr ('style');?
skybondsor

@skybondsor sẽ không xóa nó chỉ cho các phần tử khối, như anh ta muốn
antpaw

À, vâng. Tôi nghĩ rằng anh ấy muốn loại bỏ các phong cách nội tuyến từ tất cả mọi thứ.
skybondsor


6

Nếu bạn muốn xóa một thuộc tính trong thuộc tính style - không chỉ đặt nó thành một thứ khác - bạn sử dụng removeProperty()phương thức:

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

CẬP NHẬT:
Tôi đã thực hiện một câu đố tương tác để chơi xung quanh với các phương pháp khác nhau và kết quả của chúng. Rõ ràng, không có nhiều sự khác biệt giữa set to empty string, set to faux valueremoveProperty(). Tất cả đều dẫn đến cùng một dự phòng - đó là quy tắc CSS được đặt trước hoặc giá trị mặc định của trình duyệt.


5

Trong trường hợp màn hình là tham số duy nhất từ ​​kiểu của bạn, bạn có thể chạy lệnh này để xóa tất cả kiểu:

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

Có nghĩa là nếu yếu tố của bạn trông như thế này trước đây:

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

Bây giờ yếu tố của bạn sẽ trông như thế này:

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


2

Thay đổi plugin để không còn áp dụng phong cách. Điều đó sẽ tốt hơn nhiều so với việc loại bỏ phong cách sau đó.


1
do đó 'lười biếng'! Không thể tìm thấy nó là plugin nào!
Haroldo

4
Tôi không biết làm thế nào bạn xác định lười biếng, tôi chỉ trả lời làm thế nào tôi sẽ làm điều đó. Có vẻ có ý nghĩa để khắc phục vấn đề bắt nguồn từ nó trái ngược với việc vá những thứ bên ngoài plugin. Tôi thấy trước sự lộn xộn khi làm theo cách đó.
Josh Stodola

Lối nào? Nếu bạn chỉnh sửa plugin, bạn có thể gặp sự cố sau khi cập nhật lên phiên bản mới, điều này sẽ ghi đè thay đổi của bạn và làm rối bố cục. Ai sẽ nhớ trong một năm hoặc lâu hơn mà bạn thực hiện một điều chỉnh nhỏ đó? Tôi luôn cố gắng tìm giải pháp khác ngoài sửa đổi mã nguồn plugin
Zefiryn

1

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

Vân vân...

Chỉ cần để trống param thứ 2!


1
Nếu các bạn bỏ phiếu một cái gì đó, xin vui lòng để lại nhận xét.
Anh Nrik

1
Tôi đoán bạn đã nhận được các downvote vì bạn không trả lời câu hỏi được hỏi : "jQuery plugin is applying an inline style (display:block). I'm feeling lazy and want to override it with display:none". Mặc dù văn bản của bạn là chính xác, mã của bạn không giải quyết được câu hỏi.
Mã hóa

Giải quyết vấn đề tôi có. Tnx.
yodalr

0

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

Lúc đầu, tôi đã cố gắng loại bỏ kiểu nội tuyến trong css, nhưng nó không hoạt động và kiểu mới như hiển thị: không cái nào sẽ bị ghi đè. Nhưng trong JQuery, nó hoạt động như thế này.


0

Tôi đã có vấn đề tương tự với tài sản chiều rộng. Tôi không thể xóa! Quan trọng khỏi mã và vì nó cần kiểu này trên một mẫu mới, tôi đã thêm Id (modalstomme) vào phần tử và sau đó tôi đã thêm mã sau vào mẫu:

<script type="text/javascript">
    $('#modalstyling').css('width', '');    //Removal of width !important
    $('#modalstyling').width('75%');        //Set custom width
</script>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.