我想制作一个通用的jQuery代码,它将捕获<form>
子元素的所有submit
事件,包括容器元素(如果是表单)。
案例包括:
容器是一种形式
<form>
<button>hi</button>
</form>
容器是另一个包含表单的元素
<div>
<form>
<button>submit</button>
</form>
</div>
做这件事最干净的代码是什么?
我目前的解决方案如下:
function submit(e) {
// do something
}
$(containerSelectorOrjQueryObject).on("submit", "form", submit);
$(containerSelectorOrjQueryObject).on("submit", submit);
不过,我很乐意知道是否有更好的解决方案,只使用一个on
调用。
您可以为此使用class属性来设置委托,以捕获任何子窗体的提交事件,无论父元素是什么。因为它是委托,所以它也将捕获由动态添加的元素激发的任何内容。
包括单个表单场景、div场景中的多个表单以及动态添加表单的按钮的示例:
var alreadyAdded;
function submit(e) {
// do something
alert(e.target.name);
return false;
}
$("body").on("submit", ".outerContainer", submit);
$("#addAnotherDynamically").on("click", function(e) {
if (typeof(alreadyAdded) === "undefined") {
alreadyAdded = true;
$("#test2").append("<form name='form4'><button>submit 4</button></form>");
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<body>
<form id="test1" name="form1" class="outerContainer">
<button>submit 1</button>
</form>
<div id="test2" class="outerContainer">
<form name="form2">
<button>submit 2</button>
</form>
<form name="form3">
<button>submit 3</button>
</form>
</div>
<br>
<button id="addAnotherDynamically">Add another form</button>
</body>
Submit事件和其他事件一样,在DOM中冒泡,因此将提交事件侦听器附加到form
本身或其任何父级都可以工作,甚至可以在那里取消提交。
要始终获取触发提交的form
,请在事件侦听器方法中使用e.target
而不是this
。
参见此示例:
function onSubmit(e){
e.preventDefault();
document.getElementById('d3').innerHTML += 'Submit catched in ' + e.currentTarget.tagName + '#' + e.currentTarget.id + ' for ' + e.target.tagName + '#' + e.target.id + '<br/>';
}
$(function(){
$('#d1').on('submit', onSubmit);
$('#f2').on('submit', onSubmit);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="d1">
<form id="f1">
<input type="submit" value="Event Listener on DIV" />
</form>
</div>
<div id="d2">
<form id="f2">
<input type="submit" value="Event Listener on Form" />
</form>
</div>
<div id="d3">
</div>
运行它并单击按钮,您可以看到使用相同的on
调用,您可以将evest附加到窗体本身或其父窗体,它将按预期工作。
所以,你可以只使用下面的行,它会很好地工作:
$(containerSelectorOrjQueryObject).on("submit", submit);