DOM元素虚拟值或映射值

时间:2012-05-29 19:11:24

标签: jquery css

我有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);
})

漂亮,整洁,舒适。

4 个答案:

答案 0 :(得分:3)

http://jsfiddle.net/XCCgv/4/

$.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());

Working Fiddle