You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按钮事件从mouseover改click后无法POST JSON数据问题排查

问题现象

为按钮绑定mouseover事件时脚本可正常运行,将事件修改为click后脚本失效,无法向JSON存储服务POST提交任何JSON数据。

关联JS代码

<script>
const button = document.getElementById("search-image")
const s = document.getElementById("s")
function SendData(){

   var xhr = new XMLHttpRequest();
   var url = "https://krat.es/xxxxx";
   xhr.open("POST", url, true);
   xhr.setRequestHeader("Content-Type", "application/json");

   xhr.onreadystatechange = function () {

       if (xhr.readyState === 4 && xhr.status === 200) {

           var json = JSON.parse(xhr.responseText);

       }
   };

   var data = JSON.stringify({"Text": s.value});
   console.log(data)
   xhr.send(data);
}
button.addEventListener("mouseover",SendData)
</script>

关联页面HTML代码

<form _lpchecked="1" action="/search" class="search-form" id="searchform" method="get">
<fieldset>
<input id="s" name="q" onfocus="if(this.value=='Search')this.value='';" onwebkitspeechchange="transcribe(this.value)" type="text" value="Search" x-webkit-speech="">
<button class="sbutton" id="search-image" style="border:0; vertical-align: top;background: transparent;"><i class="fa fa-search"></i></button>
</fieldset>
</form>
故障原因

位于<form>标签内的<button>如果没有显式指定type属性,默认type值为submit。

  • 绑定mouseover事件时,鼠标悬浮只会触发绑定的自定义逻辑,不会触发按钮的默认表单提交行为,异步XHR请求可以正常发送完成,因此功能正常。
  • 绑定click事件时,点击按钮会先执行SendData方法发起POST请求,但紧接着会触发按钮默认的表单提交行为,页面会直接跳转到表单的action地址/search,异步请求还未完成发送就被浏览器因页面卸载取消,因此服务端收不到任何POST数据。
修复方案

二选一即可:

  • 方案1:给按钮显式添加type="button"属性,让按钮不再触发表单提交的默认行为:
<button type="button" class="sbutton" id="search-image" style="border:0; vertical-align: top;background: transparent;"><i class="fa fa-search"></i></button>
  • 方案2:在点击事件的处理函数中调用方法阻止默认行为:
function SendData(e){
   // 阻止默认表单提交跳转
   e.preventDefault();

   var xhr = new XMLHttpRequest();
   var url = "https://krat.es/xxxxx";
   xhr.open("POST", url, true);
   xhr.setRequestHeader("Content-Type", "application/json");

   xhr.onreadystatechange = function () {
       if (xhr.readyState === 4 && xhr.status === 200) {
           var json = JSON.parse(xhr.responseText);
       }
   };

   var data = JSON.stringify({"Text": s.value});
   console.log(data)
   xhr.send(data);
}
button.addEventListener("click",SendData)

内容的提问来源于stack exchange,提问作者mahmoudi hocine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:09:26