Mailchimp 通过 jQuery Ajax。正确提交,但 JSON 响应作为单独的页面返回

Posted

技术标签:

【中文标题】Mailchimp 通过 jQuery Ajax。正确提交,但 JSON 响应作为单独的页面返回【英文标题】:Mailchimp via jQuery Ajax. Submits correctly but JSON response is returned as a separate page 【发布时间】:2018-01-10 11:25:21 【问题描述】:

我有以下表格:

<form class="footer-newsletter-form" id="footer-newsletter" method="post" action="http://xxxxxx.us1.list-manage.com/subscribe/post-json?u=xxxxxxxxxxxxxxxxxxxxxxxxx&id=xxxxxxxxxx&c=?">
    <input id="email" name="EMAIL" type="email" class="input-text required-entry validate-email footer__newsletter-field" value="% if customer % customer.email % endif %" placeholder=" 'general.newsletter_form.email_placeholder' | t " aria-label=" 'general.newsletter_form.newsletter_email' | t ">
    <button type="submit" title="Subscribe" class="button button1 hover-white footer__newsletter-button">SUBSCRIBE</button>
    <div id="subscribe-result"></div>
</form>

还有下面的jquery位:

<script type="text/javascript">
$(document).ready(function () 
    function register($form) 
    jQuery.ajax(
        type: "GET",
        url: $form.attr('action'),
        data: $form.serialize(),
        cache       : false,
        dataType    : 'jsonp',
        contentType: "application/json; charset=utf-8",
        error       : function(err)  console.log('error') ,
        success     : function(data) 
        if (data.result != "success") 
            console.log('success');
         else 
            console.log('not success');
            //formSuccess();
        
        
    );
    

    jQuery(document).on('submit', '.footer-newsletter-form', function(event) 
        try 
            var $form = jQuery(this);
            event.preventDefault();
            register($form);
         catch(error)
    );
);
</script>

正确提交。但是,当我按下提交按钮时,我期望发生的是页面没有刷新,当我检查浏览器控制台时,我会看到“成功”或“不成功”。相反,我被发送到显示以下 JSON 消息的页面:?("result":"success","msg":"Almost finished... We need to confirm your email address. To complete the subscription process, please click the link in the email we just sent you.")

那么,我如何获取成功消息(如果出现错误则为错误)并让页面不仅保持原样,而且还捕获成功消息,以便显示“成功”警报?成功警报我知道该怎么做。我只需要帮助让浏览器保持原位并分辨成功与错误之间的区别。

附:我不确定这是否相关,但平台是 Shopify。我认为 Shopify 没有采取任何措施来阻止提交按应有的方式通过或响应返回,因此我认为这无关紧要。

【问题讨论】:

查看你的数据类型 dataType : 'jsonp', to dataType : 'json', 在上面添加这一行 try in sumit event.preventDefault(); @Shibon 这些都不起作用。 【参考方案1】:

整个问题是$(document).ready(function () ); 部分。由于某种我不知道的原因导致 event.preventDefault();方法从运行和表单定期提交。如果您删除 $(document).ready(function () ); 部分,它将按预期工作。

我的最终代码供任何展望未来的人使用:

表格:

<form class="footer-newsletter-form" method="POST" id="footer-newsletter" action="https://xxxxxxxxxxxxx.us1.list-manage.com/subscribe/post-json?c=?">
   <input type="hidden" name="u" value="xxxxxxxxxxxxxxxxxxxxxxxxxxx">
   <input type="hidden" name="id" value="xxxxxxxxxx">
   <input id="email" name="EMAIL" type="email" class="input-text required-entry validate-email footer__newsletter-field">
   <button type="submit" title="Subscribe" class="button button1 hover-white footer__newsletter-button">SUBSCRIBE</button>
   <div id="subscribe-result"></div>
</form>

还有 JS:

<script>
    function register($form) 
      $.ajax(
        type: "GET",
        url: $form.attr('action'),
        data: $form.serialize(),
        cache: false,
        dataType: 'json',
        contentType: "application/json; charset=utf-8",
        error: function (err) 
          console.log('error')
        ,
        success: function (data) 
          if (data.result != "success") 
            console.log('Error: ' + data.msg);
           else 
            console.log("Success");
             $($form).find("div#subscribe-result").html("<p class='success-message'>Almost finished... We need to confirm your email address. To complete the subscription process, please click the link in the email we just sent you!</p>"); 
             setTimeout(function()   $($form).find("div#subscribe-result").hide(); , 7000);
          
        
      );
    

    $(document).on('submit', '#footer-newsletter', function (event) 
      try 
        var $form = jQuery(this);
        event.preventDefault();
        register($form);
       catch (error) 
    );
</script>

【讨论】:

以上是关于Mailchimp 通过 jQuery Ajax。正确提交,但 JSON 响应作为单独的页面返回的主要内容,如果未能解决你的问题,请参考以下文章

Mailchimp 使用 jQuery AJAX 订阅?

使用 Javascript AJAX(不是 jQuery)提交嵌入式 Mailchimp 表单

javascript 带有jQuery错误处理的Mailchimp Ajax表单

使用 Api v3.0 和 jQuery Ajax 方法的 Mailchimp 连接错误 (401)

Mailchimp API V3 jQuery Ajax POST 订阅者

Mailchimp API V3 jQuery Ajax POST 订阅者