2011-07-08 13 views
12

Co ostatecznie muszę zrobić, to uruchomić wywołanie $.ajax(), a następnie, po uruchomieniu, otwórz nowe okno.window.open popup zostaje zablokowany podczas zdarzenia click

Kliknięcie przycisku "Podgląd" powoduje zapisanie bieżącego formularza, a następnie otwiera nowe okno z podglądem elementu z właśnie zapisanymi danymi.

Ale tak jak jest, funkcja window.open zostaje zablokowana przez wyskakujące okienka.

Oto podstawowe części mojego kodu:

HTML:

<a href="/surveys/185/preview" class="preview" target="_blank">Preview</a> 

JavaScript:

$('.preview').live('click', function(event){ 
    save_survey($(this).attr('href')); 
    event.preventDefault(); 
}); 

function save_survey(url) { 
    $.ajax({ 
    type: "POST", 
    url: form_url, 
    dataType: 'json', 
    data: form_data, 
    success: function(data) { 
     window.open(url, '_blank'); 
    } 
    }); 
} 

Odpowiedz

53

wpadłem na ten problem niedawno i okazało się to obejść:

1) nazywamy window.open tuż przed wywołaniem $.ajax i SAV e odniesienie okno:

var newWindow = window.open(...); 

2) na wywołanie zwrotne ustawione location własność zapisanych odniesienie okno:

newWindow.location = url; 

Może to pomoże ci też.

+0

Nice! To wydaje się działać idealnie. – Shpigford

+2

To jest niesamowicie sprytne. I myślałem, że nie ma nadziei. – JayD3e

+0

Właściwie to już nie działa. Czy ktoś może potwierdzić, że nie jest to możliwe? – JayD3e

2

Zgodnie z tym this post wygląda na to, że trzeba otworzyć okno w bezpośredniej reakcji na kliknięcie (aby uniknąć trafienia przez blokadę wyskakujących okienek), zamiast czekać, aż wywołanie AJAX zakończy się, aby otworzyć nowe okno.

6

Blokowanie wyskakujących okienek zwykle blokuje każde wyskakujące okienko, które nie jest uruchamiane przez bezpośrednie działanie użytkownika, takie jak kliknięcie przycisku lub łącza.

Jeśli używasz żądania ajax w swoim zdarzeniu kliknięcia, żądanie jest uruchamiane asynchronicznie od zdarzenia kliknięcia, dlatego do czasu wykonania żądania ajax i otrzymasz zdarzenie z odpowiedzią na żądanie, które masz straciłem szansę na wyzwolenie window.open z blokadą wyskakujących okienek, pierwotnym zdarzeniem kliknięcia, które od dawna już nie żyje.

3

mi rozwiązać mój przypadek poprzez wykonanie połączenia synchroniczne Ajax. Na przykład. (z jQuery):

$("form").submit(function(e){ 
    e.preventDefault(); 
    $.ajax({ 
     async: false, 
     url: ..., 
     data: ..., 
     success: function(results){ 
      if(results.valid){ 
       window.open(...); 
      } 
     } 
    }); 
    return false; 
    });