วิธีการสมัคร! สำคัญโดยใช้. css ()


735

!importantฉันกำลังมีปัญหาในการใช้สไตล์ที่เป็น ฉันได้พยายาม:

$("#elem").css("width", "100px !important");

นี้จะไม่มีอะไร ; ไม่ใช้ลักษณะความกว้างใด ๆ มีวิธี jQuery-ish ของการใช้สไตล์ดังกล่าวโดยไม่ต้องเขียนทับcssText(ซึ่งหมายความว่าฉันต้องแยกมันก่อน)

แก้ไข : ฉันควรเพิ่มว่าฉันมีสไตล์ชีทที่มี!importantสไตล์ที่ฉันพยายามจะแทนที่ด้วย!importantอินไลน์สไตล์ดังนั้นการใช้.width()และสิ่งที่คล้ายกันใช้ไม่ได้เพราะมันถูกแทนที่ด้วย!importantสไตล์ภายนอกของฉัน

นอกจากนี้ค่าที่จะแทนที่ค่าก่อนหน้านี้ถูกคำนวณดังนั้นฉันจึงไม่สามารถสร้างสไตล์ภายนอกอื่นได้


น่าสังเกตว่ามันใช้งานได้จริงใน Chrome (สำหรับฉันอย่างน้อย) แต่ไม่ใช่ใน Firefox
Peter Jaric

สิ่งนี้ใช้ได้กับฉันใน Chrome 17.x และ Safari 5.1.1 แต่ไม่ได้อยู่ใน FF 8.0
DavidJ

ใช้งานไม่ได้กับ Chromium 20.0.x โดยใช้ JQuery 1.8.2
Alba Mendez

7
jQuery bug # 11173เกี่ยวกับการแก้ไข.cssและ!importantใน jQuery core ข้อผิดพลาดถูกปิดเนื่องจาก“ ไม่แก้ไข” อย่างไรก็ตามกรณีทดสอบของข้อผิดพลาดนั้นไม่ได้ จำกัด อย่างที่เป็นหนึ่งในคำถามนี้ - กรณีทดสอบไม่มี!importantรูปแบบอินไลน์ที่มันพยายามจะแทนที่ ดังนั้นวิธีแก้ปัญหาที่เสนอในข้อผิดพลาดนั้นจะไม่ทำงานในกรณีนี้
Rory O'Kane

2
ซ้ำกันได้ของการเอาชนะ! สำคัญกับ css หรือ jquery - ในขณะที่อันนี้เก่ากว่าและได้รับการโหวตสูงกว่าอีกคนหนึ่งได้คำตอบที่ชัดเจนและมีค่ามากที่สุด
Jason C

คำตอบ:


603

ปัญหาเกิดจาก jQuery ไม่เข้าใจ!importantคุณลักษณะและเป็นเช่นนั้นล้มเหลวในการใช้กฎ

คุณอาจสามารถแก้ไขปัญหานั้นและใช้กฎโดยอ้างอิงกับทางaddClass():

.importantRule { width: 100px !important; }

$('#elem').addClass('importantRule');

หรือโดยการใช้attr():

$('#elem').attr('style', 'width: 100px !important');

แม้ว่าวิธีการหลังจะยกเลิกการตั้งค่ากฎสไตล์ในบรรทัดก่อนหน้านี้ ดังนั้นควรใช้ด้วยความระมัดระวัง

แน่นอนมีข้อโต้แย้งที่ดีว่าวิธีการของ @Nick Craver นั้นง่ายกว่า / ฉลาดกว่า

วิธีการข้างต้นได้รับattr()การแก้ไขเล็กน้อยเพื่อรักษาstyleสตริง / คุณสมบัติดั้งเดิมและแก้ไขตามคำแนะนำของfalkoในความคิดเห็น:

$('#elem').attr('style', function(i,s) { return (s || '') + 'width: 100px !important;' });

2
ฉันเอนไปทางหลังของคุณ แต่สิ่งที่น่าเศร้าเกี่ยวกับเรื่องนี้ก็คือมันอาจจะจบลงด้วยการแยก cssText ก่อนหน้านี้เพราะฉันไม่สามารถทิ้งมันได้
mkoryak

1
อาขอโทษไม่สามารถรับมันบางครั้งภาษาอังกฤษอารมณ์ขันนอกเหนือไปจากความเข้าใจของฉัน ... :)
Sinan

