#python #html #wsgi
Вопрос:
У меня есть веб-сервер 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
Из того, что я знаю, html-страницу можно закрыть window.close();
командой, но я понятия не имею, как вставить эту команду на текущую страницу.
Я попытался создать функцию javascript, ограниченную прослушивателями onclick и onsubmit, но мне не удалось решить проблему, так как страница /foo всегда печатается.
Существующий код выглядит так:
<form method="post" action="foo">
<input type="submit" value="Submit and foo!"/>
</form>
Функция foo вызывает функцию foo на веб-сервере python в соответствии с моделью программирования wsgi.
Что я хотел бы сделать, так это автоматически закрыть страницу после нажатия кнопки «Отправить» и «Отправить форму».
Комментарии:
1. Итак, вы хотите отправить запрос, а затем немедленно закрыть браузер или отправить запрос, дождаться ответа, а затем закрыть браузер?
2. В данном случае это не имеет значения, так как клиент отправляет СООБЩЕНИЕ с некоторыми данными, которые запускают выполнение кода на стороне сервера, результаты которого остаются на стороне сервера (клиент может закрыть, как только сообщение будет отправлено правильно).
3. Обратите внимание, что
<input>
тег не использует и не нуждается в закрывающей косой черте и никогда не содержался ни в одной спецификации HTML.
Ответ №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. Отказ от ответственности: этот код не был протестирован.
Комментарии:
1. Код, похоже, не работает, так как «foo», похоже, не эквивалентно «действию». Сервер получает имя хоста/foo в случае «действия», но только «имя хоста» в случае «javascript» (он же этот код)
2. @EagleOne это повторное
"foo"
использованиеdocument.querySelector("form").action
3. Спасибо @Daveo, это решает проблему «действия», но ветвь request.onreadystatechange = function() никогда не используется (добавлено несколько предупреждений здесь и там). Я присвоил форме идентификатор и добавил вызов getElementById вместо querySelector