【问题标题】:Close browser tab after executing a post执行帖子后关闭浏览器选项卡
【发布时间】:2021-10-05 14:14:25
【问题描述】:

我有一个 wsgi python-2 网络服务器,我希望在按下按钮后,在服务器端执行一些代码,浏览器页面会关闭。

目前,帖子将浏览器选项卡重定向到主机名/foo 页面,我不想这样做,而只是接收帖子并在客户端关闭页面。

此页面是旧版页面,涉及的代码越少越好(它已经从头开始重新设计,但出于兼容性问题我必须使其尽可能简单)。

所以例如执行流程是这样的:

user clicks on "foo" button -> a post arrives to the web server -> the server does something on its side 
-> page closes 

据我所知,可以使用window.close(); 命令关闭 html 页面,但我不知道如何在当前页面中插入此命令。

我已尝试创建绑定到 onclick 和 onsubmit 侦听器的 javascript 函数,但由于始终打印 /foo 页面,我无法解决问题。

现有的代码是这样的:

<form method="post" action="foo">
    <input type="submit" value="Submit and foo!"/>
</form>

foo 函数根据 wsgi 编程模型调用 python-webserver 中的 foo 函数。

我想做的是在按下Submit和Foo表单提交按钮后自动关闭页面

【问题讨论】:

  • 所以你想发送请求然后立即关闭浏览器或发送请求,等待应答然后关闭浏览器?
  • 在这种情况下没有区别,因为客户端发送的 POST 包含一些触发服务器端代码执行的数据,其结果保留在服务器端(客户端可以在 POST 正确后立即关闭发送)
  • 请注意,&lt;input&gt; 标签不使用也不需要结束斜杠,并且在任何 HTML 规范中都没有。

标签: python html wsgi


【解决方案1】:

考虑将 JavaScript FormData 对象与 XMLHttpRequest 结合使用,从而在提交事件上执行

var formElement = document.querySelector("form");
var request = new XMLHttpRequest();
request.open("POST", "foo", true);
request.onreadystatechange = function() {
    if (this.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
        window.close();
    }
}
request.send(new FormData(formElement));

请注意,这假设您的页面上只有一个表单。如果您希望在另一个时刻关闭,请将HEADERS_RECEIVED 替换为其他readyState 值之一。免责声明:此代码未经测试。

【讨论】:

  • 代码似乎不起作用,因为“foo”似乎不等同于“action”。服务器在“action”情况下接收主机名/foo,但在“javascript”(又名此代码)情况下仅接收“主机名”
  • @EagleOne 这个替换 "foo" 使用 document.querySelector("form").action
  • 谢谢@Daweo,这解决了“动作”问题,但 request.onreadystatechange = function() 分支从未被采用(在这里和那里添加了一些警报)。我已经为表单分配了一个 ID,并添加了一个 getElementById 调用而不是 querySelector
猜你喜欢
  • 1970-01-01
  • 2020-07-17
  • 2017-01-17
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 2012-01-11
相关资源
最近更新 更多