2016-08-07 3 views
0

Как я могу избежать браузера из Pop Up Blocker, если я использую jQuery для открытия в новом окне. Я искал эту проблему, но все еще придерживался ее. Это коды, которые я сделал,jQuery - предотвращение блокировки всплывающих окон с помощью Window.Open();

$(document).ready(function(){ 
    $('#newLink').click(function(event){ 
    event.preventDefault(); 
    var page = $(this).attr('href'); 
    $.post(page, 
    { 
     pr_no : pr_no 
    }) 
    .done(function(data){ 
     window.open(page, "MsgWindow", "width=800,height=800"); 
    }); 
}); 

ответ

2

Всплывающие блокаторы обычно только позволяют window.open, если они используются во время обработки пользовательского события (например, щелчок). В вашем случае вы вызываете window.open позже, а не во время события, потому что $ .getJSON является асинхронным.

У вас есть два варианта:

что-то еще, а не window.open. Сделать синхронный вызов ajax, что вы обычно должны избегать, как чума, поскольку она блокирует пользовательский интерфейс браузера. $ .getJSON эквивалентно:

$.ajax({ 
    url: url, 
    dataType: 'json', 
    data: data, 
    success: callback 
}); 

... и поэтому вы можете сделать свой $ .getJSON вызов синхронным путем сопоставления ваших Params к выше и добавление асинхронном: ложному:

$.ajax({ 
    url:  "redirect/" + pageId, 
    async: false, 
    dataType: "json", 
    data:  {}, 
    success: function(status) { 
     if (status == null) { 
      alert("Error in verifying the status."); 
     } else if(!status) { 
      $("#agreement").dialog("open"); 
     } else { 
      window.open(redirectionURL); 
     } 
    } 
}); 

Опять же, Я не сторонник синхронных вызовов ajax, если вы можете найти любой другой способ достижения своей цели. Но если вы не можете, вы идете.

Вот пример кода, который не проходит проверку из-за асинхронного вызова:

Живой пример | Живой источник (Живые ссылки больше не работают из-за изменений в JSBin)

jQuery(function($) { 
    // This version doesn't work, because the window.open is 
    // not during the event processing 
    $("#theButton").click(function(e) { 
    e.preventDefault(); 
    $.getJSON("http://jsbin.com/uriyip", function() { 
     window.open("http://jsbin.com/ubiqev"); 
    }); 
    }); 
}); 

А вот пример, который делает работу, используя синхронный вызов:

Живой пример | Прямой эфир (прямые ссылки больше не работают из-за изменений в JSBin)

jQuery(function($) { 
    // This version does work, because the window.open is 
    // during the event processing. But it uses a synchronous 
    // ajax call, locking up the browser UI while the call is 
    // in progress. 
    $("#theButton").click(function(e) { 
    e.preventDefault(); 
    $.ajax({ 
     url:  "http://jsbin.com/uriyip", 
     async: false, 
     dataType: "json", 
     success: function() { 
     window.open("http://jsbin.com/ubiqev"); 
     } 
    }); 
    }); 
}); 
+0

Спасибо за помощь @Jasim. Изучит больше о аякс асинхронном и синхронном – Amran

Смежные вопросы