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

bee*_*imi 7 javascript ajax mailchimp

我一直在尝试使用 AJAX 提交嵌入式 Mailchimp 表单,但不使用 jQuery。显然,我没有正确地做这件事,因为我一直在结束“来吧,华生,来吧!游戏正在进行中。” 页 :(

任何帮助,这将是极大的赞赏。

form action已经改变,以取代post?u=post-json?u=&c=?已添加到操作字符串的结尾。这是我的js:

document.addEventListener('DOMContentLoaded', function() {

    function formMailchimp() {

        var elForm         = document.getElementById('mc-embedded-subscribe-form'),
            elInputName    = document.getElementById('mce-NAME'),
            elInputEmail   = document.getElementById('mce-EMAIL'),
            strFormAction  = elForm.getAttribute('action');

        elForm.addEventListener('submit', function(e) {

            var request = new XMLHttpRequest();

            request.open('GET', strFormAction, true);
            request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');

            request.onload = function() {

                if (request.status >= 200 && request.status < 400) {

                    // Success!
                    var resp = JSON.parse(request.responseText);

                    request.send(resp);

                } else {

                    console.log('We reached our target server, but it returned an error');

                }

            };

            request.onerror = function() {
                console.log('There was a connection error of some sort');
            };

        });

    }

    formMailchimp();

});
Run Code Online (Sandbox Code Playgroud)

此外,我预计不可避免的“你为什么不使用 jQuery”评论。无需深入研究该项目的具体细节,我无法将 jQuery 引入代码中。对不起,但这必须是普通的 javascript。兼容性仅适用于非常现代的浏览器。

非常感谢您提供的任何帮助!

Han*_*zli 5

几天前,我遇到了完全相同的问题,结果证明有关本机JavaScriptMailChimp文档非常稀少。我可以与您分享我想出的代码。希望你能从这里建造!

简化的 HTML 表单:我从 MailChimp 表单构建器中获得了 from 操作并添加了“post-json”

<div id="newsletter">
    <form action="NAME.us1.list-manage.com/subscribe/post-json?u=XXXXXX&amp;id=XXXXXXX">
        <input class="email" type="email" value="Enter your email" required />
        <input class="submit" type="submit" value="Subscribe" />
    </form>
</div>
Run Code Online (Sandbox Code Playgroud)

JavaScript:避免跨域问题的唯一方法是创建一个脚本并将其附加到标题中。然后回调发生在“c”参数上。(请注意,目前还没有电子邮件地址验证)

function newsletterSubmitted(event) {
    event.preventDefault();

    this._form = this.querySelector("form");
    this._action = this._form.getAttribute("action");
    this._input = this._form.querySelector("input.email").value;

    document.MC_callback = function(response) {

        if(response.result == "success") {
            // show success meassage

        } else {
            // show error message

        }
    }

    // generate script
    this._script = document.createElement("script");
    this._script.type = "text/javascript";
    this._script.src = this._action + "&c=document.MC_callback&EMAIL=" + this._input;

    // append script to head    
    document.getElementsByTagName("head")[0].appendChild(this._script);
}

var newsletter = document.querySelector("#newsletter")
newsletter.addEventListener("submit", newsletterSubmitted);
Run Code Online (Sandbox Code Playgroud)