【问题标题】:When using jQuery.attr() to set an attribute the browser doesn't update the style from the css使用 jQuery.attr() 设置属性时,浏览器不会从 css 更新样式
【发布时间】:2010-12-01 22:49:35
【问题描述】:

我有一个站点帽子,列出了一组可以下载的文件。自定义属性 docType 是根据文件扩展名设置的。如果没有扩展,则 docType 设置为“unknownDoc”。 CSS 文件如下所示:

.TitleColumn[docType="pdf"]
{
    background: url("/images/common/icons/pdf.png") no-repeat left center;
}

.TitleColumn[docType="doc"], TitleColumn[docType="docx"]
{
    background: url("/images/common/icons/word.png") no-repeat left center;
}

.TitleColumn[docType="unknownDoc"]
{
    background: url("/images/common/icons/unknownDoc.png") no-repeat left center;
}

用户很可能会上传我们尚未设置 css 样式的文档。在这种情况下,该项目将具有 docType 但没有背景图像。在这些情况下,我希望应用 unknownDoc 样式。所以我使用以下内容:

$('.TitleColumn').each(function (index) {
    var hasNoDocImage = $(this).css("background-image") == "none";
    var docType = $(this).attr("docType");

    if (hasNoDocImage && docType) {
        $(this).attr("docType", "unknownDoc");
        $(this).addClass("TitleColumn[docType=\"unknownDoc\"]");
    }
});

这很好用。我不明白为什么我必须使用 addClass 语句? attr 或 addClass 本身不起作用。就好像添加属性不会导致浏览器像 addClass 那样根据新属性重新设置项目的样式。这是 jQuery 的事情还是浏览器的事情?

有没有更好的方法来做到这一点?

我尝试只使用类而不是 docType 自定义属性,但它变得太乱了,尤其是将来可能会向元素添加其他类时。

【问题讨论】:

  • 感谢您的好评。我将保持代码原样(但如果有人提出我更喜欢的建议,我可能会被说服做不同的事情)。我这样做的原因是我真的很喜欢使用 docType 属性的简洁性。另外,似乎单个 .addClass 行确实是 IE 的修复程序,因为 FF 和 Chrome 可以正确处理它。因此,单行 IE 修复几乎不是什么大问题,而且现在已经很标准了。

标签: jquery css addclass attr


【解决方案1】:

似乎只与 IE 一起使用,因为 Chrome 和 FF 在没有 addClass 的情况下可以正常工作。你上面的一个更简单的版本是:

$(this).attr("docType", "unknownDoc").removeClass('TitleColumn').addClass('TitleColumn');

似乎是 IE(或 jQuery)无法理解选择器的动态变化。

您可以在此小提琴中验证 FF 和 Chrome 是否正常:http://jsfiddle.net/fUSVF//

【讨论】:

  • 啊,谢谢。你是对的。我们 80% 的用户仍然使用 IE,所以这是我测试的第一个浏览器。经过一整天的编码后,我想我只是一成不变,没想到这是否适用于 FF 和 Chrome。
  • 我需要使用 removeClass 有什么原因吗? addClass 是否会以某种方式将 DOM 中的类加倍,如果是,这是一个问题吗?
  • addClass 不会影响元素,因为它已经具有类。 removeClass 后跟 addClass 本质上会重置元素上的类相关定义,并会导致重新计算任何依赖项(如属性选择器)
【解决方案2】:

把你的css改成这样不是更简单吗:

.TitleColumn[docType="unknownDoc"], .unregisteredExtension
{
    background: url("/images/common/icons/unknownDoc.png") no-repeat left center;
}

在检测到这种情况后只是.addClass("unregisteredExtension")

   if (hasNoDocImage && docType) {
      $(this).addClass("unregisteredExtension")
   }

【讨论】:

  • 啊,这是一个简单的想法,我喜欢它。但是,我真的很喜欢 docType 属性的简洁性,并且(叫我固执)我不想为了相同的效果混合属性和类。如果我最初使用属性,我可能会坚持下去。不过,我绝对愿意接受说服。 :)
【解决方案3】:

您实际上不应该添加自定义属性。浏览器不必关心它们 - 实际上,完全忽略它们是它们能做的最好的事情,这样可以确保如果你在其中存储一些废话,它不会搞砸任何事情。

如果您想通过 JavaScript+CSS 更改外观,请使用类。最简单的方法是使用一个没有其他类的元素,然后你可以简单地做$(elem).removeClass().addClass('yourNewClass');

【讨论】:

  • 我没有看到任何文档表明自定义属性对现代浏览器(FF、Chrome、IE 7+)来说是一件坏事。事实上,据我所见,它是 XHTML 的一个有意的部分。不幸的是,将来很有可能会为与 docType 无关的设计添加其他类。测试是否添加了一个 docType 类而不是多个其他类并不像一行代码那么简单。另外,拥有 docType 属性似乎更干净。
猜你喜欢
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 2016-07-13
  • 2014-10-21
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多