为包括当前元素的子元素委派事件



我想制作一个通用的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);

最新更新