【发布时间】:2014-05-21 12:06:08
【问题描述】:
问题:
我正在创建一个 javascript 对象来保存 css 属性。如果我在运行中向对象添加新变量,我会遇到 jQuery .css() 方法的未知问题,但什么也没有发生。 然而,如果我用我想要/做改变的变量启动对象,.css() 方法可以正常工作。
参考a post I found,是否有必要预先设置对象的变量,或者有没有办法改进我的代码使其更具动态性?
(如果我能找到一种动态添加变量的方法,我将能够设置任何 css 属性,而不仅仅是我预先确定的那些。)
扩展说明:
我正在尝试在我的 HTML 中动态更改填充和边距值。 我创建了一个基于similar question 的函数。但是,如果我只是创建一个空对象,
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 被创建(在源代码和控制台日志中查看)但 $(this) 的 css 没有改变。 相反,当我使用所有相同的代码创建带有预设变量的 cssObject 时,它执行得很好。
函数步骤:
使用包含“setspacing”的类名循环遍历每个 HTML 对象(即 div 等)。
当前对象的类名被拆分成一个数组。
遍历类名,如果名称中包含“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)
【问题讨论】:
-
请贴出
console.log(JSON.stringify(cssObject));的结果 -
jQuery css() 方法不支持
!important语句。也就是说,在CSS中,你应该使用data-*属性,而不是使用class给元素设置特定数据或根据class设置样式
标签: javascript jquery html css object