【问题标题】:form onsubmit="return function()" but form still submitting and page reloading表单 onsubmit="return function()" 但表单仍在提交和页面重新加载
【发布时间】:2018-11-20 06:58:29
【问题描述】:

我希望表单不提交并重新加载页面。相反,我希望它运行 runTest() 函数。

我尝试了以下方法:

<form id="dataForm" onsubmit="return runTest()">
    <input type="text" id="text" placeholder="enter some text" required maxlength="10" pattern="^[a-z,A-Z]{1,10}$"><br />
    <input type="text" id="number" placeholder="enter a number" required maxlength="10" pattern="\d{10}"><br />
    <input type="submit" id="submitTest">
</form>
<script src="../test/test2.js"></script>

../test/test2.js:

function runTest() {...}

但是,表单提交和页面重新加载,runTest() 没有运行。

帮助表示赞赏。

this answer,我将runTest() 函数更改为:

function runTest() {

    var validate = true;
    describe("Simple assert", function() {
        it("foo != bar", function() {
            assert('foo' != 'bar', 'foo is not bar');
        });
        it('should return true if field is valid', function(){
            var isValidText = isValidField('text');
            var isValidNumber = isValidField('number');
            assert.equal(isValidText, true);
            assert.equal(isValidNumber, true);
        });
        validate = false;
    });
    return validate;
} 

runTest() 已被浏览器识别为test2.js

但是,表单仍然提交,页面重新加载,runTest() 没有运行。

【问题讨论】:

    标签: javascript forms


    【解决方案1】:

    在你的 html 中传递事件。

    onsubmit="return runTest(event)"
    

    然后在你的函数中调用 preventDefault 并在最后返回 false。

    function runTest(e) {
       e.preventDefault();
       .
       .
       .
       return false;
    }
    

    【讨论】:

    • 谢谢。试过了,表单仍然提交/页面重新加载。
    • @Steve 也 return false 在函数结束时。
    • 也试过了,同样的事情发生了。 :)
    【解决方案2】:

    将该按钮的类型更改为button 而不是submit,然后像这样使用JavaScript 提交您的表单

    document.getElementById("dataForm").submit(); 
    

    并从您的 onclick 属性中删除返回部分。

    【讨论】:

    • 我试过了。我最终得到this code,但浏览器陷入了循环。
    • 你是直接包含这个语句 document.getElementById("dataForm").submit();内部脚本元素,因此当页面加载您的表单时会自动提交。
    • 正确的问题是何时调用该方法,简单的答案是,当您想提交表单时,如果您想在 runTest 函数完成后提交表单,那么您应该在runTest 函数结束。
    • 好的。当我将 this 放在 runTest 的末尾时,我在代码编辑器中看到了 this
    【解决方案3】:

    您可以使用 Javascript 使用 addEventListener 函数以编程方式处理表单的提交事件,如下所示:

    document.getElementById("dataForm").addEventListener("submit", function(e){
      e.preventDefault() //to block page reload
      var validate = true;
      describe("Simple assert", function() {
          it("foo != bar", function() {
              assert('foo' != 'bar', 'foo is not bar');
          });
          it('should return true if field is valid', function(){
              var isValidText = isValidField('text');
              var isValidNumber = isValidField('number');
              assert.equal(isValidText, true);
              assert.equal(isValidNumber, true);
          });
          validate = false;
      });
      return validate;
    })
    <form id="dataForm">
        <input type="text" id="text" placeholder="enter some text" required maxlength="10" pattern="^[a-z,A-Z]{1,10}$"><br />
        <input type="text" id="number" placeholder="enter a number" required maxlength="10" pattern="\d{10}"><br />
        <input type="submit" id="submitTest">
    </form>

    【讨论】:

    • 我无法将runTest() 带入.html 文件,因为它是外部文件中的打字稿,已被浏览器转换为javascript 文件。
    • 我从来没有要求你把脚本放在你的.html ;).... 通常它应该在你的浏览器文件中工作
    • 好的。那么document.getElementById("dataForm").addEventListener("submit", function(e) 会进入runTest 吗?因为您答案中的其余代码是。 :)
    • No.. 而不是在提交表单时调用runTest,我使用javascript处理提交事件;所以我用document.getElementById(... 替换了runTest 声明......我认为这样更专业
    • 好的。我们正在取得进展。表单不提交,页面现在不重新加载。我需要弄清楚为什么断言现在没有运行。感谢您的帮助。
    【解决方案4】:

    请尝试以下代码,

    使用e.preventDefault(); 不要将响应作为可验证的内容发送 使用return false; 而不是return validate;

    function runTest() {
        e.preventDefault();
            describe("Simple assert", function() {
                it("foo != bar", function() {
                    assert('foo' != 'bar', 'foo is not bar');
                });
                it('should return true if field is valid', function(){
                    var isValidText = isValidField('text');
                    var isValidNumber = isValidField('number');
                    assert.equal(isValidText, true);
                    assert.equal(isValidNumber, true);
                });
               return false;
            });
    
        } 
    

     function runTest() {
    
            var validate = 'true';
            describe("Simple assert", function() {
                it("foo != bar", function() {
                    assert('foo' != 'bar', 'foo is not bar');
                });
                it('should return true if field is valid', function(){
                    var isValidText = isValidField('text');
                    var isValidNumber = isValidField('number');
                    assert.equal(isValidText, true);
                    assert.equal(isValidNumber, true);
                });
                validate = 'false';
            });
    alert(validate)
            if(validate=='false'){
                 return false;
            }
        }
    

    【讨论】:

    • 请尝试我的第二个答案,我添加了一个代码来提醒变量验证的值。这样您就可以轻松检查
    • @Steve :那么上面的代码有错误。请在函数顶部添加一个 alert()。并检查您的脚本路径是否正确
    • 我在 runTest() 中添加了一个警报,但它不会触发。 I have the path correct I believe.
    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 2013-11-19
    • 2012-04-12
    • 2021-11-12
    相关资源
    最近更新 更多