提交表单并停留在同一页面上?

IT技术 javascript html perl
2021-01-13 13:45:15

我有一个看起来像这样的表格

<form action="receiver.pl" method="post">
  <input name="signed" type="checkbox">
  <input value="Save" type="submit">
</form>

我想留在同一页面上,当点击提交时,但仍然receiver.pl执行。

那应该怎么做?

5个回答

99% 的时间我会使用XMLHttpRequestfetch 来做这样的事情。但是,有一个不需要 javascript 的替代解决方案......

您可以在页面上包含一个隐藏的 iframe,并将表单的 target 属性设置为指向该 iframe。

<style>
  .hide { position:absolute; top:-1px; left:-1px; width:1px; height:1px; }
</style>

<iframe name="hiddenFrame" class="hide"></iframe>

<form action="receiver.pl" method="post" target="hiddenFrame">
  <input name="signed" type="checkbox">
  <input value="Save" type="submit">
</form>

很少有场景我会选择这条路线。通常使用 javascript 处理它会更好,因为使用 javascript 你可以......

  • 优雅地处理错误(例如重试)
  • 提供 UI 指标(例如加载、处理、成功、失败)
  • 在发送请求之前运行逻辑,或者在收到响应之后运行逻辑。
我也遇到了类似的情况,并尝试了@jessegavin 的建议。但是在提交时,perl cgi 不会获取表单元素。有什么建议?
2021-03-13 13:45:15
Btwn - 字段/表单元素由 jQuery datepicker 填充
2021-03-22 13:45:15
这实际上可能是这里最好的答案......你不必使用 Jquery、Ajax 等
2021-03-23 13:45:15
我喜欢这个,因为它最简单,不需要额外的库,只使用 html。我正是我要找的人。
2021-04-07 13:45:15
没有说这是最好的答案。只是另一种选择。;)
2021-04-08 13:45:15

最简单的答案:jQuery。做这样的事情:

$(document).ready(function(){
   var $form = $('form');
   $form.submit(function(){
      $.post($(this).attr('action'), $(this).serialize(), function(response){
            // do something here on success
      },'json');
      return false;
   });
});

如果您想动态添加内容并且仍然需要它工作,并且还需要多个表单,您可以这样做:

   $('form').live('submit', function(){
      $.post($(this).attr('action'), $(this).serialize(), function(response){
            // do something here on success
      },'json');
      return false;
   });
我一定是做错了什么,因为它仍然更改页面,receiver.pl我已将您的代码添加到标题部分,并包含<script src="http://code.jquery.com/jquery-1.5.js"></script>. 我是否需要进行其他更改?
2021-03-30 13:45:15
这看起来很有趣!我如何告诉它执行receiver.pl脚本?
2021-04-02 13:45:15
@Kvvaradha 不,要处理文件上传,您需要使用 jquery 的data参数将其显式发送$.ajax函数,new FormData($(this)[0]);并添加enctype="multipart/form-data"到表单中。看到这个答案:stackoverflow.com/a/10899796/445210
2021-04-03 13:45:15
顺便提一句。我找到了这个页面,askaboutphp.com/213/...,但我不太明白。
2021-04-08 13:45:15
它说'$form.attr('action')' 的部分就是这样做的——它告诉jQuery 的提交函数调用由表单('receiver.pl') 指定的动作,而不离开页面,即使用AJAX。
2021-04-10 13:45:15

执行此操作的 HTTP/CGI 方法是让您的程序返回 HTTP 状态代码 204(无内容)。

用简单的 html 做这件事的简单而伟大的方法。伟大的!
2021-03-16 13:45:15
超酷!今天学到了新东西。然而,实际上,您确实希望向用户提供某种视觉反馈,表明表单提交已由服务器处理。浏览器似乎没有提供开箱即用的功能,因此使用 AJAX 来解释 HTTP 204 可能是最好的选择。
2021-03-19 13:45:15
这很棒。谢谢!
2021-03-21 13:45:15
这是一个很好的方法。比其他方法简单得多。
2021-03-22 13:45:15
哇...谢谢!...这真是一个了不起的提示,它并不能完全 100% 解决我遇到的问题,但它绝对是一个临时解决方案。非常感谢!
2021-04-04 13:45:15

当您点击提交按钮时,页面被发送到服务器。如果你想异步发送它,你可以用ajax来做。

使用XMLHttpRequest

var xhr = new XMLHttpRequest();
xhr.open("POST", '/server', true);

//Send the proper header information along with the request
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

xhr.onreadystatechange = function() { // Call a function when the state changes.
    if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {
        // Request finished. Do processing here.
    }
}
xhr.send("foo=bar&lorem=ipsum");
// xhr.send(new Int8Array()); 
// xhr.send(document);