Chrome'da engellenen pop-up'ı algıla


103

Bir pop-up'ın diğer tarayıcılarda engellenip engellenmediğini tespit etmek için javascript tekniklerinin farkındayım ( bu sorunun cevabında açıklandığı gibi ). İşte temel test:

var newWin = window.open(url);

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

Ancak bu Chrome'da çalışmaz. Popup engellendiğinde "POPUP ENGELLENDİ" bölümüne asla ulaşılmaz.

Elbette, test bir dereceye kadar çalışıyor çünkü Chrome pop-up'ı aslında engellemiyor, ancak onu sağ alt köşede "engellenmiş" pop-up'ları listeleyen küçültülmüş bir pencerede açıyor.

Yapmak istediğim şey, pop-up'ın Chrome'un pop-up engelleyicisi tarafından engellenip engellenmediğini anlayabilmektir. Özellik tespiti lehine tarayıcının koklamasından kaçınmaya çalışıyorum. Bunu tarayıcı koklamadan yapmanın bir yolu var mı?

Düzenleme : Şimdi yapma kullanımını çalıştık newWin.outerHeight, newWin.leftbunu gerçekleştirmek için, ve diğer benzer özelliklere. Google Chrome, pop-up engellendiğinde tüm konum ve yükseklik değerlerini 0 olarak döndürür.

Ne yazık ki, pop-up gerçekte bilinmeyen bir süre için açılmış olsa bile aynı değerleri döndürür. Büyülü bir dönemden sonra (testimde birkaç saniye), konum ve boyut bilgileri doğru değerler olarak döndürülür. Başka bir deyişle, bunu çözmeye henüz yaklaşmadım. Herhangi bir yardım memnuniyetle karşılanacaktır.


Yoav, konum açılır pencerenin engellenip engellenmediğine bakılmaksızın aynı şeyi gösterir. Kullanıcının 3,5 saniye beklemesini gerektirmeyen bir cevabı olan başka biri var mı?

InvisibleBacon ve Andy'nin en son çözümleri Chrome 10'da çalışmıyor: Test açılır penceresi başarıyla görüntülense bile "chrome için başarısız oldu" mesajı görünüyor. Herhangi bir fikir?

Bu çözümlerden bazıları yalnızca Chrome'un ilk sürümlerinde işe yaramış gibi göründüğü için yeni bir soru sorulacağını düşünüyorum.
Bryan Tarla

1
@George Bailey Katılıyorum, ancak açık olmak gerekirse, bazıları Chrome'un mevcut sürümünde çalışıyor (19). Andrew'un OuterHeight'ı (veya başkalarının önerdiği gibi screenX'i) kullanma konusundaki orijinal fikri, setTimeout yaklaşımıyla birlikte benim için iyi çalışıyor. Ama evet, kendi testimi yapana kadar tüm bu cevapları anlamaya çalışmak gerçekten kafa karıştırıcıydı.
normal mike

Yanıtlar:


66

Sözünü ettiğiniz "sihirli zaman", muhtemelen pop-up'ın DOM'u yüklendiğinde. Ya da her şey (resimler, dıştan CSS, vb.) Yüklendiğinde olabilir. Açılır pencereye çok büyük bir grafik ekleyerek bunu kolayca test edebilirsiniz (önce önbelleğinizi temizleyin!). JQuery gibi bir Javascript Framework kullanıyorsanız (veya benzeri bir şey), pencere ofsetini kontrol etmeden önce DOM'un yüklenmesini beklemek için ready () olayını (veya benzer bir şeyi) kullanabilirsiniz. Buradaki tehlike, Safari algılamasının çelişkili bir şekilde çalışmasıdır: açılır pencerenin DOM'si Safari'de asla hazır olmayacaktır () çünkü açmaya çalıştığınız pencere için size geçerli bir tutamaç verecektir - gerçekte açılır veya değil. (aslında, yukarıdaki açılır pencere test kodunuzun safari için çalışmayacağına inanıyorum.)

Sanırım yapabileceğiniz en iyi şey, testinizi bir setTimeout () içine sarmak ve testi çalıştırmadan önce açılır pencereye yüklemeyi tamamlamak için 3-5 saniye süre vermek. Mükemmel değil, ancak zamanın en az% 95'inde çalışmalıdır.

İşte Chrome parçası olmadan tarayıcılar arası algılama için kullandığım kod.