1
คำพูดซ้อน ('"ความกว้าง: 100px! สำคัญ"') คืออะไร นั่นไม่ได้ผลสำหรับฉัน แต่เมื่อฉันลบเครื่องหมายคำพูดภายในออกมันก็ใช้ได้ ขอบคุณ!
Peter Jaric

15
แก้ไขเล็กน้อยเมื่อสไตล์ว่างเปล่า: $ ('# elem'). attr ('style', ฟังก์ชั่น (i, s) {return (s || '') + 'ความกว้าง: 100px! important;'});
falko

4
คุณควรเพิ่มการแก้ไข @ falko เช่นเดียวกับใน firefox ข้อมูลสุดท้ายของคุณจะกำหนดสไตล์เป็น'undefinedwidth: 100px !important;'เมื่อรูปแบบปัจจุบันว่างเปล่า
acdcjunior

332

ฉันคิดว่าฉันพบทางออกที่แท้จริงแล้ว ฉันได้ทำให้มันเป็นฟังก์ชั่นใหม่:

jQuery.style(name, value, priority);

คุณสามารถใช้เพื่อรับค่า.style('name')เช่น.css('name')รับ CSSStyleDeclaration ด้วย.style()และตั้งค่า - ด้วยความสามารถในการระบุลำดับความสำคัญเป็น 'สำคัญ' ดูนี่สิ

การสาธิต

var div = $('someDiv');
console.log(div.style('color'));
div.style('color', 'red');
console.log(div.style('color'));
div.style('color', 'blue', 'important');
console.log(div.style('color'));
console.log(div.style().getPropertyPriority('color'));

นี่คือผลลัพธ์:

null
red
blue
important

ฟังก์ชั่น

(function($) {    
  if ($.fn.style) {
    return;
  }

  // Escape regex chars with \
  var escape = function(text) {
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  };

  // For those who need them (< IE 9), add support for CSS functions
  var isStyleFuncSupported = !!CSSStyleDeclaration.prototype.getPropertyValue;
  if (!isStyleFuncSupported) {
    CSSStyleDeclaration.prototype.getPropertyValue = function(a) {
      return this.getAttribute(a);
    };
    CSSStyleDeclaration.prototype.setProperty = function(styleName, value, priority) {
      this.setAttribute(styleName, value);
      var priority = typeof priority != 'undefined' ? priority : '';
      if (priority != '') {
        // Add priority manually
        var rule = new RegExp(escape(styleName) + '\\s*:\\s*' + escape(value) +
            '(\\s*;)?', 'gmi');
        this.cssText =
            this.cssText.replace(rule, styleName + ': ' + value + ' !' + priority + ';');
      }
    };
    CSSStyleDeclaration.prototype.removeProperty = function(a) {
      return this.removeAttribute(a);
    };
    CSSStyleDeclaration.prototype.getPropertyPriority = function(styleName) {
      var rule = new RegExp(escape(styleName) + '\\s*:\\s*[^\\s]*\\s*!important(\\s*;)?',
          'gmi');
      return rule.test(this.cssText) ? 'important' : '';
    }
  }

  // The style function
  $.fn.style = function(styleName, value, priority) {
    // DOM node
    var node = this.get(0);
    // Ensure we have a DOM node
    if (typeof node == 'undefined') {
      return this;
    }
    // CSSStyleDeclaration
    var style = this.get(0).style;
    // Getter/Setter
    if (typeof styleName != 'undefined') {
      if (typeof value != 'undefined') {
        // Set style property
        priority = typeof priority != 'undefined' ? priority : '';
        style.setProperty(styleName, value, priority);
        return this;
      } else {
        // Get style property
        return style.getPropertyValue(styleName);
      }
    } else {
      // Get CSSStyleDeclaration
      return style;
    }
  };
})(jQuery);

ดูสิ่งนี้สำหรับตัวอย่างวิธีการอ่านและตั้งค่า CSS ปัญหาของฉันคือฉันได้ตั้งค่า!importantความกว้างใน CSS ไว้แล้วเพื่อหลีกเลี่ยงความขัดแย้งกับ CSS ธีมอื่น ๆ แต่การเปลี่ยนแปลงใด ๆ ที่ฉันทำกับความกว้างใน jQuery จะไม่ได้รับผลกระทบเนื่องจากจะเพิ่มแอตทริบิวต์สไตล์

ความเข้ากันได้

