jQuery中如何运行与回调代码之前提交(in Jquery how to run code wit

2019-07-18 01:10发布

我需要提交表单之前运行一些jQuery代码,并似乎有一些问题。

只是听我说你赶紧推荐此之前:

$(function() {
     $('form').submit( function() {
         /* some code */
         return true;
     });
});

我需要的,按“提交”按钮,首先计算使用谷歌API的地址的经度和纬度变量,然后提交表单后。 这需要监听的回调函数的响应。

我到目前为止的代码如下所示:

  $("form input:submit").click(function(e){
      e.preventDefault();
      var address = $(this).find('.address').val();
      geocoder.geocode( { 'address': unescape(address)}, function(results, status) 
      {
          if (status == google.maps.GeocoderStatus.OK) 
          {
            $(".latSelector input:hidden").val(results[0].geometry.location.lat());
            $(".lngSelector input:hidden").val(results[0].geometry.location.lng());
            $("form").submit();
          }
       });  
  });

如果我使用“提交”功能做同样的,被触发之前的回调函数的代码具有缺失值后面执行的形式提交。

如果我使用像上面的代码按钮的“click”事件和手动提交,那么代码执行正常,但提交不会触发形式背后的代码。

我想我接近得到这个工作,但我不能找到神奇的组合,将正确运行的代码,过程中的回调值,然后提交表单,让后面的代码执行。

Answer 1:

您应该使用submit表单,而不是在事件click按钮的事件。 有些浏览器允许在不使用只需按下Enter在表单一些领域具有焦点提交按钮提交表单。

preventDefault方法将停止表单的提交,这样你可以稍后提交:

$("form").submit(function(e){
  e.preventDefault();
  var address = $(this).find('.address').val();
  geocoder.geocode( { 'address': unescape(address)}, function(results, status) 
  {
      if (status == google.maps.GeocoderStatus.OK) 
      {
        $(".latSelector input:hidden").val(results[0].geometry.location.lat());
        $(".lngSelector input:hidden").val(results[0].geometry.location.lng());
        $("form")[0].submit();
      }
   });  
});

编辑:

要使用按钮提交表单,你需要跟踪为什么表单提交的:

var reason = 'user';

$("form").submit(function(e){
  if (reason == 'user') {
    e.preventDefault();
    var address = $(this).find('.address').val();
    geocoder.geocode( { 'address': unescape(address)}, function(results, status) 
    {
      if (status == google.maps.GeocoderStatus.OK) 
      {
        $(".latSelector input:hidden").val(results[0].geometry.location.lat());
        $(".lngSelector input:hidden").val(results[0].geometry.location.lng());
        reason = 'callback';
        $("form input:submit").click();
      }
    });
  }
});


Answer 2:

只是:

  1. 调用回调函数。
  2. 当提交由用户抛出(即不提交)返回false。
  3. 在回调结束,把那些用在提交代码触发功能

快速示例代码:

$('elem').click(function{
  callback();
  return false;
})

并在callback()你应该提交表单。 这是一个很好的做法也时执行的转变。

编辑若要回答您的评论 。completenes的缘故,我会为我的答案完整的例子。 请考虑我的回答并不需要进一步的变量,所建议Guffa 。

您可以检查它在这里 ,并在这里下面的代码:

$('input[type="submit"]').click(function(e){
    var address = 'London, UK';
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode( { 'address': unescape(address)}, function(results, status){
      if (status == google.maps.GeocoderStatus.OK) 
      {
        $(".latSelector input:hidden").val(results[0].geometry.location.lat());
        $(".lngSelector input:hidden").val(results[0].geometry.location.lng());
        alert("DATA TAKEN BEFORE TO SUBMIT");
        $('form').submit();
      }
    });

  return false;
});

最后,考虑到一般用户都会做如下:

  1. 用户点击提交按钮
  2. 用户想看到随后的页面,而客户在等待回调完成。
  3. 于是,心急的用户将再次点击发送按钮。

因此,我也建议禁用后“点击”事件是由用户触发提交按钮。

最后,我建议总是使用return false ,而不是preventDefault()以阻止这样的事件传播,阅读在这里是为什么。



Answer 3:

我想出了一个可能是简单的解决方案,以避免Guffa的首次提交循环。

一旦回调结束后 ,简单地解除绑定 (使用解除绑定()或关闭())提交处理程序, 然后进行提交表单。 环路坏)



Answer 4:

这可能是针对一些任意的标准可以接受的做法,但我只想阻止通过与这样的回车键提交表单:

$('form').bind("keyup keypress", function(e) {
  var pressedKey = e.keyCode || e.which; 
  if (pressedKey  == 13) {               
    e.preventDefault();
    return false;
  }
});

然后我会设置实际的提交按钮显示:none和使用元素,你被解雇的问题。点击使用()由Guffa的建议有原代码。 木已成舟没有多余的用户/回拨条件逻辑。

$("button#Submit").click(function(){
      var address = $("form").find('.address').val();
      geocoder.geocode( { 'address': unescape(address)}, function(results, status) 
      {
          if (status == google.maps.GeocoderStatus.OK) 
          {
            $(".latSelector input:hidden").val(results[0].geometry.location.lat());
            $(".lngSelector input:hidden").val(results[0].geometry.location.lng());
            $("form input:submit").click();
          }
       });  
  });


文章来源: in Jquery how to run code with callback before submit