Запуск обычного всплывающего окна по щелчку пользователя - PullRequest
3 голосов
/ 15 июля 2010

Я знаю, что есть много тем о том, как победить блокировщики всплывающих окон. В этом случае я не пытаюсь это сделать. По умолчанию браузеры не блокируют все всплывающие окна. Допустимые, например, когда пользователи нажимают на него, разрешены. Это хороший тест: http://www.popuptest.com/goodpopups.html (работает в IE, Firefox, Chrome, Opera)

То, как на вышеуказанном тестовом сайте разрешены легитимные всплывающие окна, напрямую связывает событие onclick с запуском нового окна.

В моем случае я не могу просто запустить всплывающее окно. Мне нужно проверить правильность введенного пользователем буквенно-цифрового пароля. Я сделал так, чтобы вход проверялся через ajax, и, если он действителен, будет вызываться window.open() для запуска окна. Увы, все блокировщики всплывающих окон блокируют это.

Есть ли другой способ сделать это? Я не хочу запускать окно, если ввод неверен. Если ввод недействителен, сообщение об ошибке отображается на странице непосредственно, а не в новом всплывающем окне. Глупо запускать окно, просто чтобы сказать пользователю, что оно недействительно.

Есть какие-нибудь мысли или предложения, как я могу проверить ввод, а также разрешить показ допустимого всплывающего окна?

Спасибо.

Отредактировано, чтобы включить мой (упрощенный) код

HTML-форма:

<form id="form-passcode">
<input id="input-passcode" type="text" name="input-passcode" /><a class="submit" onclick="javascript:passcode_check(); return false;" href="javascript:">Go</a>
</form>

Javascript (с использованием jQuery):

function passcode_check() {
    var refPasscode = $('#input-passcode');
    var data = $('#form-passcode').serialize();
    $.ajax({
      url: check_passcode.php',
      data: data,
      dataType: 'json',
      type: 'post',
      success: function (j) {
        if (j.status == 1) {
          newwindow = window.open('http://google.com','Google','menubar=no,height=500,width=300,resizable=no,toolbar=no,location=no,status=no');
          if (window.focus) {newwindow.focus()}
        }
        else {
          // show error to end-user
        }
      }
    });
}

}

Я также экспериментировал с менее идеальной альтернативой, в которой при проверке через ajax правильности введенных данных я вставлю ссылку, например, <a href="http://google.com" onclick="newwin(this.href);return false" onfocus="this.blur()">Launch</a> через $('#form-passcode').html();, в котором пользователь впоследствии щелкнет, чтобы запустить всплывающее окно. Это работает во всех браузерах, хотя я все равно хотел бы сделать его более удобным для пользователя ..

Еще раз спасибо, :) 1032 *

Ответы [ 2 ]

4 голосов
/ 15 июля 2010

Согласен с дакрисом.Код, который вызывает window.open, должен быть ближе к обработчику нажатия кнопки.Если вы выполняете AJAX-вызов на сервер с обработчиком асинхронных ответов, то вы отсоединили вызов window.open от обработчика нажатия кнопки.Браузеры могут отслеживать только несколько уровней глубины стека (некоторые только одну глубину вызовов, другие - несколько вызовов), чтобы увидеть, выполняется ли вызов window.open из контекста выполнения пользовательского события.Асинхронный AJAX-обработчик выполняется спустя долгое время после того, как обработчик нажатия кнопки был выполнен и возвращен к своему вызывающему.

Один из способов решения вашей проблемы может заключаться в том, чтобы вывернуть проблему наизнанку: сначала откройте всплывающее окно в обработчике нажатия кнопкизатем выполните асинхронный вызов AJAX для проверки ввода, а затем обновите URL-адрес всплывающего окна в соответствии с результатом вызова AJAX в асинхронном обработчике.

4 голосов
/ 15 июля 2010

Почему бы не переместить код проверки в событие onclick?

Пример: onclick = "javascript: validateInput ();"

Затем в validateInput (), если пароль действителен, вы бы открыли новое окно.

Кроме того, убедитесь, что вы не назначаете обработчик onclick динамически с jQuery.Он должен быть указан статически как атрибут HTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...