【问题标题】:Multiple events are being fired多个事件被触发
【发布时间】:2014-08-23 12:14:27
【问题描述】:

我在下面有一个简单的脚本,可以动态创建新的 html 表单。当我尝试单独提交一个时,它会提交(this)点击的表单,然后提交所有紧随其后的表单。

实在看不出这里有什么bug(代码):

<script type="text/javascript">
(function ($) {
$(function () {

    var addFormGroup = function (event) {
        event.preventDefault();

        var $formGroup = $(this).closest('.form-group');
        var $multipleFormGroup = $formGroup.closest('.multiple-form-group');
        var $formGroupClone = $formGroup.clone();

        $(this)
            .toggleClass('btn-success btn-add btn-danger btn-remove')
            .html('–');

        $formGroupClone.find('input').val('');
        $formGroupClone.find('.concept').text('Phone');
        $formGroupClone.insertAfter($formGroup);

        var $lastFormGroupLast = $multipleFormGroup.find('.form-group:last');
        if ($multipleFormGroup.data('max') <= countFormGroup($multipleFormGroup)) {
            $lastFormGroupLast.find('.btn-add').attr('disabled', true);
        }

       $('form').on('submit', function(event) {
        event.preventDefault();
        $(this).attr('disabled', 'disabled');
        $( this ).serialize();
        var weburl = $(this).find(".web_url").val();
        var width = $(this).find(".width").val();//$('.width').val();
        var height = $(this).find(".height").val();//$('.height').val();
        var dee = <?php echo $deet[0]->id; ?>;
        $.post( "mde", { weburl: weburl, width: width, height: height, dee: dee })
          .done(function( data ) {
             u = data;
             alert(u);
          });
        //$.get(u);  
      });

    };

    var removeFormGroup = function (event) {
        event.preventDefault();

        var $formGroup = $(this).closest('.form-group');
        var $multipleFormGroup = $formGroup.closest('.multiple-form-group');

        var $lastFormGroupLast = $multipleFormGroup.find('.form-group:last');
        if ($multipleFormGroup.data('max') >= countFormGroup($multipleFormGroup)) {
            $lastFormGroupLast.find('.btn-add').attr('disabled', false);
        }

        $formGroup.remove();
    };

    var selectFormGroup = function (event) {
        event.preventDefault();

        var $selectGroup = $(this).closest('.input-group-select');
        var param = $(this).attr("href").replace("#","");
        var concept = $(this).text();

        $selectGroup.find('.concept').text(concept);
        $selectGroup.find('.input-group-select-val').val(param);

    }

    var countFormGroup = function ($form) {
        return $form.find('.form-group').length;
    };

    $(document).on('click', '.btn-add', addFormGroup);
    $(document).on('click', '.btn-remove', removeFormGroup);

});
})(jQuery);
</script>
<script>
    $( document ).ready(function() {
      // Handler for .ready() called.
      $('form').on('submit', function(event) {
        event.preventDefault();
        $(this).attr('disabled', 'disabled');
        $( this ).serialize();
        var weburl = $(this).find(".web_url").val();
        var width = $(this).find(".width").val();//$('.width').val();
        var height = $(this).find(".height").val();//$('.height').val();
        var dee = <?php echo $deet[0]->id; ?>;
        $.post( "mde", { weburl: weburl, width: width, height: height, dee: dee })
          .done(function( data ) {
             u = data;
             alert(u);
          });
        //$.get(u);  
      });

    });
</script>

【问题讨论】:

  • 为什么将函数包装在一个函数中并混合使用 document.ready 和 $(function( ? - 你分配了两个表单提交。完全删除第二个脚本。而且每次克隆时,你添加另一个提交事件
  • 啊——我的错,我把它放在了自己的文件中。刚刚复制到这里

标签: javascript jquery html forms twitter-bootstrap


【解决方案1】:

假设其余代码正常工作,类似这样的事情

<script type="text/javascript">
$(function () {

    var addFormGroup = function (event) {
        event.preventDefault();

        var $formGroup = $(this).closest('.form-group');
        var $multipleFormGroup = $formGroup.closest('.multiple-form-group');
        var $formGroupClone = $formGroup.clone();

        $(this)
            .toggleClass('btn-success btn-add btn-danger btn-remove')
            .html('–');

        $formGroupClone.find('input').val('');
        $formGroupClone.find('.concept').text('Phone');
        $formGroupClone.insertAfter($formGroup);

        var $lastFormGroupLast = $multipleFormGroup.find('.form-group:last');
        if ($multipleFormGroup.data('max') <= countFormGroup($multipleFormGroup)) {
            $lastFormGroupLast.find('.btn-add').attr('disabled', true);
        }           
    };

    var removeFormGroup = function (event) {
        event.preventDefault();

        var $formGroup = $(this).closest('.form-group');
        var $multipleFormGroup = $formGroup.closest('.multiple-form-group');

        var $lastFormGroupLast = $multipleFormGroup.find('.form-group:last');
        if ($multipleFormGroup.data('max') >= countFormGroup($multipleFormGroup)) {
            $lastFormGroupLast.find('.btn-add').attr('disabled', false);
        }

        $formGroup.remove();
    };

    var selectFormGroup = function (event) {
        event.preventDefault();

        var $selectGroup = $(this).closest('.input-group-select');
        var param = $(this).attr("href").replace("#","");
        var concept = $(this).text();

        $selectGroup.find('.concept').text(concept);
        $selectGroup.find('.input-group-select-val').val(param);

    }

    var countFormGroup = function ($form) {
        return $form.find('.form-group').length;
    };

    $(document).on('click', '.btn-add', addFormGroup);
    $(document).on('click', '.btn-remove', removeFormGroup);
    $(document).on('submit','form' function(event) {
        event.preventDefault();
        $(this).attr('disabled', 'disabled');
        // $( this ).serialize(); // not used
        var weburl = $(this).find(".web_url").val();
        var width = $(this).find(".width").val();
        var height = $(this).find(".height").val();
        var dee = <?php echo $deet[0]->id; ?>;
        $.post( "mde", { weburl: weburl, width: width, height: height, dee: dee })
          .done(function( data ) {
             u = data;
             alert(u);
        });
    });
});
</script>

【讨论】:

  • 我已经测试了最后一个小时,它似乎工作得相当好。剩下的一个问题是,在提交时,初始数据会不断重新提交?
  • 它会在后续提交时重新提交第一次提交的任何内容。
  • 1) 你有序列化,为什么要使用其他的东西? 2)你有一个硬编码的 $deet[0]->id
  • 是的,评论序列化,那是从以前开始的。硬编码代码应该在每个提交上,所以没有问题。
  • 这是我正在尝试做的视觉演示。当我在这里单击“提交”时,“第一个表单”就是提交的内容。 recordit.co/yRWH0GAo5Q - 或 g.recordit.co/yRWH0GAo5Q.gif
【解决方案2】:

因为它们是动态元素,所以使用 off() 函数和 on() 函数:

$('form').off().on('submit', function(event){
    event.preventDefault();

    ----
    ----
    ----

});

这样提交功能只会在相应的表单上被触发。

【讨论】:

  • 我相信 live() 现在已经被弃用了,不是吗?
  • 这取决于您拥有的 jquery 版本。试试看。
  • 我有最新版本 - 它肯定已被弃用。
  • 无论如何,试试看它是否适合你。
  • 没有必要否决这个答案。这为您提供了清晰的思路来解决您的问题。您需要使用更新的功能更改已弃用的功能。而已。我希望它能解决你的问题。
猜你喜欢
  • 2013-07-06
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多