【问题标题】:Submitting one form and Ajaxing too提交一份表格和 Ajaxing
【发布时间】:2013-11-12 13:44:28
【问题描述】:

我使用下面的代码提交表单在 weber 电子邮件列表中注册(addlead.pl 只是一个注册脚本)。 这是我想要完成的事情: 用户提交表单 - 它在 weber 电子邮件列表中注册他(使用多个表单字段中的两个),因为它会是注册表单,然后用户被重定向到正常的表单操作 url,其中包含表单中的发布信息(所有字段)

$('#redeemform').submit(function() {
    var nameVal = $(this).find('input[name="custname"]').val();
    var emailVal = $(this).find('input[name="custemail"]').val();

    $.post('http://www.aweber.com/scripts/addlead.pl', {
        meta_web_form_id:   '1234',
        meta_split_id:      '',
        listname:           'listname',
        redirect:           '',
        meta_adtracking:    'newsletter',
        meta_message:       '1',
        meta_required:      'name,email',
        meta_tooltip:       '',
        email:              emailVal,
        name:               nameVal
    });



alert("thank you"); //<<magic line
 return true;

});

代码有效,但只能使用魔术线 - 警告“谢谢” - 如果没有这条线,它只会提交到默认表单操作,而不是注册到 aweber。 我发现如果我尝试提交表单(返回 true)并同时发送这样的 POST 请求 - 站点将刷新太快并且忽略其中一个请求。 问题是我如何在没有警报/此行中的一些固定延迟的情况下做到这一点。有什么花哨的命令吗?

【问题讨论】:

  • $.post 是异步的。请记住这一点。
  • 使用Aweber的道具!我用了好几年了!!
  • 你是不是想抓住回报?
  • 我正在尝试使表单表现得像它只会正常提交其字段但另外将他的 2 个字段提交给 aweber(通过脚本)。我的代码就是这样做的——但我只想摆脱警报线。我想现在很清楚了。

标签: javascript jquery forms aweber


【解决方案1】:
  1. 绝对最好的解决方案是让您的表单请求在服务器上使用 CURL 或类似方法调用 weber

  2. 由于您不能 Ajax 到另一个域,如果您要在客户端上运行它,您需要更有创造力

所以在提交事件中我们

  1. 将目标更改为 hiddenframe2
  2. 提交 aweber 表单到 hiddenframe1
  3. 让主窗体提交到 hiddenframe2

现在您需要在主表单的 RESULT 中返回类似

<script>top.location.replace("thankyou.html");</script>

假设您的表单将请求发送到 html 来自的同一服务器

并且拥有

$('#redeemform').on("submit",function() {
  $(this).prop("target","hiddenframe2");

  if (!$("#hiddenframe1")) {
     $("<iframe/>",{"id":"hiddenframe","name":"hiddenframe1"})
      .css("display","none")
      .appendTo("body");
  }
  if (!$("#hiddenframe2")) {
    $("<iframe/>",{"id":"hiddenframe","name":"hiddenframe2"})
     .css("display","none")
     .appendTo("body");
  }
  var nameVal = $(this).find('input[name="custname"]').val();
  var emailVal = $(this).find('input[name="custemail"]').val();

  $("<form>",{"action":"http://www.aweber.com/scripts/addlead.pl",
              "target":"hiddenFrame1"})
    .append("<input/>",{meta_web_form_id:   '1234'})
    .append("<input/>",{meta_split_id:      ''})
    .append("<input/>",{listname:           'listname'})
    .append("<input/>",{redirect:           ''})
    .append("<input/>",{meta_adtracking:    'newsletter'})
    .append("<input/>",{meta_message:       '1'})
    .append("<input/>",{meta_required:      'name,email'})
    .append("<input/>",{meta_tooltip:       ''})
    .append("<input/>",{email:              emailVal})
    .append("<input/>",{name:               nameVal})
    .submit();
  });

如果您能够将 Ajax 转换为 aweber,您可能会这样做,但由于跨域脚本,您无法做到这一点。如果他们支持 JSONP/CORS,那么您无论如何都可以这样做

$('#redeemformButton').on("click",function() {
  var $form = $('#redeemform');
  var nameVal = $form.find('input[name="custname"]').val();
  var emailVal = $form.find('input[name="custemail"]').val();

  $.post('http://www.aweber.com/scripts/addlead.pl', {
    meta_web_form_id:   '1234',
    meta_split_id:      '',
    listname:           'listname',
    redirect:           '',
    meta_adtracking:    'newsletter',
    meta_message:       '1',
    meta_required:      'name,email',
    meta_tooltip:       '',
    email:              emailVal,
    name:               nameVal
  },function() {
     $form.submit();
  });
});

并且有一个

<input type="button" id="redeemformButton" value="Sign up and submit" />

【讨论】:

  • 看起来脚本在 $form.submit(); 之前停止- 它确实将用户注册到 aweber - 但不会提交表单。
  • 真的很感谢您创建此解决方案所花费的时间 - 我需要一些时间来分析它,摆弄它并充分利用它。这样做的想法可能不会在我脑海中闪过。
  • 不客气。正如我所建议的,最好的解决方案是从您的服务器调用 aweber
猜你喜欢
  • 2020-08-24
  • 2018-09-12
  • 2021-09-30
  • 2016-05-15
相关资源
最近更新 更多