#c# #javascript #asp.net
#c# #javascript #asp.net
Вопрос:
Есть ли способ открыть всплывающее окно с помощью window.open(….), оставить его поверх главного окна, а после его закрытия сфокусировать текстовое поле на вызывающей странице?
Мне было поручено настроить функциональность, написанную кем-то другим. На странице .NET 3.5 в настоящее время разрешено пополнение запасов, и при нажатии кнопки в новом всплывающем окне отображается квитанция. HTML для всплывающего окна хранится в скрытом поле и открывается вызовом функции js.
На странице также есть текстовое поле, в котором меня попросили сохранить фокус. У меня это работает, за исключением того, когда отображается квитанция. Если я вызываю серверную или клиентскую функцию для сохранения фокуса текстового поля, всплывающее окно появляется поверх главного окна на секунду, а затем перекрывается главной страницей, потому что текстовое поле получает фокус, а это не то, что требуется.
Ответ №1:
Возможно ли для вас использовать другой дизайн и что-то вроде диалогового окна jQuery для получения вместо отправки обратно на сервер? Поддерживать фокус на стороне клиента будет намного проще, чем пытаться принудительно использовать его на стороне сервера.
Комментарии:
1. К сожалению, мне не разрешено использовать jQuery
2. Хорошо, это облом. Вы упоминаете «Если я вызываю серверную или клиентскую функцию для сохранения фокуса текстового поля, появляется всплывающее окно». Я предполагаю, что это всплывающее окно является квитанцией, которую вы описываете. Что вызывает появление всплывающего окна? Должно быть какое-то событие, запускающее, когда текстовое поле получает фокус, как вы его описываете. Всплывающее окно отображается только при обратной отправке с сервера или оно также отображается, когда вы устанавливаете фокус на текстовое поле с помощью javascript?
Ответ №2:
Решение, которое может сработать для вас, — заставить всплывающую страницу сообщить, что это «родительская» страница, чтобы установить фокус на один из ее элементов управления, когда он закрывается. Вы можете сделать это с помощью javascript.
На вашей всплывающей странице добавьте это в тег body
<body onbeforeunload='window.opener.getElementById("textbox_to_focus").focus();'>
Предостережение: Событие onbeforeunload срабатывает всякий раз, когда пользователь переходит со страницы (то есть, обратная отправка, кнопка «Назад», кнопка «Закрыть» и т.д.). Если на вашей всплывающей странице нет навигации или каких-либо обратных сообщений, то это должно сработать для вас.
Комментарии:
1. повозившись с вашим предложением и выдав ошибку, я наконец понял, что в вашем заявлении отсутствует ‘document’
2. Итак, сработало следующее. <body onbeforeunload=’window.opener.document.getElementById(«textbox_to_focus»). focus();’>
3. Отличная новость и извините за паршивый пример кода. Я уже почти ничего не помню в своей голове. Будь ты проклят, Google 🙂
Ответ №3:
Возможно, это не самый эффективный способ, но вы могли бы открыть окно и запустить JS timer в главном окне с интервалом в каждую секунду. Затем используйте if(window.closed)
, чтобы определить, было ли закрыто окно. Если да, то установите фокус на текстовое поле и отключите таймер.
Вот пример страницы, на которой можно реализовать вышеупомянутое:
<html>
<head>
<script type="text/javascript">
testwindow = window.open("<your page>","window");
function timer()
{
var t=setTimeout("checkWindow()",1000);
}
function checkWindow()
{
if(testwindow.closed)
document.getElementById("tbox").focus();
else
timer();
}
</script>
</head>
<body onload="timer()">
<input name="tbox" />
</body>
</html>
Комментарии:
1. Я ценю ваши усилия. Я пытался использовать таймер, как вы предложили, но почему-то не смог его успешно подключить. В любом случае, спасибо, это была интересная идея
2. @Bengal — Без проблем 🙂 Это была просто мысль.