我有4个文本框组成text-shadow属性的输入,并且包含在DIV中,如下所示:
<div id="shadow">
<input type="number" min="-5" max="5" step="1" value="0" id="hshad" />
<input type="number" min="-5" max="5" step="1" value="0" id="vshad" />
<input type="number" min="0" max="20" step="1" value="0" id="bshad" />
<input type="text" value="#000000" id="cshad" />
</div>
现在,我手动组合四个输入以获得所需的css值。像这样:
$('#elem').css('text-shadow', $('#hshad').val() + "px " + $('#vshad').val() + "px " + $('#bshad').val() + "px " + $('#cshad').val());
有没有一种方法可以将这些值“映射”为#shadow
的值作为吸气剂和设定者?
例如$('#shadow').val()
会给我
"0px 1px 5px #FFFFFF"
我可以通过以下方式设置四个输入的值:
$('#shadow').val("0px 1px 5px #FFFFFF")
这几乎是出于此目的(因为我知道你会问)能够在编辑具有预先存在规则的记录时循环CSS规则并设置表单字段值。这一切都归于我正在制作的邪恶的所见即所得。
修改
好的,因为这个问题从val()
传回来是很重要的。我正在循环~20-30个CSS规则,并且不希望被单个规则所困扰。我可以在循环之后返回并分解值,但我希望扩展val
并使我的代码保持一个漂亮,整洁的循环。
示例
我的CSS循环(作为JSON对象)“
{
"top": "48px",
"left": "59px",
"width": "100px",
"height": "100px",
"font-family": "Oxygen",
"font-size": "1em",
"font-weight": "normal",
"color": "rgb(51, 51, 51)",
"text-shadow": "rgb(0, 0, 0) 1px 0px 0px",
"background-color": "rgba(0, 0, 0, 0)",
"border-radius": "0px",
"-moz-border-radius": "0px",
"box-shadow": "none",
"-moz-box-shadow": "none",
"padding": "0px"
}
我为每个表单字段为其关联的CSS属性提供data-prop
属性,如下所示:
<input type="text" data-prop="font-family" />
然后我会像这样循环规则
$.each(cssRules, function(name, value) {
$('[data-prop=' + name + ']').val(value);
})
漂亮,整洁,舒适。
答案 0 :(得分:3)
$.valHooks.div = {
get: function( elem ) {
if( elem.id !== "shadow" ) return;
return $.map( $("input", elem ), function (element,index) {
return index === 3 ? element.value : element.value + "px"
}).join(" ");
},
set: function( elem, value ) {
if( elem.id !== "shadow" ) return;
var inputs = $( "input", elem );
$.each( value.split(" "), function( index, value ) {
var val = parseFloat(value);
inputs[index].value = isNaN(val) ? value : val;
});
return true;
}
};
编辑:我看到了你的编辑,但我认为你从这里得到了想法......你可以在valHook中检查$(elem).data()
并根据它调用另一个函数。在这里,我只是检查.id === "shadow"
答案 1 :(得分:2)
var value = [];
$('div#shadow input').filter(function(index, val) {
index != 3 ? value.push(this.value + 'px') : value.push(this.value);
});
console.log(value.join(' '));
<强> DEMO 强>
答案 2 :(得分:0)
是的,使用自定义插件或功能。我会做一个简单的功能。
function getShadow() {
return $.map( $("#shadow input"), function (element,index) {
return index === 3 ? element.value : element.value + "px"
}).join(" ");
}
console.log(getShadow());
http://jsfiddle.net/XCCgv/
答案 3 :(得分:0)
这是一个简单的jQuery函数,您可以将其用作您的案例的getter / setter:
$.fn.customVal = function(val){
if(!val){
//getter
var value = [];
$('input',$(this)).filter(function(index, val) {
value.push(this.value);
});
value = $.map(value,function(elem,index){
return index != 3 ? elem + 'px' : elem;
});
return value.join(' ');
}else{
//setter
var parts = val.split("px");
$('input',$(this)).each(function(index, val) {
$(this).val($.trim(parts[index]));
});
}
};
alert($('#shadow').customVal());
$('#shadow').customVal("0px 1px 5px #FFFFFF");
alert($('#shadow').customVal());