function _hasPopupBlocker(poppedWindow) {
    var result = false;

    try {
        if (typeof poppedWindow == 'undefined') {
            // Safari with popup blocker... leaves the popup window handle undefined
            result = true;
        }
        else if (poppedWindow && poppedWindow.closed) {
            // This happens if the user opens and closes the client window...
            // Confusing because the handle is still available, but it's in a "closed" state.
            // We're not saying that the window is not being blocked, we're just saying
            // that the window has been closed before the test could be run.
            result = false;
        }
        else if (poppedWindow && poppedWindow.test) {
            // This is the actual test. The client window should be fine.
            result = false;
        }
        else {
            // Else we'll assume the window is not OK
            result = true;
        }

    } catch (err) {
        //if (console) {
        //    console.warn("Could not access popup window", err);
        //}
    }

    return result;
}

Yaptığım şey, bu testi ebeveynden çalıştırmak ve bir setTimeout () içine sarmak, alt pencereye yüklemesi için 3-5 saniye vermek. Alt pencerede bir test işlevi eklemeniz gerekir:

fonksiyon testi() {}

Açılır pencere engelleyici algılayıcı, "test" işlevinin alt pencerenin bir üyesi olarak var olup olmadığını test eder.

EKLENEN 15 HAZİRAN 2015:

Sanırım bunu halletmenin modern yolu, çocuğun ebeveyne pencerenin yüklendiğini bildirmesini sağlamak için window.postMessage () kullanmak olacaktır. Yaklaşım benzerdir (çocuk ebeveyne yüklendiğini söyler), ancak iletişim araçları gelişmiştir. Bu çapraz etki alanını çocuktan yapabildim:

$(window).load(function() {
  this.opener.postMessage({'loaded': true}, "*");
  this.close();
});

Ebeveyn bu mesajı aşağıdakileri kullanarak dinler:

$(window).on('message', function(event) {     
  alert(event.originalEvent.data.loaded)
}); 

Bu yardımcı olur umarım.


Rich, sen bir javascript pop-up gurusun. Teşekkür ederim. Tam da ihtiyacım olan şey buydu.
Andrew Ensley

4
Bununla ilgili herhangi bir güncelleme var mı? Artık çalışmıyor gibi görünüyor ... Özellikle Chrome'da
Chris Wagner

Sanırım bunu Chrome'un yeni sürümleri için çalıştırmanın bir yolunu buldum. Ayrıntılar için cevabıma bakın.
InvisibleBacon

2
Temelde Chrome'da bir hata var. Açılır pencereyi gizlese de, yine de çalışır ve pencere nesnesini yine de geri alırsınız - bu nedenle düzenli kontroller çalışmaz. İşte benim için çalışan çözüm: var popup = window.open (url); eğer (popup) {popup.onload = function () {console.log (popup.innerHeight> 0? 'open': 'block'); }} else {console.log ('engellendi'); } Burada çalışma örneği: jsbin.com/uticev/3
Remy Sharp

1
Bu cevap artık doğru değil, lütfen cevabı @Predrag Stojadinović'in cevabı olarak değiştirin
Lucas B

16

InvisibleBacon'un snippet'inde yalnızca bir iyileştirme (IE9, Safari 5, Chrome 9 ve FF 3.6'da test edilmiştir):

var myPopup = window.open("popupcheck.htm", "", "directories=no,height=150,width=150,menubar=no,resizable=no,scrollbars=no,status=no,titlebar=no,top=0,location=no");
if (!myPopup)
    alert("failed for most browsers");
else {
    myPopup.onload = function() {
        setTimeout(function() {
            if (myPopup.screenX === 0) {
                alert("failed for chrome");
            } else {
                // close the test window if popups are allowed.
                myPopup.close();  
            }
        }, 0);
    };
}

Pop-up'lara izin veriliyorsa neden pencere kapatılsın? ilk etapta açmak istediğiniz açılır pencereyi kapatmak olmaz mıydı?
elemjay19

3
Onload yerine jQuery kullanarak $ (myPopup) .ready () yapardım. Yerel olarak çalıştırıyorum IE'm çok hızlıydı ve "yükleme" zaten gerçekleşmişti.
Matt Connolly

12

Aşağıda, açılır pencere engelleyici denetimi için bir jQuery çözümü verilmiştir. FF (v11), Safari (v6), Chrome (v23.0.127.95) ve IE (v7 & v9) ile test edilmiştir. Hata mesajını uygun gördüğünüz şekilde işlemek için _displayError işlevini güncelleyin.

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.");
        }
    };

