Я хочу отображать диалоговое окно JQuery условно при щелчке гиперссылки.
У меня есть требование, например, при условии 1 открыть диалог JQuery, и если условие 1 не выполняется, перейдите на страницу, на которую ссылается тег href, событие щелчка которого находится под вопросом.
Я могу вызвать функцию при нажатии на ссылку. Эта функция теперь проверяет указанное условие, выполняя другой URL-адрес (который выполняет мой контроллер Spring и возвращает ответ).
Все работает отлично, только window.open блокируется блокировщиком всплывающих окон.
$('a[href*=/viewpage?number]').live('click', function(e) {
e.preventDefault();
redirectionURL = this.href;
pageId= getUrlVars(redirectionURL)["number"];
$.getJSON("redirect/" + pageId, {}, function(status) {
if (status == null) {
alert("Error in verifying the status.");
} else if(!status) {
$("#agreement").dialog("open");
} else {
window.open(redirectionURL);
}
});
});
Если я удалю e.preventDefault();
из кода, блокировщик всплывающих окон не блокирует страницу, однако для условия 1 он затем открывает диалог, а также открывает страницу 'href'.
Если я решу одно, это создаст проблемы для другого. Я не могу одновременно оценить оба условия.
Не могли бы вы помочь мне решить эту проблему?
Как только это будет решено, мне нужно будет решить еще одну проблему, например, навигацию по событию ОК в диалоге :)
Ответы:
Блокировщики всплывающих окон обычно разрешают
window.open
использование только во время обработки пользовательского события (например, щелчка). В вашем случае вы звонитеwindow.open
позже , а не во время мероприятия, потому что$.getJSON
это асинхронно.У вас есть два варианта:
Сделай что-нибудь другое, а не
window.open
.Сделайте вызов ajax синхронным, чего обычно следует избегать, как чумы, поскольку он блокирует пользовательский интерфейс браузера.
$.getJSON
эквивалентно:... и поэтому вы можете сделать свой
$.getJSON
вызов синхронным, сопоставив свои параметры с указанными выше и добавивasync: false
:Опять же, я не защищаю синхронные вызовы ajax, если вы можете найти какой-либо другой способ достижения своей цели. Но если вы не можете, поехали.
Вот пример кода, который не проходит тест из-за асинхронного вызова:
Живой пример | Живой источник(живые ссылки больше не работают из-за изменений в JSBin)А вот пример, который действительно работает при использовании синхронного вызова:
Живой пример | Живой источник(живые ссылки больше не работают из-за изменений в JSBin)источник
вы можете вызвать window.open без блокировки браузера, только если пользователь выполняет какое-либо действие напрямую. Браузер отправляет какой-то флаг и определяет, что окно открывается действием пользователя.
Итак, вы можете попробовать такой сценарий:
источник
myWindow.postMessage
), но из-за ограничения Safaris на выполнение JavaScript в фоновом режиме, родительское окно никогда не может отправить это изменение местоположения.У меня была эта проблема, и у меня не было готового URL-адреса, пока обратный вызов не вернет некоторые данные. Решением было открыть пустое окно перед запуском обратного вызова, а затем просто установить местоположение, когда обратный вызов вернется.
источник
action().then(doWindowOpenThing).catch(doSomethingElseThatDoesntOpenAPopup)
Так что я не могу открыть окно , прежде чем руки (чтобы сохранить свою ссылку, и т.д.) , если в дальнейшем я не буду использовать его, не так ли?попробуйте это, это работает для меня,
Это скрипка для этого http://jsfiddle.net/safeeronline/70kdacL4/1/
источник
Windows должна быть создана в том же стеке (также известном как микрозадача ), что и событие, инициированное пользователем, например, обратный вызов щелчка, чтобы они не могли быть созданы позже асинхронно.
Однако вы можете создать окно без URL-адреса, а затем изменить URL-адрес этого окна, как только вы его узнаете , даже асинхронно!
Современные браузеры открывают окно с пустой страницей (часто называемой
about:blank
), и если ваша асинхронная задача по получению URL-адреса выполняется довольно быстро, то в результате пользовательский интерфейс в целом удовлетворителен. Если вместо этого вы хотите отобразить сообщение о загрузке (или что-то еще) в окне, пока пользователь ожидает, вы можете использовать URI данных .источник
Этот код мне поможет. Надеюсь, это поможет некоторым людям
источник
Попробуйте использовать элемент ссылки и щелкните его с помощью javascriipt
и сценарий
Используйте это так
источник
Наблюдение за тем, что событие должно быть инициировано пользователем, помогло мне понять первую часть этого, но даже после этого Chrome и Firefox все еще блокировали новое окно. Вторая часть добавляла target = "_ blank" к ссылке, которая упоминалась в одном комментарии.
В итоге: вам нужно вызвать window.open из события, инициированного пользователем, в данном случае щелкнув ссылку, и эта ссылка должна иметь target = "_ blank".
В приведенном ниже примере ссылка использует class = "button-twitter".
источник
это сработало для меня.
источник
Я использую этот метод, чтобы избежать блокировки всплывающих окон в моем коде React. он также будет работать во всех других кодах javascript.
Когда вы выполняете асинхронный вызов по событию щелчка, просто сначала откройте пустое окно, а затем напишите URL-адрес в нем позже, когда асинхронный вызов завершится.
при успешном выполнении асинхронного вызова напишите следующее
источник