У меня нет довольно удалось связать это, так как другие сообщают об успехе в Chrome, но я воспроизвел проблему в Chrome 44, а не в Firefox 33.1. Включение режима инкогнито (т. Е. Никаких расширений) и исключение в настройках блокировщика всплывающих окон не повлияло.Отправка формы из всплывающего окна на новую вкладку, затем закрытие всплывающего окна, предотвращение отправки формы
У меня есть всплывающее окно с формой, а целью формы является _blank
. Предполагается, что представление формы перейдет на новую вкладку в родительском окне. Затем всплывающее окно закрывается.
Однако новая вкладка не открывается, если я не удалю код, чтобы закрыть всплывающее окно.
Я предполагаю, что я запускаю предотвращение всплывающих окон где-то (особенно потому, что я не могу воспроизвести через локальный адрес file:///
, только с удаленным контентом), но я не смог решить, зачем закрывать всплывающее окно после отправки разрушит само представление. Я не вижу ничего в консоли разработчика.
Я также попытался, вместо onsubmit
, добавив к кнопке отправки onclick="setTimeout('window.close()',1);return true;"
, с тем же эффектом; на самом деле, это ужасный код, действительно найденный в приложении, которое я пытаюсь отлаживать.
Что происходит?
Вот ужасный автономный тест, который воспроизводит проблему.
var trigger = null;
var popup = null;
window.onload = function() {
trigger = document.getElementById('trigger');
trigger.onclick = function() {
popup = window.open('', 'thePopup', 'width=450,height=450');
if (popup == null) {
console.error("Failed to open popup window :(");
}
else {
populatePopup();
}
};
};
function populatePopup() {
popup.document.write('<html><body>');
popup.document.write('<form method="GET" action="http://google.com/?q=test" target="_blank" onsubmit="window.close()">');
popup.document.write('<input type="submit" value="Click here now" />');
popup.document.write('</form>');
popup.document.write('</body></html>');
}
<a href="#" id="trigger">Click here</a>
(К сожалению, из-за всплывающий фактор, этот фрагмент не будет работать вообще, по крайней мере, в моем браузере. Однако, содержимое кадра может копировать/вставить дословный . в файл для тестирования)
Обработчики событий Javascript выполняются до стандартного поведения события. Таким образом, любой код, прикрепленный к обработчику onsubmit javascript, будет запускаться до отправки формы. Следовательно, использование тайм-аута. Найдите лучшее событие для закрытия всплывающего окна (например, ответ сервера после отправки) или сделайте запись формы самостоятельно, или просто продолжайте использовать тайм-аут onsubmit, а не onclick. – Shilly
@Shilly: Hum .. перестановка тайм-аута назад, но увеличение длительности (1 с) действительно работает. Кажется, действительно взломанный, чтобы догадаться о хорошем тайм-ауте :( –
Продолжительность таймаута не имеет значения. Даже при 0-секундном тайм-ауте функция тайм-аута запускается за всеми остальными вещами, которые делает браузер. reflow content, запустить другой код сценария и т. д.) Проблема с первоначальным таймаутом состояла в том, что он вызвал onclick, а не onsubmit. – Shilly