2

我有 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作为 getter 和 setter 的值?

例如$('#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"
}

我为每个表单字段data-prop赋予其关联的 CSS 属性的属性,如下所示:

<input type="text" data-prop="font-family" />

然后我会像这样循环规则

$.each(cssRules, function(name, value) {
  $('[data-prop=' + name + ']').val(value);
})

漂亮,整洁,舒适。

4

4 回答 4

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;
    }

};

编辑:我看到了你的编辑,但我认为你从这里得到了这个想法......你可以签$(elem).data()入 valHook 并根据它调用不同的函数。在这里我只是检查.id === "shadow"

于 2012-05-29T19:23:07.187 回答
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(' '));

演示

于 2012-05-29T19:15:12.053 回答
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/

于 2012-05-29T19:17:43.507 回答
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());

工作小提琴 </p>

于 2012-05-29T19:30:27.653 回答