2008-08-05 56 views
83

Thỉnh thoảng, tôi đã gặp một trang web cố gắng mở một cửa sổ mới (cho người dùng nhập vào hoặc một cái gì đó quan trọng), nhưng trình chặn cửa sổ bật lên ngăn điều này xảy ra.Làm cách nào để phát hiện xem trình duyệt có đang chặn cửa sổ bật lên không?

Cửa sổ gọi điện có thể sử dụng phương thức nào để đảm bảo cửa sổ mới được khởi chạy đúng cách?

Trả lời

105

Nếu bạn sử dụng JavaScript để mở cửa sổ bật lên, bạn có thể sử dụng một cái gì đó như thế này:

var newWin = window.open(url);    

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
    //POPUP BLOCKED 
} 
+1

Nó không hoạt động với Chrome ;-(sử dụng tốt hơn giải pháp Kevin B bên dưới .. – sly63

+0

Đây là câu trả lời cho chrome: [detect-blocked-popup-in-chrome] (http://stackoverflow.com/questions/668286/detect-blocked-popup-in-chrome/1089792 # 1089792) – ajwaka

+0

cũng đọc phần này: https://stackoverflow.com/a/20235765/2892117 –

23

Giải pháp này để kiểm tra chặn popup đã được thử nghiệm trong FF (v11), Safari (v6), Chrome (v23 .0.127.95) & IE (v7 & v9). Cập nhật hàm _displayError để xử lý thông báo lỗi khi bạn thấy phù hợp.

var popupBlockerChecker = { 
    check: function(popup_window){ 
     var _scope = this; 
     if (popup_window) { 
      if(/chrome/.test(navigator.userAgent.toLowerCase())){ 
       setTimeout(function() { 
        _scope._is_popup_blocked(_scope, popup_window); 
       },200); 
      }else{ 
       popup_window.onload = function() { 
        _scope._is_popup_blocked(_scope, popup_window); 
       }; 
      } 
     } else { 
      _scope._displayError(); 
     } 
    }, 
    _is_popup_blocked: function(scope, popup_window){ 
     if ((popup_window.innerHeight > 0)==false){ 
      scope._displayError(); 
     } 
    }, 
    _displayError: function(){ 
     alert("Popup Blocker is enabled! Please add this site to your exception list."); 
    } 
}; 

Cách sử dụng:

var popup = window.open("http://www.google.ca", '_blank'); 
popupBlockerChecker.check(popup); 

Hope this helps! :)

+1

không hoạt động với tôi Chrome (v26.0.1410.64) –

+5

I nghĩ rằng bạn cần nhiều gạch dưới –

27

Tôi đã thử một số ví dụ ở trên, nhưng tôi không thể khiến chúng hoạt động với Chrome. Cách tiếp cận đơn giản này dường như hoạt động với Chrome 39, Firefox 34, Safari 5.1.7 và IE 11. Đây là đoạn mã từ thư viện JS của chúng tôi.

openPopUp: function(urlToOpen) { 
    var popup_window=window.open(urlToOpen,"myWindow","toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=yes, width=400, height=400");    
    try { 
     popup_window.focus(); 
    } catch (e) { 
     alert("Pop-up Blocker is enabled! Please add this site to your exception list."); 
    } 
} 
+1

Nó không hoạt động cho tôi trong IE – Surendra

+0

@Surendra, bạn có thể chỉ định ý nghĩa của bạn với "không hoạt động" không? Lỗi tại thời gian phân tích cú pháp? Cửa sổ bật lên bị chặn nhưng nó được đánh dấu là mở?Tôi không thấy bất kỳ lý do tại sao thám hiểm sẽ thất bại này, trừ khi gọi focus() trên NULL được cho phép trong trường hợp đó, một thử nghiệm cho NULL trước khi thử sẽ chỉ làm việc. – FrancescoMM

10

Một "giải pháp" mà sẽ luôn làm việc bất kể công ty duyệt hoặc phiên bản là chỉ cần đặt một thông điệp cảnh báo trên màn hình, ở đâu đó gần kiểm soát mà sẽ tạo ra một cửa sổ pop-up, mà lịch sự cảnh báo người dùng rằng hành động yêu cầu cửa sổ bật lên và vui lòng bật chúng cho trang web.

Tôi biết nó không lạ mắt hay gì cả, nhưng nó không thể đơn giản hơn và chỉ cần khoảng 5 phút thử nghiệm, sau đó bạn có thể chuyển sang những cơn ác mộng khác.

Khi người dùng đã cho phép cửa sổ bật lên cho trang web của bạn, bạn cũng nên cân nhắc nếu bạn không lạm dụng cửa sổ bật lên. Điều cuối cùng bạn muốn làm là làm phiền khách truy cập của bạn.

+1

Cảm ơn, nhưng không cảm ơn. – FrancescoMM

+0

Vâng, @FrancescoMM, bạn được chào đón nhiều nhất! – UncaAlby

+0

Thật không may, đôi khi tất cả các giải pháp khác trong câu hỏi này là không thể chấp nhận được - chỉ có điều này. Tại sao? Bởi vì tất cả họ đều cố gắng hiển thị cửa sổ bật lên - không chỉ phát hiện nếu cửa sổ bật lên được bật. Nếu tôi muốn làm điều đó một cách âm thầm thì sao? –

0

Tôi đã thử rất nhiều giải pháp, nhưng chỉ có một giải pháp mà tôi có thể làm với uBlock Origin, là sử dụng hết thời gian chờ để kiểm tra trạng thái đã đóng của cửa sổ bật lên.

function popup (url, width, height) { 
    const left = (window.screen.width/2) - (width/2) 
    const top = (window.screen.height/2) - (height/2) 
    let opener = window.open(url, '', `menubar=no, toolbar=no, status=no, resizable=yes, scrollbars=yes, width=${width},height=${height},top=${top},left=${left}`) 

    window.setTimeout(() => { 
     if (!opener || opener.closed || typeof opener.closed === 'undefined') { 
      console.log('Not allowed...') // Do something here. 
     } 
    }, 1000) 
} 

Rõ ràng đây là hack; giống như mọi giải pháp cho vấn đề này.

Bạn cần cung cấp đủ thời gian trong setTimeout để mở tài khoản và đóng cửa ban đầu, vì vậy nó sẽ không bao giờ hoàn toàn chính xác. Nó sẽ là một vị trí của thử và sai.

Thêm số này vào danh sách các lần thử của bạn.

Các vấn đề liên quan