【问题标题】:disabled = true can be set dynamically on <style>. Why not statically?disabled = true 可以在 <style> 上动态设置。为什么不是静态的?
【发布时间】:2026-02-08 12:05:02
【问题描述】:

要禁用&lt;style&gt; 块,所有浏览器都允许设置document.styleSheets[x].disabled = true。但是,只有 IE 允许在标签本身上设置此属性,&lt;style disabled="true"&gt;。在其他浏览器中是否有解决方法?动态完成的事情也不能静态完成,这似乎很奇怪。

【问题讨论】:

  • 它认为true 可能是disabled 属性的无效值。试试disabled="disabled"
  • 在样式标签上添加onload事件:onload="this.disabled=true"

标签: javascript html css stylesheet


【解决方案1】:

style 元素没有名为disabled 的有效属性。来自the HTML spec

<!ELEMENT STYLE - - %StyleSheet        -- style info -->
<!ATTLIST STYLE
  %i18n;                               -- lang, dir, for use with title --
  type        %ContentType;  #REQUIRED -- content type of style language --
  media       %MediaDesc;    #IMPLIED  -- designed for use with these media --
  title       %Text;         #IMPLIED  -- advisory title --
  >

但是,HTMLStyleElement DOM 接口确实有这样的属性。来自the DOM spec

interface HTMLStyleElement : HTMLElement {
           attribute boolean         disabled;
           attribute DOMString       media;
           attribute DOMString       type;
};

不要将 HTML 元素与 DOM 中的对应元素混淆。 “动态完成的事情不能静态完成并不奇怪。” HTML 和 DOM 规范的创建是为了解决不同的问题。 HTML 是一种标记语言。 DOM 是用于表示文档中的对象并与之交互的约定。

【讨论】:

  • 所以没有解决方法? IE 做的是合理的事情,而其他人都盲目地遵循标准。
  • @Lucent - 我不同意你的描述。 IE 不必要地偏离了标准,而其他所有人都在做合理的事情(即遵循没有明显和令人信服的理由不这样做的标准)。 DOM 和 HTML 是不同的东西。你不应该把他们各自的标准混为一谈。 不是“奇怪的是动态完成的事情也不能静态完成”,因为这些是具有不同目的的不同标准。
  • @Lucent - 不是真的。它主要以相反的方式工作,因为该标准记录了浏览器已经做了什么,或者他们表示愿意做什么。他们愿意做的是他们认为用户有需求的事情——是用户提供了他们的收入来源。反过来,这取决于用户能够使用网络作者创建的网页,在这种情况下,用户或作者根本没有足够的需求来拥有此功能,而不是他们可能实施的其他事情。
  • 我认为结构的模型应该反映它的建模内容。并非所有事情都像我猜的那样对每个人都是合乎逻辑的。
【解决方案2】:

扩展@lampyridae 的media 答案,您可以使用not 否定媒体选择器。要静态禁用样式标记,我使用 media="not all",它适用于 Chrome 79。

【讨论】:

  • 非常优雅的解决方案。
【解决方案3】:

media 属性既可以在 HTML 中设置,也可以通过 Javascript 设置。想法是设置media 属性,以便样式标签不适用于任何设备以禁用它。

我认为将其设置为像media="bogus"media="none" 这样的无效值是有风险的,因为浏览器可能会决定简单地忽略谓词并将样式应用于所有媒体类型。幸运的是,设置一个像素的最大屏幕宽度是非常有效的,在我的书中这与禁用样式标签几乎相同。

 var style = document.querySelector("#my-style");

 document.querySelector("#btn-style").addEventListener("click",function() {
    style.removeAttribute("media");
 });

 document.querySelector("#btn-unstyle").addEventListener("click",function() {
    style.setAttribute("media", "max-width: 1px");
 });
<style id="my-style" media="max-width: 1px">
   p { color: red }
</style>

<p>Styled if you click below.</p>

<button id="btn-style">Style that p</button>

<button id="btn-unstyle">Unstyle that p</button>

【讨论】:

  • 谢谢!杰出的!我会接受这个黑客。我正在构建一个工具,将 &lt;link&gt;&lt;style&gt; 标记应用于带有切换的页面,并且这种方法在更新 UI 方面比我的第一种方法更快。
  • 这个解决方法是正确的。实际上将type 属性设置为任何随机字符串也会禁用样式块而不完全删除它
  • 有什么理由不使用 max-width: 0px ?
  • max-width
【解决方案4】:

要静态完成,只需删除样式标签。

作为替代方案,您可以从 DOM 中删除样式节点,然后重新插入以重新启用它。

【讨论】:

  • 如果以后想动态添加呢?
  • @Peter of the Corn,但它不再是静态的了吗?
  • 我确信这里的用例是从静态禁用的样式开始,但稍后可以动态启用它们。
【解决方案5】:

一个简单的选择是使它成为一个备用样式表,其标题与主样式表集不同。这将使浏览器默认禁用它。

【讨论】: