【问题标题】:How to reload current page without losing any form data?如何在不丢失任何表单数据的情况下重新加载当前页面?
【发布时间】:2013-07-11 10:51:48
【问题描述】:

我可以在不丢失任何表单数据的情况下重新加载当前页面吗?我用过。。

window.location = window.location.href;

window.location.reload(true);

但这两个东西无法为我获取更早的表单数据。怎么了 ?手动刷新浏览器时,很好(我不会丢失任何表单数据)。请指导我如何弄清楚。

这是我的完整代码...

<div class="form-actions">
        <form>
            <table cellpadding = "5" cellspacing ="10">
                <tr class="control-group">
                    <td style="width: 100px;">
                        <div>Name:&nbsp;<font color="red">(*)</font></div>
                    </td>
                    <td>
                        <input type="text" id="inputName" placeholder="Name" required>
                    </td>
                </tr>
                <tr class="control-group">
                    <td>
                        <div>Email:&nbsp;<font color="red">(*)</font></div>
                    </td>
                    <td>
                        <input class="span3" placeholder="user@gmail.com" id= "inputEmail" type="email" required>
                    </td>
                </tr>
                <tr class="control-group">
                    <td>
                        <div>Phone:&nbsp;</div>
                    </td>
                    <td>
                        <input type="text" id="inputPhone" placeholder="phone number">
                    </td>
                </tr>
                <tr class="control-group">
                    <td>
                        <div>Subject:&nbsp;<font color="red">(*)</font></div>
                    </td>
                    <td>
                        <input type="text" id="inputSubject" placeholder="Subject" required>
                    </td>
                </tr>
                <tr class="control-group">
                    <td colspan ="2">
                        <div>
                            <div>Detail:&nbsp;</div>
                            <div class="controls">
                                <textarea id="inputDetail"></textarea>
                            </div>
                    </td>
                </tr>
                <tr>
                    <td colspan="2">
                    <div>
                        <label style="font-weight: bold;" class="checkbox"> <input id="confirmCheck" value="" type="checkbox">
                                I Agree to the Personal information handling policy
                        </label>
                    </div>
                    <div id = "alert_placeholder"></div>
                        <div class="acceptment">
                            [Personal information handling policy]<br> <br>
                        </div>
                    </td>
                </tr>
                <tr>
                    <td colspan="2">
                        <div align="center">
                            <button id="btnConfirm" class="btn btn-primary">Confirm</button>
                            <input type="reset" style="width: 65px; height: 27px;" id="btnReset" class="btn">
                        </div>
                    </td>
                </tr>
            </table>
        </form>
    </div>

在我的 JS 文件中..

function bind() {
$('#btnConfirm').click(function(e) {
    if ($('#confirmCheck').is(":checked")) {
        getConfirmationForSendFAQ();
    }
    else {
        e.preventDefault();
        showalert("You should accept \"Personal Information Policy\" !", "alert-error");
    }
});};function getConfirmationForSendFAQ() {
    var name = $('#inputName').val();
    var email = $('#inputEmail').val();
    var phone = $('#inputPhone').val();
    var subject = $('#inputSubject').val();
    var detail = $('#inputDetail').val();

    $('.form-actions').empty();
    html = [];
    html.push("<table cellpadding ='8' class = 'submitInfo'");
    html.push("<tr>");
    html.push("<td class = 'title'>Name:</div>");
    html.push("<td class = 'value'>"+ name +"</td>");
    html.push("</tr>");

    html.push("<tr>");
    html.push("<td class = 'title'>Email Address:</div>");
    html.push("<td class = 'value'>"+ email +"</td>");
    html.push("</tr>");

    if (phone.trim().length > 0) {
        html.push("<tr>");
        html.push("<td class = 'title'>Phone No:</div>");
        html.push("<td class = 'value'>"+ phone +"</td>");
        html.push("</tr>");
    }

    html.push("<tr>");
    html.push("<td class = 'title'>Subject:</div>");
    html.push("<td class = 'value'>"+ subject +"</td>");
    html.push("</tr>");

    html.push("<tr>");
    html.push("<td class = 'title'>Detail Info:</div>");
    html.push("<td class = 'value'>"+ detail +"</td>");
    html.push("</tr>");

    html.push("<tr>");
    html.push("<td colspan='2'><div align = 'center'>");
    html.push("<button id='btnSend' class='btn btn-primary' style='width: 65px;'>Send</button>");
    html.push("<button id='btnReturn' class='btn btn-inverse' style='width: 65px; height: 27px; margin-left: 5px;'>Return</button>");
    html.push("</div></td></tr>");

    html.push("</table>");
    $('.form-actions').append(html.join(''));
    $('#btnReturn').click(function(e) {
        // HERE I WANT TO KNOW HOW TO DO.....
    });
    $('#btnSend').click(function(e) {
        alert("Doom");
    });}

