Javascript для .NET 3.5: как сфокусировать текстовое поле после закрытия всплывающего окна

#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 — Без проблем 🙂 Это была просто мысль.