Kullanım:

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

Bu yardımcı olur umarım! :)


Bu gerçekten faydalıdır. Paylaşım için teşekkürler.
Suvendu Shekhar Giri

Hoş geldin Suvendu, faydalı bulduğuna sevindim! Mutlu kodlamalar! :)
Kevin B

1
Açılmaya çalışan url'nin içine / çevresine geçmek için bu kodu değiştirdim. Bu, _displayError () yönteminin, kullanıcıya bir sorun olduğunu bildiren bir uyarı (toastr kullanıyorum) görüntülemesine ve doğrudan bir bağlantı olduğu için çoğu engelleyiciyi atlatacak tıklanabilir bir bağlantı sağlamasına olanak tanır. Paylaşım için teşekkürler!!
Tyler Forsythe

@TylerForsythe çözümünüz hakkında daha fazla bilginiz var mı? İçeriğe doğrudan tıklanabilir bir bağlantı sağlamayı çok isterim.
Joshua Dans

1
@JoshuaDance İşte değiştirilmiş kodumu ve onu nasıl çağırdığımı göstermek için oluşturduğum bir özet. Umarım yardımcı olur! gist.github.com/tylerforsythe/452ceaad62f507d7cb7bd7ddbffe650c
Tyler Forsythe

10

Rich'in cevabı artık Chrome için işe yaramayacak. Görünüşe göre Chrome artık pop-up pencerede herhangi bir Javascript çalıştırıyor. Engellenen pop-up'ları kontrol etmek için 0 olan bir screenX değerini kontrol ettim. Ayrıca kontrol etmeden önce bu mülkün nihai olduğunu garanti etmenin bir yolunu bulduğumu düşünüyorum. Bu yalnızca alanınızdaki pop-up'lar için çalışır, ancak şuna benzer bir yükleme işleyicisi ekleyebilirsiniz:

var myPopup = window.open("site-on-my-domain", "screenX=100");
if (!myPopup)
    alert("failed for most browsers");
else {
    myPopup.onload = function() {
        setTimeout(function() {
            if (myPopup.screenX === 0)
                alert("failed for chrome");
        }, 0);
    };
}

Birçoğunun bildirdiği gibi, "screenX" özelliği bazen, yüklemeden sonra bile başarısız pop-up'lar için sıfır olmayan bir durum bildirir. Bu davranışı da deneyimledim, ancak denetimi sıfır ms zaman aşımından sonra eklerseniz, screenX özelliği her zaman tutarlı bir değer çıkarıyor gibi görünüyor.

Bu komut dosyasını daha sağlam yapmanın bir yolu olup olmadığını bana bildirin. Yine de amaçlarım için işe yarıyor gibi görünüyor.


Benim için değil, onloadasla ateşlemez.
yaprak

9

Bu benim için çalıştı:

    cope.PopupTest.params = 'height=1,width=1,left=-100,top=-100,location=no,toolbar=no,menubar=no,scrollbars=no,resizable=no,directories=no,status=no';
    cope.PopupTest.testWindow = window.open("popupTest.htm", "popupTest", cope.PopupTest.params);

    if( !cope.PopupTest.testWindow
        || cope.PopupTest.testWindow.closed
        || (typeof cope.PopupTest.testWindow.closed=='undefined')
        || cope.PopupTest.testWindow.outerHeight == 0
        || cope.PopupTest.testWindow.outerWidth == 0
        ) {
        // pop-ups ARE blocked
        document.location.href = 'popupsBlocked.htm';
    }
    else {
        // pop-ups are NOT blocked
        cope.PopupTest.testWindow.close();
    }

OuterHeight ve externalWidth, krom içindir, çünkü yukarıdaki 'about: blank' numarası artık chrome'da çalışmıyor.


1
Chrome değişikliklerini iyi yakalayın ve burada güncellediğiniz için teşekkürler. Cevabınız doğru olarak işaretlenmelidir.
Lucas B

OuterWidth ve externalHeight artık Chrome'da da çalışmıyor
Roman

5

Burada verilen cevabı kopyalayıp / yapıştıracağım: https://stackoverflow.com/a/27725432/892099 DanielB. krom 40 üzerinde çalışıyor ve çok temiz. kirli hackler veya beklemek içermez.

