背景:我需要附加某些数据才能发布;类似于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()
代码也永远不会执行。
有没有一种很好的方法可以解决整个“寻找元素并创建它,如果它尚不存在”场景?
答案 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" />...');