javascript - क्रोम में अवरुद्ध पॉपअप का पता लगाएं




google-chrome popup (10)

मैं जावास्क्रिप्ट तकनीकों से अवगत हूं कि यह पता लगाने के लिए कि क्या अन्य ब्राउज़रों में पॉपअप अवरुद्ध है (जैसा कि इस प्रश्न के उत्तर में वर्णित है)। यहां बुनियादी परीक्षण है:

var newWin = window.open(url);

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

लेकिन यह क्रोम में काम नहीं करता है। पॉपअप अवरुद्ध होने पर "पॉपअप ब्लॉक" अनुभाग कभी नहीं पहुंचता है।

बेशक, परीक्षण कुछ हद तक काम कर रहा है क्योंकि क्रोम वास्तव में पॉपअप को अवरुद्ध नहीं करता है, लेकिन इसे निचले दाएं कोने में एक छोटी न्यूनतम विंडो में खुलता है जिसमें "अवरुद्ध" पॉपअप सूचीबद्ध होते हैं।

मैं क्या करना चाहता हूं यह बता सकता है कि पॉपअप को क्रोम के पॉपअप अवरोधक द्वारा अवरोधित किया गया था या नहीं। मैं सुविधा पहचान के पक्ष में ब्राउज़र स्नीफिंग से बचने की कोशिश करता हूं। ब्राउजर स्नीफिंग के बिना ऐसा करने का कोई तरीका है?

संपादित करें : मैंने अब इसे पूरा करने के लिए newWin.outerHeight , newWin.left , और अन्य समान गुणों का उपयोग करने का प्रयास किया है। पॉपअप अवरुद्ध होने पर Google क्रोम सभी स्थिति और ऊंचाई मान 0 के रूप में देता है।

दुर्भाग्यवश, यह वही मान भी देता है भले ही पॉपअप वास्तव में अज्ञात समय के लिए खोला जाता है। कुछ जादुई अवधि (मेरे परीक्षण में कुछ सेकंड) के बाद, स्थान और आकार की जानकारी सही मान के रूप में लौटा दी जाती है। दूसरे शब्दों में, मैं अभी भी इसे समझने के करीब नहीं हूं। किसी भी सहायता की सराहना की जाएगी।


InvisibleBacon के स्निपेट में केवल एक सुधार (आईई 9, सफारी 5, क्रोम 9 और एफएफ 3.6 में परीक्षण):

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

इस खंड में उपर्युक्त सभी शामिल हैं - किसी कारण से - स्टैक ओवरफ्लो कोड कोड में कोड की पहली और आखिरी पंक्तियों को छोड़कर है, इसलिए मैंने इस पर एक ब्लॉग लिखा था। एक पूर्ण स्पष्टीकरण के लिए और बाकी (डाउनलोड करने योग्य) कोड को मेरे ब्लॉग पर thecodeabode.blogspot.com पर एक नज़र डालें

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();

जहां तक ​​मैं कह सकता हूं (मैंने जो परीक्षण किया है) क्रोम एक विंडो ऑब्जेक्ट को 'about: blank' के स्थान के साथ देता है। तो, निम्नलिखित सभी ब्राउज़रों के लिए काम करना चाहिए:

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

जेसन का जवाब एकमात्र तरीका है जिसे मैं भी सोच सकता हूं, लेकिन इस तरह की स्थिति पर भरोसा करना थोड़ा सा है!

इन दिनों, आपको वास्तव में सवाल पूछने की ज़रूरत नहीं है "क्या मेरा अनचाहे पॉपअप अवरुद्ध था?", क्योंकि उत्तर हमेशा "हां" है - सभी प्रमुख ब्राउज़रों में डिफ़ॉल्ट रूप से पॉपअप अवरोधक चालू होता है। सर्वश्रेष्ठ दृष्टिकोण केवल प्रत्यक्ष क्लिक के जवाब में window.open () के लिए होता है, जिसे लगभग हमेशा अनुमति दी जाती है।


पॉपअप अवरोधक जांच के लिए निम्नलिखित एक jQuery समाधान है। इसका परीक्षण एफएफ (v11), सफारी (v6), क्रोम (v23.0.127.95) और आईई (v7 और v9) में किया गया है। त्रुटि संदेश को संभालने के लिए _displayError फ़ंक्शन को अपडेट करें जैसा कि आप फिट देखते हैं।

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

उपयोग:

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

उम्मीद है की यह मदद करेगा! :)


माता-पिता से संबंधित विंडो की स्थिति की जांच करें। क्रोम विंडो को लगभग ऑफ-स्क्रीन दिखाई देता है।


यह मेरे लिए काम किया:

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

