2011-07-08 55 views
12

Điều cuối cùng tôi cần làm là chạy một cuộc gọi $.ajax() và sau đó sau khi cuộc gọi đó được chạy, hãy mở một cửa sổ mới.window.open popup bị chặn trong khi sự kiện nhấp chuột

Nhấp chuột sử dụng vào nút "Xem trước" để lưu biểu mẫu hiện tại của chúng, sau đó mở cửa sổ mới hiển thị bản xem trước của mục có dữ liệu vừa được lưu.

Nhưng khi có, chức năng window.open bị chặn bởi trình chặn cửa sổ bật lên.

Dưới đây là những phần cơ bản của mã của tôi:

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'); 
    } 
    }); 
} 

Trả lời

53

Tôi chạy vào vấn đề này thời gian gần đây và thấy công việc xung quanh này:

1) gọi window.open ngay trước khi gọi $.ajax và sav e cửa sổ tài liệu tham khảo:

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

2) trên callback thiết location tài sản của tài liệu tham khảo sổ lưu:

newWindow.location = url; 

Có lẽ nó sẽ giúp bạn quá.

+0

Tốt đẹp! Điều này dường như hoạt động hoàn hảo. – Shpigford

+2

Điều này cực kỳ thông minh. Và tôi nghĩ không có hy vọng. – JayD3e

+0

Thực ra điều này dường như không hoạt động nữa. Ai đó có thể xác nhận rằng điều này là không thể? – JayD3e

2

Theo điều này this post, có vẻ như bạn sẽ phải mở cửa sổ của bạn để phản hồi trực tiếp nhấp chuột (để tránh bị các trình chặn cửa sổ bật lên) thay vì đợi cho đến khi cuộc gọi AJAX hoàn tất để mở cửa sổ mới.

6

Trình chặn cửa sổ bật lên thường hoạt động chặn mọi cửa sổ bật lên được hiển thị không được kích hoạt bởi hành động trực tiếp của người dùng, như nhấp vào nút hoặc liên kết.

Nếu bạn sử dụng yêu cầu ajax trên sự kiện nhấp, yêu cầu được kích hoạt không đồng bộ từ sự kiện nhấp, đó là lý do tại sao thời gian yêu cầu ajax thực hiện công việc của bạn và bạn nhận được sự kiện của mình với phản hồi từ yêu cầu bạn có mất cơ hội của bạn để kích hoạt một window.open withouth các popup chặn nhận được trong cách, sự kiện nhấp chuột ban đầu nó chết lâu bởi thời gian đó.

3

Tôi đã giải quyết trường hợp của mình bằng cách thực hiện cuộc gọi Ajax đồng bộ. Ví dụ. (với jQuery):

$("form").submit(function(e){ 
    e.preventDefault(); 
    $.ajax({ 
     async: false, 
     url: ..., 
     data: ..., 
     success: function(results){ 
      if(results.valid){ 
       window.open(...); 
      } 
     } 
    }); 
    return false; 
    }); 
Các vấn đề liên quan