【问题标题】:Neither .preventDefault() or .stopPropagation() will stop my page from reloading when I click my submit button当我单击提交按钮时,.preventDefault() 或 .stopPropagation() 都不会阻止我的页面重新加载
【发布时间】:2018-04-17 16:28:29
【问题描述】:

我有一个搜索框和一个搜索按钮。我可以点击搜索按钮并弹出结果,没问题,工作正常。我还想通过按 Enter 来添加搜索功能,所以我添加了一些代码来监听按键,并在按键释放时单击我的按钮。但是,这会导致表单被提交并重新加载没有数据的页面。我尝试将 preventDefault() 和 stopPropagation() 添加到事件侦听器中,但无论如何,当我按 Enter 时,表单会被提交。它会在一瞬间显示正确的信息,但随后会立即重新加载页面。

这是 HTML:

<script defer src="https://use.fontawesome.com/releases/v5.0.10/js/all.js" integrity="sha384-slN8GvtUJGnv6ca26v8EzVaR9DC58QEwsIk9q1QXdCU8Yu8ck/tL/5szYlBbqmS+" crossorigin="anonymous"></script>

<div class="container-fluid">
  <div class="row search-box" id="firstRow">
    <div class='col-10 search-head-two'>
      <form class="form">
        <input type="text" class="search-input" id="term">
      </form>
    </div>
    <div class='col-2 search-head-one'>
      <button id="search"><i class="fa fa-search"></i></button>
    </div>
    </div>
  </div>
</div>

这里是 Javascript:

var content = [];

document.getElementById("term")
  .addEventListener("keyup", function(event) {
  event.stopPropagation();
  event.preventDefault();
  if (event.keyCode === 13) {
    document.getElementById("search").click();
  }
});

document.getElementById("search").onclick = function() {getData()};

function getData() {
  var domain = "https://en.wikipedia.org/w/api.php?&origin=*&action=opensearch&search=" + encodeURI(document.getElementById('term').value) + "&limit=10";
  fetch(domain).then(function(resp) {
    return resp.json()
}).then(function(data) {
    for (var i = 1; i < data.length; i++) {
      content.push(data[i]);
    }
    var content1 = content[0];
    var content2 = content[1];
    var content3 = content[2];
    for (var x = 0; x < content[0].length; x++) {
      addRow(content1, content2, content3, x);
    }
    console.log(content[0]);
    console.log(content[1]);
    console.log(content[2]);
  });
}

function addRow(content1, content2, content3, x) {
  var div = document.createElement('div');

  div.className = 'row';
  div.innerHTML = '<div class="col-3" id="title">\
                   <p>' + content1[x] + '</p>\
                   </div>\
                   <div class="col-9" id="content">\
                   <p>' + content2[x] + '</br></br><a target="_blank" href="' + content3[x] + '">' + content3[x] + '</a></p>\
                   </div>';
  document.getElementById('firstRow').appendChild(div);
}

另外需要注意的是,我使用 Bootstrap 4、Jquery 和 Jquery UI 作为外部脚本。我在 CodePen.io 中运行它。

【问题讨论】:

  • 我什至不知道当你可以调用相同的函数时你为什么要点击按钮。但请记住,其他侦听器(如默认侦听器)可能不在 keyup 上,而是在 keydown 或 keypress 上。
  • 好的,那么我可以在脚本的主体中做什么来说明“永远不要为此输入字段提交默认设置”?
  • 没关系,我只是将其切换为 keydown,并将 preventDefault 移至 if 子句,现在效果很好!谢谢
  • 您也可以附加到表单提交。

标签: javascript html addeventlistener preventdefault


【解决方案1】:

我将 event.preventDefault() 移到 if 子句中,并将 eventListener 从 keyup 更改为 keydown,因为表单是在 keydown 而不是 keyup 上提交的。现在它就像一个魅力。

document.getElementById("term")
  .addEventListener("keydown", function(event) {
  if (event.keyCode === 13) {
    event.preventDefault();
    document.getElementById("search").click();
  }
});

【讨论】:

    【解决方案2】:

    检查this

    preventDefault() 上的一些有用的 MDN 信息 此外,您不能从 Ajax 请求中获得任何回报。

    【讨论】:

    • 欢迎来到 Stack Overflow。请阅读How to Answer鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及它为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
    猜你喜欢
    • 2021-04-16
    • 2019-06-24
    • 2016-10-26
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2021-03-01
    • 2013-08-18
    相关资源
    最近更新 更多