【问题标题】:Modal ajax form stuck on success message when refired重新触发时,模态 ajax 表单卡在成功消息上
【发布时间】:2018-12-12 07:29:43
【问题描述】:

我有一个大约有 20 个查询按钮的页面。每个按钮都会触发相同的模态 ajax PHP 表单。表单系统正常工作,发送电子邮件并触发成功消息。成功消息显示在表单标签内,但表单的其余部分消失了,只剩下

标签。

成功消息有一个关闭按钮,用于关闭模式,但问题是当我点击页面上的任何其他查询按钮时,它们会触发模式但它仍然停留在成功消息上。

有没有办法使用模态关闭按钮作为一种清除表单触发器?

这是我正在使用的 ajax 脚本……

<script>
    function _(id){ return document.getElementById(id); }
    function submitForm() {
        _("sendenquiry").disabled = true;
        _("status").innerHTML = 'please wait…';
        var formdata = new FormData();
        formdata.append( "n", _("n").value );
        formdata.append( "e", _("e").value );
        formdata.append( "m", _("m").value );
        var ajax = new XMLHttpRequest();
        ajax.open( "POST", "enquire.php" );
        ajax.onreadystatechange = function() {
            if(ajax.readyState == 4 && ajax.status == 200) {
                if(ajax.responseText == "success"){
                    _("enquiry_form").innerHTML = '<p>Thanks '+_("n").value+', we will be in touch shortly.</p>'; 
                } else {
                    _("status").innerHTML = ajax.responseText;
                    _("sendenquiry").disabled = false;
                }
            }
        }
        ajax.send( formdata );
    }
</script> 

这是我的html

<!--enquiry modal--> 
            <div class="enquire-form-modal ef-effect" id="efmodal">
                <div class="ef-content">
                    <div>
                            <form class="enquire-message" id="enquiry_form" onsubmit="submitForm(); return false;">
                                <fieldset>
                                    <legend>Please fill out your enquiry below and we'll quickly get back to you.</legend>

                                        <div class="">
                                            <label class="" for="">Name</label>
                                            <span><input type="text" id="n" class="" name="" placeholder="My name" required></span>
                                        </div> 

                                                <div class="">
                                                    <label class="" for="">Email</label>
                                                    <span><input type="email" id="e" class="" name="email" placeholder="My email" required></span>
                                                </div> 


                                                <div class="">
                                                    <label class="" for="">Enquiry</label>
                                                    <span><textarea id="m" class="" name="" placeholder="My enquiry" required></textarea></span>
                                                </div>

                                        <div>
                                            <input id="sendenquiry" type="submit" value="SEND"> <span id="status"></span>
                                        </div>
                                </fieldset>
                            </form>
                        <button class="ef-close">Close</button>
                    </div>
                </div>
            </div>  
            <div class="enquire-form-overlay"></div>        
<!--enquiry modal end-->

任何帮助将不胜感激。我尝试了各种方法,但还没有任何效果。如果您需要更多代码,请告诉我。 提前致谢

【问题讨论】:

  • 当他们点击另一个按钮时,您期望发生什么?
  • 我希望我可以允许用户从同一页面发送多个不同的表单查询。那个 UX 意味着我需要弄清楚如何在之前的表单成功消息之后呈现一个新的模态表单。希望这是有道理的。我的想法是使用关闭成功按钮 以某种方式清除敌人会很棒,但我知道该按钮位于表单标签之外。
  • 通过将表单的内容替换为您丢失表单的消息。如果您的页面上有一堆表单,并且它们有不同的 ID,那么只要将 ID 传递给 submitForm() 函数,您就可以按照现在的方式进行操作。如果您使用的是一种形式,那么您应该使用一个消息框或覆盖来通知用户该消息。
  • 谢谢格拉斯先生。我没有考虑多表单选项,因为一个页面上有 20 个表单似乎有点笨重。我更喜欢使用一种形式的模态方法,但前提是它可以做到。成功消息仍在表单标签内,但显然字段等不再存在,以便为消息腾出空间。刷新页面时,表单再次可用,因此可能必须通过某种方式使用 ajax 或 jQuery 来实现。我在这里做了一个表格,但没有 Ajax 和成功消息 - jsfiddle.net/dommcloughlin/56vyp2cf/23 谢谢!

标签: php ajax forms


【解决方案1】:

问题在于,当 ajax 调用完成时,您要替换所有表单的 html。尝试使用“状态” div 来容纳成功消息。然后,也许一个简单的setTimeout 就足以清除消息。

<script>
    function _(id){ return document.getElementById(id); }
    function submitForm() {
        _("sendenquiry").disabled = true;
        _("status").innerHTML = 'please wait…';
        var formdata = new FormData();
        formdata.append( "n", _("n").value );
        formdata.append( "e", _("e").value );
        formdata.append( "m", _("m").value );
        var ajax = new XMLHttpRequest();
        ajax.open( "POST", "enquire.php" );
        ajax.onreadystatechange = function() {
            if(ajax.readyState == 4 && ajax.status == 200) {
                if(ajax.responseText == "success"){
                    _("status").innerHTML = '<p>Thanks '+_("n").value+', we will be in touch shortly.</p>'; 
                } else {
                    _("status").innerHTML = ajax.responseText;
                }

                // clear the "status" message after 5 seconds
                setTimeout(function() {
                    _("status").innerHTML = "";
                }, 5000);
                _("sendenquiry").disabled = false;
            }
        }
        ajax.send( formdata );
    }
</script> 

【讨论】:

  • 感谢您的宝贵时间杰森。我按原样进行了测试,表格挂在“请稍候”上。然后我在您的状态中添加了一些

    标签和一条消息,单击发送后表单消失,但没有出现成功消息或发送电子邮件。

  • 很遗憾,我无法为您提供更多帮助。代码对我来说看起来不错。确保“enquire.php”中没有错误,并且它返回了正确的状态代码。我建议为此使用 Chrome 开发工具。 developers.google.com/web/tools/chrome-devtools
  • 感谢 Jason,感谢您的宝贵时间!
猜你喜欢
  • 2014-12-18
  • 2022-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多