Функция Javascript запускается после завершения обратной передачи

Я разрабатываю приложение .NET ASP с кодом VB. У меня есть 2 текстовых поля и 1 кнопка. Кнопка при нажатии использует javascript для открытия нового окна (давайте назовем новое окно x).

 button.OnClientClick = "ShowWindowX();return false;"

Функция ShowWindowX() открывает новое окно с URL-адресом, который передает оба параметра из текстового поля. Когда я вставляю новые значения в текстовые поля и нажимаю вдали от текстовых полей (но не на кнопку), страница выполняет обратную передачу, потому что я установил ее всякий раз, когда текстовые поля теряют фокус, чтобы выполнить обратную передачу, которая отправит новые значения обратно на сервер.

Проблема в том, что если я отредактирую любое из значений текстового поля, например, изменю 3 на 4, и сразу же нажму кнопку, не щелкнув сначала текстовое поле, новые значения не будут выбраны, поэтому я все еще получаю 3. Я пытался принудительно обратная передача, когда кнопка нажимается через следующее:

 btnBBHistory.OnClientClick = "__doPostBack();ShowWindowX();return false;"

и хотя это вызывает обратную передачу, обратная передача не завершается до тех пор, пока я не закрою окно, которое открывается благодаря функции ShowWindowsX.

Может ли кто-нибудь посоветовать, как заставить обратную передачу полностью завершиться до выполнения функции ShowWindowX(), чтобы можно было передать новые значения?

заранее спасибо


person user2965112    schedule 27.02.2014    source источник
comment
Это небольшое предположение, основанное на том, что я делал в прошлом, но попробуйте создать функцию javascript, которая добавляет значение текстового поля в скрытое поле, а затем закрывает всплывающее окно. Вызовите эту функцию перед __doPostBack, а затем получите доступ к скрытому полю в обратной передаче, чтобы вернуть значение.   -  person B-Lat    schedule 27.02.2014


Ответы (1)


Вы должны полностью изменить свой подход, поскольку это не вызов ajax, он уничтожит все на странице, и страница будет обновлена.

Так что же можно сделать, чтобы этого добиться? вы можете проверить это на бэкэнде и добавить скрипт, если страница загружается в обратном вызове, например:

if (IsPostBack)
    Page.ClientScript.RegisterStartupScript(this.GetType(), "ShowWindowX", 
    "ShowWindowX();", true);

Конечно, это можно сделать, если вы уже зарегистрировали скрипт, в котором определено ShowWindowX.

Но если вы не хотите, чтобы окно показывалось КАЖДЫЙ раз, когда происходит обратная запись, вы можете установить флаг в глобальном хранилище, таком как localStorage, а затем проверить его, когда вы хотите открыть окно:

btnBBHistory.OnClientClick = "__doPostBack();localStorage.callwin=true;return false;"

и при загрузке страницы на стороне сервера сделайте следующее:

if (IsPostBack)
   Page.ClientScript.RegisterStartupScript(this.GetType(), "ShowWindowX", 
   "if(Boolean(localStorage.callwin)){ShowWindowX();localStorage.callwin='';}",
   true);
person Mehran Hatami    schedule 27.02.2014
comment
Спасибо, но страница также отправляется с помощью других элементов управления на странице (о которых я не упомянул; другие кнопки и т. д.), поэтому я не хочу, чтобы окно показывалось КАЖДЫЙ раз, когда происходит обратная отправка... - person user2965112; 27.02.2014
comment
@ user2965112: Я изменил свой ответ, чтобы вы могли делать то, что хотите, не показывая окно КАЖДЫЙ раз. проверить это. - person Mehran Hatami; 27.02.2014
comment
Спасибо, я смог сделать это с помощью __doPostBack(controlname, 'xxxxx'), а затем при обновлении проверить, является ли аргумент обратной передачи = xxxxx, и если да, показать окно. Ваше решение мне очень помогло. Спасибо - person user2965112; 10.03.2014