Подтвердить что ты не робот

JQuery CSS: динамически изменять атрибуты класса

Я хочу изменить атрибут класса, на который повлияет весь элемент, который использует этот класс для остальной части ресурса веб-приложения (от начала использования до выхода пользователя из веб-приложения).

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 вы увидите, что следующий добавленный элемент не имеет нового атрибута.

MORE:

Я просто использую цвет для основы, я буду реализовывать это в более крупном масштабе, чего я хочу добиться, - это динамически изменять атрибуты класса, которые будут использоваться для всего жизненного цикла веб-приложения.

4b9b3361

Ответ 1

Использование метода css() изменяет встроенные стили на уже существующие элементы, и вы не можете использовать это для изменения стилей для будущих элементов. Обходной путь (который мне не очень нравится) заключается в том, чтобы вставить тег стиля:

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

FIDDLE

Ответ 2

Я просто наткнулся на этот вопрос и подумал, что я заберусь, хотя это уже почти год...

Фактически вы можете изменять правила 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

Ответ 3

Попробуйте внести изменение цвета в функцию:

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

И назовите его "при загрузке" и после того, как вы что-то изменили с помощью jQuery.

Ответ 4

Я бы сделал что-то вроде ниже. Он не изменяет класс, но он делает то, что вам нужно.

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

и css:

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

Демо

В любом случае, если вы хотите, чтобы это было включено для любой страницы, вы должны сделать это с участием сервера. Например, установив некоторую переменную в сеанс и возвращая соответствующий css на основе этой переменной.

Или вы можете использовать файлы cookie (установите флажок jquery 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.
   }
})

Ответ 5

Попробуйте следующее: 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'));
   });
});

Ответ 6

У меня была такая же цель, я использую хэши + ajax для наборов записей навигации, и мне нужно было легко сохранить предпочтения наборов записей. (Мне нужны ссылки на съемные, если пользователь предпочитает перемещаться по записям со ссылками или невидимыми, если они выбрали).

Ответ DaveInMaine велик, но я немного беспокоюсь о обратной совместимости, поэтому я стремился к простому решению.

Поименовав мою таблицу, статический элемент recordTable, предоставив ему класс LinksOn, и я могу использовать стилистические селектора типа #recordTable.LinksOn a и #recordTable.LinksOff a с отображением, установленным в none, и использовать простой javascript, например

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

Сохраняя последний класс в переменной в cookie, сеансе на стороне сервера через ajax или localStorage, я могу сохранить его между сеансами, если мне нравится.

Я мог бы сделать все это с помощью одного класса (#recordtable и #recordtable.on, а не on и off), но я решил сохранить его таким образом.

Ответ 7

В дополнение к тому, что было сказано, я думаю, было бы бесполезно модифицировать правило css, потому что уже существующие элементы не будут изменены.

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

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

Теперь, если вы каким-то образом измените класс "myclass" itselef, это не повлияет на "Я здесь", потому что это не связано динамически. Возможно, это повлияет на вновь созданные элементы.