更改输入值或添加新输入(如果不存在)

时间:2013-03-06 02:14:23

标签: javascript jquery

背景:我需要附加某些数据才能发布;类似于jQuery的ajaxSetup对异步请求的作用,除了我需要它用于本机表单提交。

我需要能够在提交之前向表单添加几个表单字段,但我想确保我不添加重复的字段以防它们已经存在(即原始提交失败,因为验证或其他)。

起初我觉得这样的事情会很好而且连贯:

$("form").live("submit", function () 
{
    var $this = $(this);

    ($this.find('#stuff') ||
    $this.append('<input type="hidden" id="stuff" name="stuff" />'))
        .val('some value');

    // carry on with the native submit
    // this is actually correct, as opposed to $this.submit()  
    // which would create a loop

    this.submit();
});

含义查找#stuff,如果未找到则创建它,然后将其值设置为“某个值”。但是因为.find()的结果实际上是一个jQuery包装器,它会被隐式转换为true,这意味着即使找不到匹配的元素,.append()代码也永远不会执行。

有没有一种很好的方法可以解决整个“寻找元素并创建它,如果它尚不存在”场景?

2 个答案:

答案 0 :(得分:2)

$this.find('#stuff')更改为$this.find('#stuff').length

修改

如果您希望能够在一个陈述中完成所有这些操作

(
 ($this.find('#stuff').length && $this.find('#stuff')) || 
  $('<input type="hidden" id="stuff" name="stuff" />').appendTo($this)
).val('some val');

答案 1 :(得分:0)

为了保持检查逻辑的可读性,可以扩展条件:

if ($this.find('#stuff').length) {
  $this.find('#stuff').val('some val');
} else {
  $this.append('<input type="hidden" id="stuff'" name="stuff" value="some val" />');
}

或者可以删除并重新添加元素...我知道,“dom操作很昂贵”但是如果有几个字段要操作它就这么漂亮了:

$this.find('#stuff', '#stuff2', ...).remove()
  .append('<input type="hidden" id="stuff" name="stuff" value="some val" />...');