【问题标题】:Abort AJAX and form submitions, save them, change them, and send it later中止 AJAX 和表单提交,保存,更改,稍后发送
【发布时间】:2013-09-16 13:45:39
【问题描述】:

当用户单击某些按钮并提交某些表单时,我需要向用户请求其他凭据。

我尝试这样做的方式是:

  • 拦截提交事件,中止它,并存储一个副本
  • 通过提示对话框询问凭据(不是 JS 原生的,所以这都是非阻塞的)
  • 如果用户输入凭据,则将字段插入事件数据并将其发送到服务器。

我当前的 AJAX 请求代码是:

$(document).ajaxSend(function(event, jqXHR, ajaxOptions) {
  if (ajaxOptions.type === "POST") {
    $.current_request = jqXHR;
    jqXHR.abort();
    $.check_password_with_my_dialog();
  }
});

$.check_password_with_my_dialog: function() {
  $("#validate-password-prompt").dialog({
    modal: true,
    title: "input pw",
    buttons: {
      Ok: function() {
        $.password = $("#validate-password-prompt input").val();
        $.deliver_current_request();
        return $(this).dialog("close");
      },
      Cancel: function() {
        return $(this).dialog("close");
      }
    }
  });
}

deliver_current_request: function() {
  $.current_request.beforeSend = function(jqXHR, ajaxOptions) {
    ajaxOptions.data = ajaxOptions.data.concat("&password=" + $.password);
  };
  $.ajax($.current_request);
}

到目前为止的问题是ajaxOptions.data 未定义,所以我无法添加我的数据。 并且请求似乎是作为 GET 而不是 POST。

我这样做是正确的,还是正确的方式?

【问题讨论】:

  • 一种方法是,用户提交表单时,在实际提交表单之前,先使用modal获取密码。如果他输入密码,则将密码附加到序列化的表单数据中,并通过 ajax post 提交表单。否则,如果他取消密码模型,则只需退出或将序列化数据保存在本地内存中并进一步使用。

标签: javascript jquery ruby-on-rails ajax forms


【解决方案1】:

更新

这是我能想到的一种方法来完成对您问题的回答。

<form id="myForm" >
  <button id="submit-form-btn">Submit</button>
</form>
<div id="validate-admin-password-prompt">
    <input type="password"/>
</div>

在 JavaScript 中,

function submitForm(pwd) {
    var formData = $('form#myForm').serialize() + "&password=" + pwd;
    $.ajax({
        type: "POST",
        url: "http://google.com",
        data: formData,
        dataType: "script"
    });
    alert("POSTed: " + formData.toString());
}

function alertDialog() {
  $("#validate-admin-password-prompt").dialog({
    modal: true,
    title: "Admin password is required",
    zIndex: 10000,
    buttons: {
      Ok: function() {
        $(this).dialog("close");
        var pwd = $("#validate-admin-password-prompt input").val();
        submitForm(pwd);
      },
      Cancel: function() {
        $(this).dialog("close");
        alert('Not authorized to submit the form');
        return false;
      }
    }
  });
}
$("#submit-form-btn").click(function(e) {
  e.preventDefault();
  $ele = $("#validate-admin-password-prompt input");    
  if ($ele.val()==null || $ele.val().trim()=="") {
      alertDialog();
  } else {
      submitForm($ele.val());
  }
});

【讨论】:

  • 它不会起作用,因为打开模态是一个非阻塞操作。代码将继续执行并到达 else 情况。
  • 我能知道非阻塞操作到底是什么意思吗?
  • 表示代码会继续执行而不是等待1-打开modal的hole函数; 2-等待用户输入; 3-验证用户输入; 4-返回。因此,我无法将密码注入表单数据,因为当我获得密码时,表单已经提交。 (在您的代码中,它会达到 else 条件,因为 pwd 将评估为未定义)
  • 我认为表单不会提交,因为我们已经编写了'e.preventDefault();'语句,这将阻止按钮的默认行为。
  • 这个怎么样??你能运行这个,让我知道这是你需要的吗? jsfiddle.net/zSmhu/2
猜你喜欢
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
相关资源
最近更新 更多