function popup(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.");
  }
}

3

Bir Promiseyaklaşıma ne dersiniz ?

const openPopUp = (...args) => new Promise(s => {
  const win = window.open(...args)
  if (!win || win.closed) return s()
  setTimeout(() => (win.innerHeight > 0 && !win.closed) ? s(win) : s(), 200)
})

Ve bunu klasik gibi kullanabilirsiniz window.open

const win = await openPopUp('popuptest.htm', 'popuptest')
if (!win) {
  // popup closed or blocked, handle alternative case
}

Kodu, geri dönmek yerine vaadi yerine getirmemesi için değiştirebilirsiniz undefined, ben sadece bunun bu durumda ifolduğundan daha kolay bir kontrol akışı olduğunu düşündüm try / catch.


Bu, krom uzantısı reklam engelleyicilerini tespit etmek için çalışır. +1
Micheal C Wallas

2

Ebeveyne göre pencerenin konumunu kontrol edin. Chrome, pencerenin neredeyse ekran dışında görünmesini sağlar .


Bunu deneyeceğim ve sonuçlarımı size bildireceğim. Teşekkürler.
Andrew Ensley

Google Chrome, pop-up "engellendiğinde" sol ve üst ofsetleri 0 olarak bildirir. Bunun benim altın biletim olduğunu sanıyordum ama hayır. Aslında açıldıktan hemen sonra ofsetleri 0 olarak bildirir. Gelecekte açıldıktan sonra sihirli bir noktada, üst ve sol ofsetler doğru şekilde rapor edilir.
Andrew Ensley

Kontrol etmeden önce ofsetlerin ayarlanmasını garanti eden bir yol için gönderimi kontrol edin.
InvisibleBacon

2

Chrome'da açılmayan pop-up'larla benzer bir sorun yaşadım. Hayal kırıklığına uğradım çünkü bir yükleme açılır penceresi gibi sinsi bir şey yapmaya çalışmıyordum, sadece kullanıcı tıkladığında bir pencere açıyordum. Firebug komut satırından window.open () işlevini içeren işlevimi çalıştırmak işe yaradığından, aslında bağlantıma tıklamak işe yaramadığı için, ÇİFTE hayal kırıklığına uğradım! İşte benim çözümüm:

Yanlış yol: window.open () öğesini bir olay dinleyicisinden çalıştırmak (benim durumumda dojo.connect bir DOM düğümünün onclick olay yöntemine).

