2015-08-26 2 views
2

У меня нет довольно удалось связать это, так как другие сообщают об успехе в 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>

(К сожалению, из-за всплывающий фактор, этот фрагмент не будет работать вообще, по крайней мере, в моем браузере. Однако, содержимое кадра может копировать/вставить дословный . в файл для тестирования)

+0

Обработчики событий Javascript выполняются до стандартного поведения события. Таким образом, любой код, прикрепленный к обработчику onsubmit javascript, будет запускаться до отправки формы. Следовательно, использование тайм-аута. Найдите лучшее событие для закрытия всплывающего окна (например, ответ сервера после отправки) или сделайте запись формы самостоятельно, или просто продолжайте использовать тайм-аут onsubmit, а не onclick. – Shilly

+0

@Shilly: Hum .. перестановка тайм-аута назад, но увеличение длительности (1 с) действительно работает. Кажется, действительно взломанный, чтобы догадаться о хорошем тайм-ауте :( –

+0

Продолжительность таймаута не имеет значения. Даже при 0-секундном тайм-ауте функция тайм-аута запускается за всеми остальными вещами, которые делает браузер. reflow content, запустить другой код сценария и т. д.) Проблема с первоначальным таймаутом состояла в том, что он вызвал onclick, а не onsubmit. – Shilly

ответ

2

вы можете попробовать эту форму целевого кладж, если вы не можете использовать AJAX звонков: в принципе, вы поставили цель формы к IFRAME вы включаете во всплывающем окне. Это приведет к тому, что результат вашей формы будет передан, а именно страницу google, которую вы захватываете, для отображения в iframe. Затем вы можете добавить прослушиватель событий в событие загрузки этого iframe в событии onsubmit формы.

<form method="GET" action="http://google.com/?q=test" target="after" onsubmit="close()"> 
<input type="submit" value="Click here now" /> 
</form> 
<iframe id="after" name="after"></iframe> 
<script> 
function close() { 
    document.querySelector('#after').addEventListener('load', function() { 
     window.close(); 
    }); 
} 
</script> 
+0

Хех, неплохо. FWIW в реальном мире Я поднял тайм-аут на данный момент, но для целей вопроса в целом это довольно хорошо ... –

Смежные вопросы