สำหรับการตั้งค่าด้วยลำดับความสำคัญโดยใช้setPropertyฟังก์ชั่นบทความนี้กล่าวว่ามีการรองรับ IE 9+ และเบราว์เซอร์อื่น ๆ ทั้งหมด ฉันได้ลองกับ IE 8 แล้วและมันล้มเหลวซึ่งเป็นสาเหตุที่ฉันสร้างการรองรับในฟังก์ชั่นของฉัน (ดูด้านบน) มันจะทำงานกับเบราว์เซอร์อื่น ๆ ทั้งหมดโดยใช้ setProperty แต่จะต้องใช้รหัสที่กำหนดเองของฉันเพื่อทำงานใน <IE 9


คุณเคยทดสอบสิ่งนี้กับเบราว์เซอร์อื่นหรือไม่?
mkoryak

2
นอกจากนี้ยังมีปลั๊กอิน jQuery.importantที่เผยแพร่เมื่อสองปีก่อน ฉันใช้มันในการผลิตกับปัญหาเล็ก ๆ น้อย ๆ เพียงหนึ่งเดียว (ดูแท็บปัญหาของพวกเขา
colllin

14
$ ('.someclass') .each (ฟังก์ชั่น () {this.style.setProperty ('เส้นขอบ', 'ไม่มี', 'สำคัญ');}); stackoverflow.com/questions/11962962/… เรียบง่ายสะอาดตาและมีประสิทธิภาพยิ่งขึ้น

3
วิธีที่ดีในการจัดการกับสิ่งนี้คือการใช้คลาสไม่ใช่การฉีดสไตล์โดยตรง
Richard

3
@Richard วิธีที่ดีในการจัดการกับสิ่งนี้คือไม่ควรใช้!importantในสไตล์ของคุณอย่างน้อยก็สำหรับสิ่งที่คุณจะเปลี่ยนด้วย jQuery ... ตราบใดที่มันเป็นสไตล์ของคุณ หากโค้ดของคุณทำงานในหน้าเว็บที่นักเรียนคนหนึ่งเขียนขึ้นโดยไม่สนใจกฎเฉพาะเจาะจงโดยการตบ!importantสไตล์ที่สองทุกครั้งคุณจะต้องหัวรามเข้าไปก่อน!importantsไม่ช้าก็เร็ว
ก.ย. แผนภาพ

149

คุณสามารถตั้งค่าความกว้างได้โดยตรงโดยใช้.width()สิ่งนี้:

$("#elem").width(100);

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

$('#elem').css('cssText', 'width: 100px !important');

ตกลงฉันใช้เป็นตัวอย่างสิ่งที่ฉันสนใจคือการตั้งค่า! สำคัญ
mkoryak

1
ฉันยังแก้ไขคำถามเพื่อสะท้อนให้เห็นถึงสถานการณ์ของฉันดีขึ้น .. โดยทั่วไปฉันมีภายนอก! ความกว้างที่สำคัญที่กำหนดเป็นสิ่งที่ไม่ดีที่ฉันต้องแทนที่แบบอินไลน์ width () ใช้งานไม่ได้ด้วยเหตุนี้
mkoryak

@mkoryak - อัปเดตด้วยตัวเลือกอื่นที่ไม่ใช่ชั้นเรียนเท่านั้นไม่แน่ใจว่าจะเหมาะกับสถานการณ์ของคุณหรือไม่
Nick Craver

1
แต่จะแทนที่สไตล์อื่น ๆ ที่ใช้กับองค์ประกอบโดยตรง stackoverflow.com/a/11723492/491044เป็นวิธีที่ง่ายที่สุดในการติดตั้ง
trgraglia

10
ป้องกันการแทนที่ด้วยการเชื่อมต่อ$('#elem').css('cssText', $('#elem').css('cssText')+'width: 100px !important');กับค่าก่อนหน้า
Abel Callejo

81
const elem = $("#elem");
elem[0].style.removeAttribute('width');
elem[0].style.setProperty('width', '100px', 'important');

หมายเหตุ: การใช้ Chrome อาจส่งคืนข้อผิดพลาดเช่น:

elem [0] .style.removeAttribute ไม่ใช่ฟังก์ชัน

การเปลี่ยนบรรทัดเพื่อใช้.removePropertyฟังก์ชั่นเช่นเพื่อelem[0].style.removeProperty('width');แก้ไขปัญหา


10
นี่คือหนึ่งในคำตอบที่ดีที่สุด ง่ายและใช้งานได้ และไม่ต้องการคำอธิบายมากนัก เป็นเพียง JavaScript ปกติยกเว้นตัวเลือก jQuery jQuery ไม่ได้ให้การสนับสนุน "สำคัญ" ดังนั้นการใช้ JS ปกติเป็นหนทางไป
OMA

2
หากคุณต้องการไปกับวานิลลาเพียงทำvar = document.getElementById('elem');และทำวิธีการในสไตล์ของ elem (ตรงข้ามกับ elem [0]) ไชโย
humbolight

3
ใน vanilla JS, removeAttribute ไม่ทำงาน ทำดังต่อไปนี้ var style = document.getElementById('elem'); style.removeProperty('width'); style.setProperty('width, '100px', 'important')
mcoenca

2
.removeAttributeนอกจากนี้ยังมีปัญหากับ มันน่าจะเป็นวิธี IE เท่านั้น @mcoenca ความคิดเห็นถูกต้อง; .removePropertyทำงานได้ดี มันคือ IE9 + ตามMSDN
FelipeAls

2
@Dejan ขอโทษสำหรับคำตอบที่ดึกมาก แต่ควรทำงาน:elem.next().get(0).style...
RedClover

54

คำตอบของ David Thomasอธิบายถึงวิธีการใช้งาน$('#elem').attr('style', …)แต่เตือนว่าการใช้มันจะลบสไตล์ที่กำหนดไว้ก่อนหน้านี้ในstyleแอตทริบิวต์ นี่คือวิธีการใช้attr()โดยไม่มีปัญหา:

var $elem = $('#elem');
$elem.attr('style', $elem.attr('style') + '; ' + 'width: 100px !important');

ในฐานะที่เป็นฟังก์ชั่น:

function addStyleAttribute($element, styleAttribute) {
    $element.attr('style', $element.attr('style') + '; ' + styleAttribute);
}
addStyleAttribute($('#elem'), 'width: 100px !important');

นี่คือการสาธิต JS Bin


2
addStyleAttribute()อาจจะมีการปรับเปลี่ยนเพื่อใช้พารามิเตอร์เดียวกับjQuery เป็น .css()ตัวอย่างเช่นมันสามารถรองรับการแม็พคุณสมบัติ CSS กับค่าของมัน หากคุณไม่ว่าคุณโดยทั่วไปจะเป็นเรื่องการดำเนินการ.css()กับ!importantข้อผิดพลาดคง แต่ไม่มีการเพิ่มประสิทธิภาพใด ๆ
Rory O'Kane

1
สิ่งนี้ทำงานได้ดีสำหรับฉันเนื่องจากความกว้างถูกกำหนดในคลาส CSS และฉันต้องการแทนที่มันแบบไดนามิกด้วยค่าที่คำนวณได้ตามความกว้างของหน้าต่างเบราว์เซอร์และเนื้อหา
Chris Rasco

30

หลังจากอ่านคำตอบและทดลองอื่น ๆ แล้วนี่คือสิ่งที่เหมาะกับฉัน:

$(".selector")[0].style.setProperty( 'style', 'value', 'important' );

ไม่สามารถใช้งานได้ใน IE 8 และรุ่นที่ต่ำกว่า


1
และเนื่องจากเรายังต้องรองรับ IE8 (พวกเราบางคนโชคร้าย) - มันไม่ดี
mkoryak

27

คุณสามารถทำได้:

$("#elem").css("cssText", "width: 100px !important;");

การใช้ "cssText" เป็นชื่อคุณสมบัติและสิ่งที่คุณต้องการเพิ่มลงใน CSS เป็นค่าของมัน


5
ข้อเสียของสิ่งนี้คือมันจะเขียนทับสิ่งที่cssTextอยู่ในนั้นมาก่อนดังนั้นคุณไม่สามารถใช้มันได้อย่างอิสระจริงๆ
mkoryak

1
อย่างไรก็ตามคุณสามารถใช้ $ ("# elem") css ("cssText", "+ =; width: 100px! important;");
lexa-b

18

คุณสามารถทำสิ่งนี้ได้สองวิธี:

$("#elem").prop("style", "width: 100px !important"); // this is not supported in chrome
$("#elem").attr("style", "width: 100px !important");

ที่จริงแล้วมี.prop()การเพิ่มฟังก์ชั่นใน jQuery v1.6 และจะทำงานใน Chrome ... นี่คือคำพูดที่มาจากหน้า prop: ก่อน jQuery 1.6 .attr()บางครั้งวิธีการที่นำค่าคุณสมบัติเข้าบัญชีเมื่อดึงคุณสมบัติบางอย่างซึ่งอาจก่อให้เกิดพฤติกรรมที่ไม่สอดคล้องกัน ในฐานะของ jQuery 1.6 .prop()วิธีการมีวิธีการดึงค่าคุณสมบัติอย่างชัดเจนในขณะที่.attr()ดึงคุณสมบัติ
Mottie

1
ไม่ใช่ความคิดที่ดีสำหรับโซลูชันทั่วไป คุณอาจจะแทนที่สไตล์ที่มีอยู่โดยใช้สิ่งนี้
Nirav Zaveri

14

ไม่จำเป็นต้องไปที่ความซับซ้อนของคำตอบ @ AramKocharyan และไม่จำเป็นต้องใส่แท็กสไตล์ใด ๆ แบบไดนามิก

เพียงเขียนทับสไตล์แต่คุณไม่ต้องแยกวิเคราะห์อะไรทำไมคุณถึงทำแบบนี้?

// Accepts the hyphenated versions (i.e. not 'cssFloat')
function addStyle(element, property, value, important) {
    // Remove previously defined property
    if (element.style.setProperty)
        element.style.setProperty(property, '');
    else
        element.style.setAttribute(property, '');

    // Insert the new style with all the old rules
    element.setAttribute('style', element.style.cssText +
        property + ':' + value + ((important) ? ' !important' : '') + ';');
}

ใช้ไม่ได้removeProperty()เพราะไม่ได้ลบ!importantกฎใน Chrome
ใช้ไม่ได้element.style[property] = ''เพราะยอมรับเฉพาะ camelCase ใน Firefox

คุณอาจทำให้ jQuery สั้นลง แต่ฟังก์ชันวานิลลานี้จะทำงานบนเบราว์เซอร์รุ่นใหม่ Internet Explorer 8 และอื่น ๆ


12

นี่คือสิ่งที่ฉันทำหลังจากพบปัญหานี้ ...

var origStyleContent = jQuery('#logo-example').attr('style');
jQuery('#logo-example').attr('style', origStyleContent + ';width:150px !important');

ขอขอบคุณการดำเนินการนี้ง่ายกว่าปลั๊กอินที่กำหนดเอง (แม้ว่าอาจทำลายรูปแบบอินไลน์อื่น ๆ )
Phrogz

9

โซลูชันนี้ไม่ได้แทนที่สไตล์ก่อนหน้าใด ๆ แต่ใช้กับสิ่งที่คุณต้องการ:

var heightStyle = "height: 500px !important";
if ($("foo").attr('style')) {
  $("foo").attr('style', heightStyle + $("foo").attr('style').replace(/^height: [-,!,0-9,a-z, A-Z, ]*;/,''));
else {
  $("foo").attr('style', heightStyle);
}

9

ถ้ามันไม่เกี่ยวข้องกันและเนื่องจากคุณกำลังจัดการกับองค์ประกอบหนึ่งซึ่งก็คือ#elemคุณสามารถเปลี่ยนรหัสของมันเป็นอย่างอื่นและจัดรูปแบบตามที่คุณต้องการ ...

$('#elem').attr('id', 'cheaterId');

และใน CSS ของคุณ:

#cheaterId { width: 100px;}

9
ทำไมคุณถึงเปลี่ยน id เพื่อใช้ css แทนการเพิ่ม css class
TeKapa

8

แทนที่จะใช้css()ฟังก์ชันลองใช้addClass()ฟังก์ชัน:

  <script>
  $(document).ready(function() {
    $("#example").addClass("exampleClass");
  });
  </script>

  <style>
  .exampleClass{
    width:100% !important;
    height:100% !important;
  }
  </style>

OP เขียนว่าค่าของคุณสมบัตินั้นคำนวณแบบไดนามิกดังนั้นคำตอบของคุณจะไม่ทำงานสำหรับเขา
Sebastian Zartner

วิธีนี้ใช้ได้ผลสำหรับฉัน ฉันไม่คิดว่าฉันมีความต้องการที่แน่นอนเหมือนโปสเตอร์ต้นฉบับ แต่ใช้งานได้ซึ่ง css () ไม่ได้
leekei

2
นี่เป็นวิธีแก้ปัญหาที่สมเหตุสมผลอย่างสมบูรณ์แบบ ... ไม่ใช่ปัญหานี้ !
mkoryak

8

ทางออกที่ง่ายและดีที่สุดสำหรับปัญหานี้จากฉันคือการใช้ addClass () แทน. css () หรือ .attr ()

ตัวอย่างเช่น:

$('#elem').addClass('importantClass');

และในไฟล์ CSS ของคุณ:

.importantClass {
    width: 100px !important;
}

1
เนื่องจากความกว้างถูกคำนวณใน JavaScript จึงไม่สามารถแก้ปัญหาได้
คริส


7

คำตอบส่วนใหญ่เหล่านี้ล้าสมัยไปแล้วการสนับสนุน IE7 ไม่ใช่ปัญหา

วิธีที่ดีที่สุดในการทำเช่นนี้ที่รองรับ IE11 + และเบราว์เซอร์สมัยใหม่ทั้งหมดคือ:

const $elem = $("#elem");
$elem[0].style.setProperty('width', '100px', 'important');

หรือถ้าคุณต้องการคุณสามารถสร้างปลั๊กอิน jQuery ขนาดเล็กที่ทำสิ่งนี้ ปลั๊กอินนี้ตรงกับcss()วิธีของ jQuery ในพารามิเตอร์ที่สนับสนุนอย่างใกล้ชิด:

/**
 * Sets a CSS style on the selected element(s) with !important priority.
 * This supports camelCased CSS style property names and calling with an object 
 * like the jQuery `css()` method. 
 * Unlike jQuery's css() this does NOT work as a getter.
 * 
 * @param {string|Object<string, string>} name
 * @param {string|undefined} value
 */   
jQuery.fn.cssImportant = function(name, value) {
  const $this = this;
  const applyStyles = (n, v) => {
    // Convert style name from camelCase to dashed-case.
    const dashedName = n.replace(/(.)([A-Z])(.)/g, (str, m1, upper, m2) => {
      return m1 + "-" + upper.toLowerCase() + m2;
    }); 
    // Loop over each element in the selector and set the styles.
    $this.each(function(){
      this.style.setProperty(dashedName, v, 'important');
    });
  };
  // If called with the first parameter that is an object,
  // Loop over the entries in the object and apply those styles. 
  if(jQuery.isPlainObject(name)){
    for(const [n, v] of Object.entries(name)){
       applyStyles(n, v);
    }
  } else {
    // Otherwise called with style name and value.
    applyStyles(name, value);
  }
  // This is required for making jQuery plugin calls chainable.
  return $this;
};
// Call the new plugin:
$('#elem').cssImportant('height', '100px');

// Call with an object and camelCased style names:
$('#another').cssImportant({backgroundColor: 'salmon', display: 'block'});

// Call on multiple items:
$('.item, #foo, #bar').cssImportant('color', 'red');

ตัวอย่าง jsfiddle ที่นี่


1
นี่คือคำตอบ ไม่จำเป็นต้องตรวจสอบคำตอบอื่น ๆ
Shwet

6

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

var SetCssColorImportant = function (jDom, color) {
       var style = jDom.attr('style');
       style = style.replace(/color: .* !important;/g, '');
       jDom.css('cssText', 'color: ' + color + ' !important;' + style); }

3
ไม่ทราบว่าเพราะเหตุใดโซลูชันจำนวนมากจึงแฮ็กแท็กสไตล์ลงบนองค์ประกอบเมื่อวิธี cssText ทำงานได้ดี ... เช่น$selector.css('cssText','margin-bottom: 0 !important')
frumbert

6

อีกทางเลือกหนึ่งในการต่อท้ายสไตล์:

$('head').append('<style> #elm{width:150px !important} </style>');

ลักษณะนี้จะผนวกท้ายไฟล์ CSS ทั้งหมดของคุณเพื่อให้มีลำดับความสำคัญสูงกว่าไฟล์ CSS อื่นและจะนำไปใช้


6

อาจจะเป็นแบบนี้:

ขุมทรัพย์

var node = $ ('. selector') [0];
หรือ
var node = document.querySelector ('. selector');

ตั้ง CSS

node.style.setProperty ('width', '100px', 'สำคัญ');

ลบ CSS

node.style.removeProperty ( 'กว้าง');
หรือ
node.style.width = '';

6

ฉันคิดว่ามันใช้งานได้และสามารถเขียนทับ CSS อื่น ๆ ก่อนหน้านี้ได้ (สิ่งนี้: องค์ประกอบ DOM):

this.setAttribute('style', 'padding:2px !important');


5

โซลูชันนี้จะปล่อยให้จาวาสคริปต์ที่คำนวณแล้วทั้งหมดและเพิ่มแท็กที่สำคัญลงในองค์ประกอบ: คุณสามารถทำได้ (เช่นถ้าคุณต้องการตั้งค่าความกว้างด้วยแท็กที่สำคัญ)

$('exampleDiv').css('width', '');
//This will remove the width of the item
var styles = $('exampleDiv').attr('style');
//This will contain all styles in your item
//ex: height:auto; display:block;
styles += 'width: 200px !important;'
//This will add the width to the previous styles
//ex: height:auto; display:block; width: 200px !important;
$('exampleDiv').attr('style', styles);
//This will add all previous styles to your item

4

ตัวอย่างการทำงานสามอย่าง

ฉันมีสถานการณ์ที่คล้ายกัน แต่ฉันใช้. find () หลังจากดิ้นรนกับ. closest () เป็นเวลานานด้วยการเปลี่ยนแปลงมากมาย

รหัสตัวอย่าง

// Allows contain functions to work, ignores case sensitivity

jQuery.expr[':'].contains = function(obj, index, meta, stack) {
    result = false;
    theList = meta[3].split("','");
    var contents = (obj.textContent || obj.innerText || jQuery(obj).text() || '')
    for (x=0; x<theList.length; x++) {
        if (contents.toLowerCase().indexOf(theList[x].toLowerCase()) >= 0) {
            return true;
        }
    }
    return false;
};

$(document).ready(function() {
    var refreshId = setInterval( function() {
        $("#out:contains('foo', 'test456')").find(".inner").css('width', '50px', 'important');
    }, 1000); // Rescans every 1000 ms
});

ทางเลือก

$('.inner').each(function () {
    this.style.setProperty('height', '50px', 'important');
});

$('#out').find('.inner').css({ 'height': '50px'});

ทำงาน: http://jsfiddle.net/fx4mbp6c/


ฉันจะให้คุณลงคะแนน แต่คุณควรเลือกที่จะแทนที่.indexOf()ฟังก์ชั่นด้วยบางสิ่งที่เข้ากันได้กับเบราว์เซอร์มากกว่า ใช้แทน.match()หรือ.test()แทน.indexOf()
Alexander Dixon

ทำไมไม่มีเครื่องหมายอัฒภาคในvar contents = ?
Peter Mortensen

3

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

ตัวอย่างเช่นถ้าคุณต้องการอินสแตนซ์ที่ 3 และ 6 ของ. cssText ให้มีความกว้างแตกต่างกันคุณสามารถเขียน:

.cssText:nth-of-type(3), .cssText:nth-of-type(6) {width:100px !important;}

หรือ:

.container:nth-of-type(3).cssText, .container:nth-of-type(6).cssText {width:100px !important;}

นี้ไม่ได้ตรงกับที่ 3 และ 6 .cssTextกรณีของ :nth-of-type()ไม่ได้ทำในสิ่งที่คุณคิด ดูที่นี่สำหรับคำอธิบาย
BoltClock

ยุติธรรมพอสมควร ฉันอ่านลิงค์แล้ว แต่ฉันไม่แน่ใจว่าฉันเข้าใจประเด็นของคุณแล้ว นี่คือซอแสดงการทำงานนี้ตามที่ตั้งใจไว้: jsfiddle.net/d2E4b
ทิมคัตติ้ง

2
ในซอของคุณคุณกำลังเผชิญกับชุดของliองค์ประกอบ มันเป็นประเภทองค์ประกอบเดียวกันทั้งหมดliซึ่งเป็นสิ่งที่ผู้เลือกเกี่ยวข้องกับ ถ้าคุณจะผสมองค์ประกอบต่าง ๆ ในพาเรนต์เดียวกันก็:nth-of-type()จะทำงานแตกต่างกันโดยเฉพาะอย่างยิ่งเมื่อคุณเพิ่มตัวเลือกคลาสลงในมิกซ์
BoltClock

3

ฉันจะถือว่าคุณพยายามมันโดยไม่ต้องเพิ่ม!important?

Inline CSS (ซึ่งเป็นวิธีที่ JavaScript เพิ่มการใส่สไตล์) แทนที่ CSS สไตล์ชีท ผมค่อนข้างมั่นใจว่าเป็นกรณีที่แม้ในขณะที่กฎสไตล์ชีต CSS !importantมี

คำถามอื่น (อาจเป็นคำถามที่โง่ แต่ต้องถาม): องค์ประกอบที่คุณพยายามจะทำงานdisplay:block;หรือdisplay:inline-block;ไม่?

การไม่ทราบความเชี่ยวชาญของคุณใน CSS ... องค์ประกอบอินไลน์อาจไม่ทำงานตามที่คุณคาดหวัง


4
กฎ css ที่มี! แทนที่สิ่งสำคัญทุกอย่างไม่ว่าพวกเขาจะอยู่ที่ใดยกเว้นเพียงว่ารูปแบบอินไลน์ด้วย! นี่คือปัญหาที่ฉันมี มีกฎสไตล์ชีทด้วย! สำคัญที่ฉันต้องการจะแทนที่ ยิ่งไปกว่านั้นค่าที่ฉันต้องจัดหาต้องคำนวณผ่าน JS ดังนั้นฉันจึงไม่สามารถเปลี่ยนสไตล์ชีทเองได้
mkoryak

3

เราสามารถใช้ setProperty หรือ cssText เพื่อเพิ่ม!importantองค์ประกอบ DOM โดยใช้ JavaScript

ตัวอย่างที่ 1:

elem.style.setProperty ("color", "green", "important");

ตัวอย่างที่ 2:

elem.style.cssText='color: red !important;'

2

ฉันยังค้นพบว่าองค์ประกอบบางอย่างหรือส่วนเสริม (เช่น Bootstrap) มีบางกรณีพิเศษที่พวกเขาเล่นได้ไม่ดี!importantหรืออื่น ๆ ที่ชอบ.addClass/.removeClassและคุณต้องสลับเปิด / ปิด

ตัวอย่างเช่นหากคุณใช้บางอย่างเช่น<table class="table-hover">วิธีเดียวที่จะประสบความสำเร็จในการแก้ไของค์ประกอบเช่นสีของแถวคือการสลับเปิดtable-hover/ ปิดคลาสเช่นนี้

$(your_element).closest("table").toggleClass("table-hover");

หวังว่าการแก้ไขปัญหานี้จะเป็นประโยชน์กับใครบางคน! :)


2

ฉันมีปัญหาเดียวกันกับการพยายามเปลี่ยนสีข้อความของรายการเมนูเมื่อ "เหตุการณ์" วิธีที่ดีที่สุดที่ฉันพบเมื่อฉันมีปัญหาเดียวกันคือ:

ขั้นตอนแรก: สร้างใน CSS ของคุณคลาสใหม่ด้วยจุดประสงค์นี้ตัวอย่างเช่น:

.colorw{ color: white !important;}

ขั้นตอนสุดท้าย: ใช้คลาสนี้โดยใช้เมธอด addClass ดังต่อไปนี้:

$('.menu-item>a').addClass('colorw');

แก้ไขปัญหา.


1
คำตอบที่ดีที่สุดในความคิดของฉัน สะดวกที่สุดแห่งหนึ่ง
Siyah

ขอบคุณ @Siyah CSS เป็นที่รู้จักกันโดยโหลดของ ppl แต่เข้าใจเพียงไม่กี่และนี้เป็นเรื่องที่น่าเศร้าและทำให้โปรแกรมเมอร์บางคนเกลียดมันเลย
JoelBonetR

ไม่ใช่ถ้าคุณต้องการสร้างค่า CSS ด้วย js ลองใช้ค่าสีที่กำหนดใน JS มิฉะนั้นจะดี
Carl Papworth

ทำไมคุณต้องการที่จะกำหนดสีใน js?
JoelBonetR

2

วิธีหลีกเลี่ยงปัญหาที่ปลอดภัยที่สุดคือการเพิ่มคลาสจากนั้นทำเวทย์มนตร์ใน CSS :-) addClass()และremoveClass()ควรทำผลงาน


1

https://jsfiddle.net/xk6Ut/256/

อีกวิธีหนึ่งคือการสร้างและอัปเดตคลาส CSS ใน JavaScript แบบไดนามิก ในการทำเช่นนั้นเราสามารถใช้อิลิเมนต์สไตล์และต้องใช้ ID สำหรับอิลิเมนต์สไตล์เพื่อให้เราสามารถอัปเดตคลาส CSS

function writeStyles(styleName, cssText) {
    var styleElement = document.getElementById(styleName);
    if (styleElement) document.getElementsByTagName('head')[0].removeChild(
        styleElement);
    styleElement = document.createElement('style');
    styleElement.type = 'text/css';
    styleElement.id = styleName;
    styleElement.innerHTML = cssText;
    document.getElementsByTagName('head')[0].appendChild(styleElement);
}

...

  var cssText = '.testDIV{ height:' + height + 'px !important; }';
  writeStyles('styles_js', cssText)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.