0

背景:我需要附加某些数据才能发布;类似于 jQueryajaxSetup为异步请求所做的,除了我需要它来提交本地表单。

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

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

$("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,如果没有找到就创建它,然后将它的值设置为 "some value"。但是因为 的结果.find()实际上是一个 jQuery 包装器,所以它会被隐式转换为true即使没有找到匹配的元素,.append()也永远不会执行代码的含义。

有没有一种很好的方法来解决整个“寻找一个元素并在它不存在的情况下创建它”场景?

4

2 回答 2

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');
于 2013-03-06T02:16:50.843 回答
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" />...');
于 2013-03-07T23:37:46.780 回答