$(document).ready(function(){} jquery被调用两次?

时间:2014-11-16 15:31:34

标签: javascript jquery

我是jquery的新手。我编写了一个jquery函数来处理一些表单输入。我看到一个奇怪的问题,我的$(document).ready(function(){}被调用了两次。

我的表格是;

<form>
...........
       <div class="form-actions" id="saveButtons"> 
                    <button class="btn btn-primary" /><%=i18n.localize("save")%></button>
                    <%if(outputs.isPermitted){%><script> </script><a class="btn btn-info" id="publish_api" >Save & Publish</a>  <%}%>
                    <input type="reset" class="btn" value="<%=i18n.localize("cancel")%>" onclick="javascript:window.location.href='./'" />                                         
                </div>
            </form>

jquery是;

<script>
    $(document).ready(function(){


    $('#publish_api').click(function(e){
        $("body").on("api_saved", function(e){
            $.ajax({
                ........
        });
        $("#manage_form").submit();
    });

</script>

点击save and publish按钮后,我看到上述警告两次。如果填写表单时出现任何用户错误,则会出现此问题。 (也就是说,如果用户没有填写MUST字段,并且如果他填写了该条目并尝试单击按钮,那么会是什么原因?

修改; “api-saved”事件处理程序是从javascript调用的; (以验证该形式的所有参数)

var v = $("#manage_form").validate({
        submitHandler: function(form) {
        if(!validate_tiers()){
            return false;
        }

        $('#saveMessage').show();
        $('#saveButtons').hide();        
        $(form).ajaxSubmit({
            success:function(responseText, statusText, xhr, $form) {
                $('#saveMessage').hide();
                $('#saveButtons').show();                
                if (!responseText.error) {                
                    $( "body" ).trigger( "api_saved" );       
                } else {
.........

}

1 个答案:

答案 0 :(得分:2)

您正在嵌套事件处理程序分配,通常一个错误。你有:

$('#publish_api').click(function(e){

为&#34;点击&#34;建立处理程序来自元素的事件。在该事件处理程序内部是设置另一个事件处理程序的代码:

    $("body").on("api_saved", function(e){
        alert("calling lifecycle jag");
        // ...

可能是一个错误的原因是,在&#34;点击&#34;内的.on()的每次调用都是如此。 handler将附加该事件处理程序的单独副本。点击两次后,&#34; api_saved&#34;将会有两个相同的处理程序。事件。点击5次后,将有5个处理程序,依此类推。之所以发生这种情况,是因为对.on()的调用删除已注册的事件处理程序。

可能正确的做法是将事件处理程序分配(&#34; api_saved&#34;)分配给&#34;点击&#34;处理程序。