Динамическое создание объекта javascript/jQuery для использования в $.метод css ()
Вопрос:
Я создаю объект javascript для хранения атрибутов css. Если я добавляю новые переменные к объекту на лету, я сталкиваюсь с неизвестной проблемой с jQuery .метод css() и ничего не происходит. однако , если я инициирую объект с переменными, которые я хочу / делаю изменить, то .метод css() работает нормально.
в ссылке на сообщение, которое я нашел , необходимо ли мне предварительно задать переменные объекта, или есть способ улучшить мой код, чтобы быть более динамичным?
(Если я найду способ добавлять переменные на лету, я смогу установить любой атрибут css, а не только те, которые я предопределяю.)
Расширенное Объяснение:
Я пытаюсь изменить значения отступов и полей на лету в моем HTML.
Я создал функцию, которая работает на основеаналогичного вопроса . Однако если я просто создам пустой объект,
var cssObject = {};
Вместо,
var cssObject = {
padding : "inherit",
paddingBottom : "inherit",
paddingLeft : "inherit",
paddingRight : "inherit",
paddingTop : "inherit",
margin : "inherit",
marginBottom : "inherit",
marginLeft : "inherit",
marginRight : "inherit",
marginTop : "inherit"
};
Когда я добавляю каждый новый атрибут css в объектcssObject , объект $.метод css () ничего не делает.
i.e.
for(...){
cssObject[cssName] = cssValue;
};
// The cssObject has (for loop).length many attributes.
// Set new css with cssObject
$(this).css(cssObject);
Создается cssObject (как показано в исходном коде и журналах консоли), но css $(this) не изменяется. отрицательно, когда я создаю cssObject с предустановленными переменными, используя все тот же код, он выполняется нормально.
Шаги функции:
Цикл через каждый HTML-объект (например, div и т. д.) с именем класса (ов) это содержит "setspacing".
Имена классов текущего объекта разбиваются на массив.
Выполните цикл по именам классов и остановитесь, если имя содержит "setspacing".
Части текущего имени класса разбиваются на массив.
Используйте части имен классов для добавления новых атрибутов к объекту css.
Пример HTML-кода:
<div class="full-band">
<div class="inner-wrapper setspacing-margin-right-left-0">
<h3 class="setspacing-padding-30px">Bleep Blorp!</h3>
</div>
</div>
Код JQuery:
$("[class*='setspacing']").each(function(){
var classList = $(this).attr('class').split(" ");
for (var i = classList.length - 1; i >= 0; i--) {
if (classList[i].indexOf("setspacing") >= 0) {
var splitName = classList[i].split("-");
var cssName=null, cssValue=null;
var cssObject = {}; /*
padding : "inherit",
paddingBottom : "inherit",
paddingLeft : "inherit",
paddingRight : "inherit",
paddingTop : "inherit",
margin : "inherit",
marginBottom : "inherit",
marginLeft : "inherit",
marginRight : "inherit",
marginTop : "inherit"
};*/
for (var j = 2; j < splitName.length-1; j++) {
if (splitName.length<=3) {
cssName = splitName[1];
} else {
part = splitName[j].substring(0,1).toUpperCase() + splitName[j].substring(1);
cssName = splitName[1]+part;
};
cssValue = splitName[splitName.length-1]+" !important";
cssObject[cssName] = cssValue;
};
console.log(JSON.stringify(cssObject)); // EDIT : Added after comment
$(this).css(cssObject);
};
};
});
Консоль вывод при использовании пустого объекта:
[Log] {"marginTop":"0px !important","marginBottom":"0px !important","marginRight":"0px !important","marginLeft":"0px !important"} (setup.js, line 50)
[Log] {"paddingTop":"0px !important","paddingBottom":"0px !important","paddingRight":"0px !important","paddingLeft":"0px !important"} (setup.js, line 50)
[Log] {"marginTop":"0 !important","marginBottom":"0 !important","marginRight":"0 !important","marginLeft":"0 !important"} (setup.js, line 50)
[Log] {"paddingTop":"0 !important","paddingBottom":"0 !important","paddingRight":"0 !important","paddingLeft":"0 !important"} (setup.js, line 50)
2 ответов:
Как сказал Вольф в своих комментариях и согласно этому вопросу, метод jQuery css() не поддерживает
!important, Если вы попытаетесь удалить!importantчасть, то он будет работать, вот JSFiddle для тестирования.Также внутренний цикл for
var j = 1; j < splitName.length-1;начинается с 3-го пункта, поэтому в случаеsetspacing-padding-30pxон не будет повторяться, так как условиеj < splitName.length-1;ложно.$("[class*='setspacing']").each(function(){ var classList = $(this).attr('class').split(" "); for (var i = classList.length - 1; i >= 0; i--) { if (classList[i].indexOf("setspacing") >= 0) { var splitName = classList[i].split("-"); var cssName=null, cssValue=null; var cssObject = {}; /* padding : "inherit", paddingBottom : "inherit", paddingLeft : "inherit", paddingRight : "inherit", paddingTop : "inherit", margin : "inherit", marginBottom : "inherit", marginLeft : "inherit", marginRight : "inherit", marginTop : "inherit" };*/ for (var j = 1; j < splitName.length-1; j++) {// start from 2nd item if (splitName.length<=3) { cssName = splitName[1]; } else { if(j==1) continue; // if it is the 2nd skip.. part = splitName[j].substring(0,1).toUpperCase() + splitName[j].substring(1); cssName = splitName[1]+part; }; cssValue = splitName[splitName.length-1];// remove !imprtant since it is not supported +" !important"; cssObject[cssName] = cssValue; }; console.log(JSON.stringify(cssObject)); // EDIT : Added after comment $(this).css(cssObject); }; }; });
Я не знаю, можете ли вы сильно изменить свой код, но я придумал эту гораздо более простую альтернативу. Он использует атрибуты данных вместо классов, поэтому вам не нужно разбивать имена классов.
Это выглядит следующим образом:
HTML:
<div class="full-band"> <div class="inner-wrapper setspacing" data-margin="0px 0px auto 0px"> <h3 data-padding="30px" class="setspacing">Bleep Blorp!</h3> </div> </div>Javascript:
$(".setspacing").each(function(){ var attrib = $(this).data(); var el = $(this); $.each(attrib, function (i, e) { el.css(i,e); }); });
Comments