बाहरी हाइट और बाहरी चौड़ाई क्रोम के लिए है क्योंकि ऊपर से 'लगभग: खाली' चाल क्रोम में काम नहीं करती है।


यहां एक संस्करण है जो वर्तमान में क्रोम में काम कर रहा है। रिच के समाधान से बस एक छोटा बदलाव, हालांकि मैंने एक रैपर में जोड़ा जो समय को भी संभालता है।

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

इसका उपयोग करने के लिए बस यह करें:

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

यदि पॉपअप अवरुद्ध हो जाता है, तो अलर्ट संदेश 5 दूसरी अनुग्रह अवधि के बाद प्रदर्शित होगा (आप इसे समायोजित कर सकते हैं, लेकिन 5 सेकंड काफी सुरक्षित होना चाहिए)।


वाह वहाँ निश्चित रूप से बहुत सारे समाधान हैं। यह मेरा है, यह वर्तमान स्वीकृत उत्तर से लिया गया समाधान का उपयोग करता है (जो नवीनतम क्रोम में काम नहीं करता है और इसे टाइमआउट में लपेटने की आवश्यकता है), साथ ही साथ इस थ्रेड पर संबंधित समाधान (जो वास्तव में वेनिला जेएस है, jQuery नहीं है) ।

मेरा कॉलबैक आर्किटेक्चर का उपयोग करता है जो पॉपअप अवरुद्ध होने पर और अन्यथा false होने पर true भेजा जाएगा।

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

वैसे आप "जादुई समय" के बारे में बात करते हैं, शायद पॉपअप के डोम को लोड किया गया है। अन्यथा यह हो सकता है जब सबकुछ (छवियों, आउटबोर्ड सीएसएस, आदि) लोड हो गया है। आप पॉपअप में बहुत बड़ा ग्राफ़िक जोड़कर आसानी से इसका परीक्षण कर सकते हैं (पहले अपना कैश साफ़ करें!)। यदि आप jQuery (या कुछ समान) जैसे जावास्क्रिप्ट फ्रेमवर्क का उपयोग कर रहे थे, तो आप विंडो ऑफ़सेट की जांच करने से पहले डीओएम लोड होने के लिए तैयार () कुछ (या इसी तरह की कुछ) का उपयोग कर सकते हैं। इसमें खतरा यह है कि सफारी का पता लगाना एक विरोधाभासी तरीके से काम करता है: पॉपअप का डोम कभी भी सफारी में तैयार नहीं होगा (क्योंकि यह आपको उस विंडो के लिए एक वैध हैंडल देगा जो आप खोलने की कोशिश कर रहे हैं - चाहे वह वास्तव में खुलता है या नहीं। (वास्तव में, मेरा मानना ​​है कि उपरोक्त आपके पॉपअप परीक्षण कोड सफारी के लिए काम नहीं करेंगे।)

मुझे लगता है कि आप जो कर सकते हैं सबसे अच्छी चीज एक सेटटाइमआउट () में अपना परीक्षण लपेटें और परीक्षण चलाने से पहले लोडिंग को पूरा करने के लिए पॉपअप को 3-5 सेकंड दें। यह सही नहीं है, लेकिन इसे कम से कम 9 5% समय पर काम करना चाहिए।

क्रोम भाग के बिना, क्रॉस-ब्राउज़र पहचान के लिए मैं जिस कोड का उपयोग करता हूं वह यहां दिया गया है।

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

मैं जो करता हूं वह इस परीक्षा को माता-पिता से चलाता है और उसे सेटटाइमआउट () में लपेटता है, जिससे बच्चे को 3-5 सेकेंड लोड करने की सुविधा मिलती है। बाल विंडो में, आपको एक परीक्षण फ़ंक्शन जोड़ने की आवश्यकता है:

कार्य परीक्षण() {}

पॉपअप अवरोधक डिटेक्टर यह देखने के लिए परीक्षण करता है कि "परीक्षण" फ़ंक्शन बाल विंडो के सदस्य के रूप में मौजूद है या नहीं।

जून 15 2015 जोड़ा गया:

मुझे लगता है कि इसे संभालने का आधुनिक तरीका window.postMessage () का उपयोग करना होगा ताकि बच्चा माता-पिता को सूचित कर सके कि खिड़की लोड हो गई है। दृष्टिकोण समान है (बच्चा माता-पिता को लोड करता है), लेकिन संचार के साधनों में सुधार हुआ है। मैं बच्चे से यह क्रॉस-डोमेन करने में सक्षम था:

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

अभिभावक इस संदेश का उपयोग करके सुनता है:

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

उम्मीद है की यह मदद करेगा।





popup