28

我想更改一个类的属性,在该类的其余 Web 应用程序生命周期(从使用开始直到用户退出 Web 应用程序)中使用该类的所有元素都会受到影响。

html:

<p class="myClass">
    What?
</p>
<p class="myClass">
    Now?
</p>

CSS:

.myClass{
    background-color: #ffff00;    
}

js:

$(".myClass").css("background-color", "#00FFFF");
$("p").last().after("<div class='myClass'>Now!</div>");

这是一个示例

我想从示例中实现的是所有后续动态添加的 myClass 都将具有新属性。从 jsFiddle 中,您会看到下一个添加的元素没有新属性。

更多的:

我只是使用颜色作为基础,我将在更大范围内实现它,我想要完成的是动态更改将用于整个 Web 应用程序生命周期的类的属性。

4

7 回答 7

31

我只是偶然发现了这个问题,并认为我会插话,即使它已经快一岁了......

实际上,您可以在运行时动态修改 css 规则,就像任何其他 DOM 元素一样。我认为 jQuery 不支持它,因此您需要直接使用本机 DOM 元素。

您可以为样式表分配标题,以使它们更容易在 DOM 树中找到,但只要稍加考虑,通常不会太难找到您想要的规则。这是一个基于您的示例的 jsfiddle 的快速示例。

function getStyleRule(name) {
  for(var i=0; i<document.styleSheets.length; i++) {
    var ix, sheet = document.styleSheets[i];
    for (ix=0; ix<sheet.cssRules.length; ix++) {
        if (sheet.cssRules[ix].selectorText === name)
            return sheet.cssRules[ix].style;
    }
  }
return null;
}

var rule = getStyleRule('.myClass');
rule.backgroundColor = '#0ff';

$("p").last().after("<div class='myClass'>Now!</div>");

这是一个显示您的示例的小提琴,已更新以修改 css 规则本身:http: //jsfiddle.net/93wGJ/5/

有关样式表的 DOM 的更多信息,请查看http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html

于 2013-12-29T05:38:40.877 回答
25

使用 css() 方法会更改现有元素的内联样式,您不能使用它来更改未来元素的样式。一种解决方法(我不太喜欢)是插入样式标签:

$( "<style>.myClass {background-color : #00FFFF}</style>" ).appendTo( "head" )
$("p").last().after("<div class='myClass'>Now!</div>");

小提琴

于 2013-01-23T10:50:50.613 回答
5

尝试将颜色更改放入函数中:

function colorChange() {
     $(".myClass").css("background-color", "#00FFFF");
}

并称其为“加载时”,在您使用 jQuery 更改某些内容之后。

于 2013-01-23T10:51:40.427 回答
1

我会做类似下面的事情。它不会修改类,但可以满足您的需要。

$("body").addClass("updatedClass");
$("p").last().after("<div class='myClass'>Now!</div>");

和CSS:

.myClass{
    background-color: #ffff00;    
}
.updatedClass .myClass {
    background-color: #00FFFF;    
}

演示

在任何情况下,如果您想为任何页面启用此功能,您应该在涉及服务器的情况下执行此操作。例如,通过将某个变量设置到会话中,然后根据该变量返回相应的 css。

或者您可以使用 cookie(检查jquery cookies插件以便更简单地访问客户端的 cookie)并通过插入样式标签或通过在 jQuery.ready 回调中将相应的类添加到正文来修改类。

例如,使用 cookie(使用上面提到的插件)代码可能是这样的:

$("body").addClass("updatedClass");
$("p").last().after("<div class='myClass'>Now!</div>");
$.cookie('baseClass', 'updatedClass'); // set class for current session (this cookie will be deleted after user ends his session)

而且,每个页面都应该有:

$(function() {
   if($.cookie('baseClass') != null) {
        $("body").addClass($.cookie('baseClass'));// or style tag could be added here instead.
   }
})
于 2013-01-23T10:50:15.230 回答
0

试试这个:http: //jsfiddle.net/tRqBV/5/

$(function () {
   $(".myClass").css("background", "green");
   $("p").last().after("<div class='myClass'>Now!</div>");

   $(document).ready(function () {
    $('div.myClass').css("background", $('p.myClass').first().css('background-color'));
   });
});
于 2013-01-23T11:03:32.310 回答
0

我有同样的目标,我使用哈希 + ajax 来导航记录集,我希望轻松保存记录集的查看首选项。(如果用户喜欢使用链接导航记录,我希望链接可移动,或者如果他们选择不可见)。

DaveInMaine 的回答很好,但我有点担心向后兼容性,所以我努力寻找一个简单的解决方案。

通过命名我的表,一个静态元素,,recordTable给它一个类,LinksOn我可以使用样式选择器,如#recordTable.LinksOn a#recordTable.LinksOff a,将显示设置为无,并使用简单的 javascript

javascript:$('#recordTable').toggleClass('LinksOn').toggleClass('LinksOff');

通过将最后一个类存储在 cookie 中的变量中、通过 ajax 的服务器端会话或 localStorage 中,如果我愿意,我可以在会话之间保存它。

我可以用一个类(#recordtableand #recordtable.on,而不是onand off)来完成这一切,但我选择以这种方式存储它。

于 2015-01-16T04:22:41.773 回答
0

除了已经说过的,我认为修改 css 规则是没有用的,因为已经存在的元素不会被修改。

<style>
.myclass{
font-size:25px;
}
</style>

<div class="myclass">I am here </div>

现在,如果您以某种方式修改类“myclass”本身,它不会影响“我在这里”,因为它不是动态绑定的。也许它会影响新创建的元素。

于 2016-07-25T08:41:25.527 回答