dojo.connect(myNode, "onclick", function() {
    window.open();
}

Doğru yol: window.open () adlı düğümün onclick özelliğine bir işlev atamak.

myNode.onclick = function() {
    window.open();
}

Ve tabi ki, gerekirse aynı onclick olayı için olay dinleyicileri yapabilirim. Bu değişiklikle, Chrome "Hiçbir sitenin pop-up göstermesine izin verme" olarak ayarlanmasına rağmen pencerelerimi açabildim. Sevinç.

Chrome yöntemlerinde bilgili biri geri kalanımıza neden bir fark yarattığını söyleyebilirse, bunu duymak isterim, ancak bunun yalnızca kötü niyetli programatik açılır pencerelerde kapıyı kapatma girişiminden şüpheleniyorum.


Çözümünüzü paylaştığınız için teşekkürler. İşe yarıyor. Bu, pop-up'ları Chrome'da açmanın en iyi ve en temiz yoludur. Cevabınız üstte olmalıdır. Çözümlerin geri kalanı sadece "kirli" hacklerdir.
Mandeep Janjua

2

İşte şu anda Chrome'da çalışan bir sürüm. Rich'in çözümünden sadece küçük bir değişiklik, ancak zamanlamayı da işleyen bir paketleyici ekledim.

function checkPopupBlocked(poppedWindow) {
 setTimeout(function(){doCheckPopupBlocked(poppedWindow);}, 5000);
}

function doCheckPopupBlocked(poppedWindow) {

    var result = false;

    try {
        if (typeof poppedWindow == 'undefined') {
            // Safari with popup blocker... leaves the popup window handle undefined
            result = true;
        }
        else if (poppedWindow && poppedWindow.closed) {
            // This happens if the user opens and closes the client window...
            // Confusing because the handle is still available, but it's in a "closed" state.
            // We're not saying that the window is not being blocked, we're just saying
            // that the window has been closed before the test could be run.
            result = false;
        }
        else if (poppedWindow && poppedWindow.outerWidth == 0) {
            // This is usually Chrome's doing. The outerWidth (and most other size/location info)
         // will be left at 0, EVEN THOUGH the contents of the popup will exist (including the
         // test function we check for next). The outerWidth starts as 0, so a sufficient delay
         // after attempting to pop is needed.
            result = true;
        }
        else if (poppedWindow && poppedWindow.test) {
            // This is the actual test. The client window should be fine.
            result = false;
        }
        else {
            // Else we'll assume the window is not OK
            result = true;
        }

    } catch (err) {
        //if (console) {
        //    console.warn("Could not access popup window", err);
        //}
    }

    if(result)
     alert("The popup was blocked. You must allow popups to use this site.");
}

Kullanmak için sadece şunu yapın:

var popup=window.open('location',etc...);
checkPopupBlocked(popup);

Açılır pencere engellenirse, uyarı mesajı 5 saniyelik yetkisiz kullanım süresinden sonra görüntülenir (bunu ayarlayabilirsiniz, ancak 5 saniye oldukça güvenli olmalıdır).


2

Bu parça yukarıdakilerin tümünü içeriyor - Nedense - StackOverflow aşağıdaki kod bloğundaki ilk ve son kod satırlarını hariç tutuyor, bu yüzden üzerine bir blog yazdım. Tam bir açıklama ve (indirilebilir) kodun geri kalanı için thecodeabode.blogspot.com adresindeki bloguma bir göz atın .

var PopupWarning = {

    init : function()
    {

        if(this.popups_are_disabled() == true)
        {
            this.redirect_to_instruction_page();
        }
    },

    redirect_to_instruction_page : function()
    {
        document.location.href = "http://thecodeabode.blogspot.com";
    },

    popups_are_disabled : function()
    {
        var popup = window.open("http://localhost/popup_with_chrome_js.html", "popup_tester", "width=1,height=1,left=0,top=0");

        if(!popup || popup.closed || typeof popup == 'undefined' || typeof popup.closed=='undefined')
        {
            return true;
        }

        window.focus();
        popup.blur();

        //
        // Chrome popup detection requires that the popup validates itself - so we need to give
        // the popup time to load, then call js on the popup itself
        //
        if(navigator && (navigator.userAgent.toLowerCase()).indexOf("chrome") > -1)
        {
            var on_load_test = function(){PopupWarning.test_chrome_popups(popup);};     
            var timer = setTimeout(on_load_test, 60);
            return;
        }


        popup.close();
        return false;
    },

    test_chrome_popups : function(popup)
    {
        if(popup && popup.chrome_popups_permitted && popup.chrome_popups_permitted() == true)
        {
            popup.close();
            return true;
        }

        //
        // If the popup js fails - popups are blocked
        //
        this.redirect_to_instruction_page();
    }
};

PopupWarning.init();

2

Vay canına, burada kesinlikle birçok çözüm var. Bu benim, mevcut kabul edilen cevaptan alınan çözümleri (en son Chrome'da çalışmayan ve bir zaman aşımına sarılmasını gerektiren) ve bu ileti dizisindeki ilgili bir çözümü kullanıyor (aslında jQuery değil vanilya JS) kullanır. .

Mine true, pop-up engellendiğinde ve falseaksi halde gönderilecek bir geri arama mimarisi kullanır .

window.isPopupBlocked = function(popup_window, cb)
{
    var CHROME_CHECK_TIME = 2000;       // the only way to detect this in Chrome is to wait a bit and see if the window is present

    function _is_popup_blocked(popup)
    {
        return !popup.innerHeight;
    }

    if (popup_window) {
        if (popup_window.closed) {
            // opened OK but was closed before we checked
            cb(false);
            return;
        }
        if (/chrome/.test(navigator.userAgent.toLowerCase())) {
            // wait a bit before testing the popup in chrome
            setTimeout(function() {
                cb(_is_popup_blocked(popup_window));
            }, CHROME_CHECK_TIME);
        } else {
            // for other browsers, add an onload event and check after that
            popup_window.onload = function() {
                cb(_is_popup_blocked(popup_window));
            };
        }
    } else {
        cb(true);
    }
};

1

Jason'ın cevabı benim de düşünebildiğim tek yöntem, ancak böyle bir konuma güvenmek biraz tehlikeli!

Bu günlerde, gerçekten "istenmeyen pop-up'ım engellendi mi?" Sorusunu sormanıza gerek yok, çünkü cevap her zaman "evet" tir - tüm büyük tarayıcılarda açılır pencere engelleyicisi varsayılan olarak açıktır. En iyi yaklaşım, neredeyse her zaman izin verilen doğrudan bir tıklamaya yanıt olarak yalnızca window.open () yöntemidir.


2
En iyi uygulamaları vb. Biliyorum. Ama bu görevi yerine getirmem gereken bir durumdayım. Bu yüzden bu soruyu sordum ve "yapmalı mıyım?"
Andrew Ensley

1

SELAM

Yukarıda anlatılan çözümleri biraz değiştirdim ve en azından Chrome için çalıştığını düşünüyorum. Çözümüm, açılır pencere açıldığında değil, ana sayfa açıldığında açılır pencerenin engellenip engellenmediğini algılamak için yapıldı, ancak eminim onu ​​değiştirebilecek bazı insanlar var. :-) Buradaki dezavantaj, açılır pencerenin görüntüleniyor olmasıdır. açılır pencere engelleyici olmadığında birkaç saniye için (biraz kısaltmak mümkün olabilir).

Bunu 'ana' penceremin bölümüne koydum

<script type="text/JavaScript" language="JavaScript">

 var mine = window.open('popuptest.htm','popuptest','width=1px,height=1px,left=0,top=0,scrollbars=no');
 if(!mine|| mine.closed || typeof mine.closed=='undefined')
  {
    popUpsBlocked = true       
    alert('Popup blocker detected ');
    if(mine)
      mine.close();
 }
 else
 {
    popUpsBlocked = false    
    var cookieCheckTimer = null;
    cookieCheckTimer =  setTimeout('testPopup();', 3500);
 }


function testPopup()
{
  if(mine)
  {
    if(mine.test())
    {
       popUpsBlocked = false;
    }
    else
    {
        alert('Popup blocker detected ');
         popUpsBlocked = true;
     }
    mine.close();
}

} 
</script>

Açılır pencere testi şöyle görünür:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Popup test</title>
<script type="text/javascript" language="Javascript">
   function test() {if(window.innerHeight!=0){return true;} else return false;}
</script>
</head>

<body>
</body>
</html>

3500 ms sonra açılır sayfadaki test işlevini çağırdığımda, iç yükseklik Chrome tarafından doğru şekilde ayarlandı.

PopUpsBlocked değişkenini pop-up'ların diğer javascriptlerde görüntülenip görüntülenmediğini bilmek için kullanıyorum. yani

function ShowConfirmationMessage()
{
if(popUpsBlocked)
 { 
  alert('Popups are blocked, can not display confirmation popup. A mail will be sent with the confirmation.');
 } 
 else
 { 
  displayConfirmationPopup();
 }
 mailConfirmation();
}

Bu maalesef, açmaya çalıştığınız sayfanın bizim tarafımızdan kontrol edildiğini varsayar. Kontrol edemediğim bir harici sayfa açmam gerekiyor.
Roman

1
function openPopUpWindow(format)
{   
    var win = window.open('popupShow.html',
                          'ReportViewer',
                          'width=920px,height=720px,left=50px,top=20px,location=no,directories=no,status=no,menubar=no,toolbar=no,resizable=1,maximize:yes,scrollbars=0');

    if (win == null || typeof(win) == "undefined" || (win == null && win.outerWidth == 0) || (win != null && win.outerHeight == 0) || win.test == "undefined") 
    {
        alert("The popup was blocked. You must allow popups to use this site.");  
    }
    else if (win)
    {
        win.onload = function()
        {          
            if (win.screenX === 0) {
                alert("The popup was blocked. You must allow popups to use this site.");
                win.close();
            } 
        };
    }
}

0

Anlayabildiğim kadarıyla (test ettiğimden) Chrome, konumu 'about: blank' olan bir pencere nesnesi döndürüyor. Bu nedenle, aşağıdakiler tüm tarayıcılar için çalışmalıdır:

var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined' || newWin.location=='about:blank')
{
    //POPUP BLOCKED
}

konum, engellenmemiş pop-up'lar için bile hala "about: blank" olacaktır. Chrome v28.0.1500.72'de test ettim
Roman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.