【问题讨论】:

    标签: javascript jquery html jquery-ui


    【解决方案1】:

    您可以使用各种本地存储机制将这些数据存储在浏览器中,例如 Web Storage、IndexedDB、WebSQL(已弃用)和 File API(已弃用且仅在 Chrome 中可用)(以及带有 IE 的 UserData)。

    最简单和最广泛支持的是 WebStorage,您可以在其中拥有持久性存储 (localStorage) 或基于会话的 (sessionStorage),这些存储在您关闭浏览器之前一直在内存中。两者共享相同的 API。

    例如,当页面即将重新加载时,您可以(简化)执行以下操作:

    window.onbeforeunload = function() {
        localStorage.setItem("name", $('#inputName').val());
        localStorage.setItem("email", $('#inputEmail').val());
        localStorage.setItem("phone", $('#inputPhone').val());
        localStorage.setItem("subject", $('#inputSubject').val());
        localStorage.setItem("detail", $('#inputDetail').val());
        // ...
    }
    

    Web Storage 同步工作,所以这个可能在这里工作。或者,您可以将每个模糊事件的数据存储在输入数据的元素上。

    在页面加载时您可以检查:

    window.onload = function() {
    
        var name = localStorage.getItem("name");
        if (name !== null) $('#inputName').val("name");
    
        // ...
    }
    

    如果数据不存在,getItem 返回null

    如果您只想临时存储,请使用 sessionStorage 而不是 localStorage

    【讨论】:

    • @Cataclysm 如果打算返回到您可以使用 history.go(-1); 代替的表单?
    • @Ken - Abdias Software history.go(-1);或 history.back();这些将重定向上一页。不是以前的,我想重新加载当前页面,我已经和那个兄弟测试过了!谢谢...
    • 这对我有用,非常感谢。但我需要更正你的答案:1) localStorage.setItem('name', ... 2) if (name !== null) $('#inputName').val('name'); => 没有引号这个解决方案对我不起作用。我通过 WebStorage 的官方指南更正它。
    • 我不喜欢这个:你怎么知道什么时候清理存储?第一个想法是清除表单提交,但假设数据被提交到存储,然后用户决定他们不想提交此数据。现在他们永久卡在一个损坏的状态,直到他们的 localStorage 被清除(或表单提交)
    • 我有 100 个输入(同一页面上的 5 个表单)我们是否可以选择在不设置每个输入的情况下完成它@k3n
    【解决方案2】:

    我修改了 K3N 的代码以达到我的目的,并添加了一些 cmets 以帮助其他人了解 sessionStorage 的工作原理。

    <script>
        // Run on page load
        window.onload = function() {
    
            // If sessionStorage is storing default values (ex. name), exit the function and do not restore data
            if (sessionStorage.getItem('name') == "name") {
                return;
            }
    
            // If values are not blank, restore them to the fields
            var name = sessionStorage.getItem('name');
            if (name !== null) $('#inputName').val(name);
    
            var email = sessionStorage.getItem('email');
            if (email !== null) $('#inputEmail').val(email);
    
            var subject= sessionStorage.getItem('subject');
            if (subject!== null) $('#inputSubject').val(subject);
    
            var message= sessionStorage.getItem('message');
            if (message!== null) $('#inputMessage').val(message);
        }
    
        // Before refreshing the page, save the form data to sessionStorage
        window.onbeforeunload = function() {
            sessionStorage.setItem("name", $('#inputName').val());
            sessionStorage.setItem("email", $('#inputEmail').val());
            sessionStorage.setItem("subject", $('#inputSubject').val());
            sessionStorage.setItem("message", $('#inputMessage').val());
        }
    </script>
    

    【讨论】:

    • 好主意! 注意 sessionStorage 会在会话结束时被清除,而 localStorage 会无限期地保留。考虑数据隐私时需要考虑的事项。
    【解决方案3】:

    在 GitHub 上找到这个。专门为它打造的。

    https://gist.github.com/zaus/4717416

    【讨论】:

    • 谢谢!不要重新发明轮子! :-)
    【解决方案4】:

    这个答案对我非常有帮助,并且省去了手动遍历每个字段的麻烦:

    Using jQuery to store the state of a complicated form

    【讨论】:

      【解决方案5】:
      window.location.reload() // without passing true as argument
      

      为我工作。

      【讨论】:

      • 对于 IE,这不会保留页面的字段值。由于我现在遇到这个问题,我正在研究Julian K's link,它看起来很有希望保存这些值,刷新然后恢复它们。本地存储解决方案也可以工作,尽管出于数据隐私原因,一些公司政策禁止使用它。
      • 在 Chrome 上像魅力一样工作
      【解决方案6】:

      正如一些答案所提到的,localStorage 是一个不错的选择,您当然可以自己做,但如果您正在寻找一个完美的选择,GitHub 上已经有一个名为 garlic.js 的项目可以做到这一点。

      【讨论】:

        【解决方案7】:

        我通常会自动将我自己的表单提交到服务器并重新加载带有填充参数的页面。将占位符参数替换为您的服务器收到的参数。

        【讨论】:

          【解决方案8】:

          同意 HTML5 LocaStorage。 This is example code

          【讨论】:

          • 哇!伟大的。感谢您为本地存储提供示例指导。但我更喜欢 sessionStorage。
          【解决方案9】:

          您必须提交数据并重新加载页面(带有数据的服务器端呈现表单),仅重新加载不会保留数据。只是您的浏览器可能会在手动刷新时缓存表单数据(跨浏览器不一样)。

          【讨论】:

            【解决方案10】:

            您可以在刷新页面之前使用 localStorage (http://www.w3schools.com/html/html5_webstorage.asp) 保存值。

            【讨论】:

              【解决方案11】:

              您可以使用我编写的库FormPersistence.js,它通过将值保存到本地/会话存储来处理表单(反)序列化。这种方法类似于that linked in another answer,但它不需要jQuery,也不会将明文密码保存到网络存储中。

              let myForm = document.getElementById('my-form')
              FormPersistence.persist(myForm, true)
              

              每个FormPersistence 函数的可选第二个参数定义是使用本地存储(false)还是会话存储(true)。在您的情况下,会话存储可能更合适。

              默认情况下,表单数据在提交时会从存储中清除,除非您将false 作为第三个参数传递。如果您有特殊的值处理功能(例如插入元素),那么您可以将它们作为第四个参数传递。有关完整文档,请参阅存储库。

              【讨论】:

                【解决方案12】:

                针对所有输入(文本类型)字段的简单通用(无 jquery)解决方案,无需本地存储。

                function save_data(){
                    let fields = document.querySelectorAll("input[type='text']")
                    let saved_fields = []
                    fields.forEach(x => {
                        saved_fields.push({
                            key: x.id,
                            value: x.value
                        })
                    })
                    localStorage.setItem("saved_data", JSON.stringify(saved_fields))
                 }
                
                 function show_saved_data(){
                     JSON.parse(localStorage.getItem("saved_data")).forEach(x => {
                         document.getElementById(x.key).value = x.value
                     })
                 }
                

                如果您想包含“选择/复选框”字段等,则必须在 for 循环中添加一些 if else 逻辑并更改查询......

                【讨论】:

                  【解决方案13】:

                  使用 $_POST 本身:

                  <?php           
                  isset($_POST['value']) ? $value= $_POST['value'] : $value= NULL;
                  echo '<form method="POST">';
                  echo '<input type="text" name="value" value="'.$value.'"/>';
                  echo '<input type="submit" name="submit" value="Submit"/>';
                  echo '</form>';
                  ?>
                  

                  【讨论】:

                    【解决方案14】:

                    keyup事件注册一个事件监听器:

                    document.getElementById("input").addEventListener("keyup", function(e){
                      var someVarName = input.value;
                      sessionStorage.setItem("someVarKey", someVarName);
                      input.value = sessionStorage.getItem("someVarKey");
                    });
                    

                    【讨论】:

                      猜你喜欢
                      • 2021-09-03
                      • 2018-07-15
                      • 2022-12-23
                      • 1970-01-01
                      • 1970-01-01
                      • 2017-06-27
                      • 2016-12-26
                      • 2012-02-05
                      • 1970-01-01
                      相关资源
                      最近更新 更多