यदि कोई ब्राउज़र पॉपअप अवरुद्ध कर रहा है तो मैं कैसे पता लगा सकता हूं?


130

कभी-कभी, मैं एक वेबपेज पर आया हूं जो एक नई विंडो खोलने की कोशिश करता है (उपयोगकर्ता इनपुट के लिए, या कुछ महत्वपूर्ण), लेकिन पॉपअप ब्लॉकर ऐसा होने से रोकता है।

यह सुनिश्चित करने के लिए कि नई विंडो को ठीक से लॉन्च करने के लिए कॉलिंग विंडो किन तरीकों का उपयोग कर सकती है?

जवाबों:


160

यदि आप पॉपअप खोलने के लिए जावास्क्रिप्ट का उपयोग करते हैं, तो आप कुछ इस तरह का उपयोग कर सकते हैं:

var newWin = window.open(url);             

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

यहाँ क्रोम के लिए एक जवाब है: पता-अवरुद्ध-पॉपअप-इन-क्रोम
अजावाका

@ajwaka आप कृपया स्पष्ट कर सकते हैं कि क्या यह उत्तर क्रोम के लिए विफल रहता है, या कोई अन्य कारण है जो क्रोम के लिए बेहतर है? धन्यवाद!
16

@ आज कम से कम आज यह कोड क्रोम पर काम करता है, इसलिए यह सवाल है।
क्रैशहोट

@ चरसालोट - आप मुझसे कुछ पूछ रहे हैं जिसका जवाब मैंने 6 साल पहले दिया था - मुझे दुख की बात है कि अब स्थिति याद नहीं है और 6 साल में ब्राउजर ने एक लंबा रास्ता तय किया है।
अज्वाका

40

मैंने ऊपर दिए गए कई उदाहरणों की कोशिश की, लेकिन मैं उन्हें क्रोम के साथ काम करने के लिए नहीं मिला। यह सरल दृष्टिकोण Chrome 39, फ़ायरफ़ॉक्स 34, सफारी 5.1.7 और IE 11 के साथ काम करने लगता है। यहाँ हमारे JS लाइब्रेरी से कोड का स्निपेट है।

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
@ सुरेंद्र कृपया, क्या आप निर्दिष्ट कर सकते हैं कि आपके "काम नहीं करने" का क्या मतलब है? पार्स समय में एक त्रुटि? रनटाइम में कोई त्रुटि? पॉपअप खुलता है लेकिन इसे अवरुद्ध के रूप में चिह्नित किया गया है? पॉपअप अवरुद्ध है लेकिन यह खुले के रूप में चिह्नित है? मुझे ऐसा कोई कारण नहीं दिखता है कि जब तक पूर्ण स्थिति में काम करने से पहले NULL के लिए एक परीक्षण न हो जाए, तब तक अन्वेषक इसे विफल नहीं करेगा, जब तक कि NULL पर ध्यान केंद्रित करने की अनुमति नहीं है।
फ्रांसेस्कोएम

IE हमेशा अशक्त रहता है, भले ही पॉपअप सफल रहा हो।
डेविन गार्नर

34

अद्यतन: पॉपअप वास्तव में प्राचीन काल से मौजूद हैं। प्रारंभिक विचार मुख्य विंडो को बंद किए बिना एक और सामग्री दिखाने के लिए था। अब तक, ऐसा करने के अन्य तरीके हैं: जावास्क्रिप्ट सर्वर के लिए अनुरोध भेजने में सक्षम है, इसलिए पॉपअप का उपयोग शायद ही कभी किया जाता है। लेकिन कभी-कभी वे अभी भी काम कर रहे हैं।

पिछले दुष्ट स्थलों में पॉपअप का बहुत दुरुपयोग हुआ। एक बुरा पृष्ठ विज्ञापनों के साथ पॉपअप विंडो के टन खोल सकता है। इसलिए अब अधिकांश ब्राउज़र पॉपअप को ब्लॉक करने और उपयोगकर्ता की सुरक्षा करने का प्रयास करते हैं।

अधिकांश ब्राउज़र पॉपअप को ब्लॉक करते हैं यदि उन्हें उपयोगकर्ता-ट्रिगर इवेंट हैंडलर के बाहर बुलाया जाता है।

यदि आप इसके बारे में सोचते हैं, तो यह थोड़ा मुश्किल है। यदि कोड सीधे ऑनक्लियर हैंडलर में है, तो यह आसान है। लेकिन क्या सेटअप में पॉपअप खुलता है?

इस कोड को आज़माएं:

 // open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);

पॉपअप क्रोम में खुलता है, लेकिन फ़ायरफ़ॉक्स में अवरुद्ध हो जाता है।

... और यह फ़ायरफ़ॉक्स में भी काम करता है:

 // open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);

अंतर यह है कि फ़ायरफ़ॉक्स 2000ms या उससे कम समय के लिए स्वीकार्य है, लेकिन इसके बाद - "विश्वास" को हटा देता है, यह मानते हुए कि अब यह "उपयोगकर्ता कार्रवाई के बाहर" है। तो पहला एक अवरुद्ध है, और दूसरा एक नहीं है।


मूल उत्तर जो वर्तमान 2012 था:

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

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

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


20
मुझे लगता है कि आपको अधिक अंडरस्कोर की जरूरत है
याकूब स्टैम

फ़ायरफ़ॉक्स में, यह रिक्त पृष्ठ प्रदर्शित करता है और आप ओपनर पृष्ठ पर पॉपअप ब्लॉकर संदेश भी नहीं देख सकते हैं। रिक्त पृष्ठ को कैसे बंद करें?
user460114

ध्यान दें कि यदि पॉपअप url एक डाउनलोड करने योग्य फ़ाइल (जिसमें Content-Disposition: attachment;प्रतिक्रिया शीर्षलेख है), तो पॉपअप तुरंत बंद हो जाएगा, इसलिए setTimeoutकोड विफल हो जाएगा, और ब्राउज़र शिकायत करेगा कि "पॉपअप अवरोधक सक्षम है!"। क्रोम के लिए, मैं @ डैनियलबी के समाधान की सलाह देता हूं और यह बहुत अच्छा काम करता है।
वॉनसुक

1
@wonsuc एक ऐसा लिंक खोलते हैं जिसमें एक Content-Disposition: attachment;हेडर होता है जिसे आपको पॉपअप में खोलने की आवश्यकता नहीं होती है। बस अपनी डाउनलोड की जाने वाली संपत्ति के लिए एक सीधा लिंक बनाएं और ब्राउज़र का मूल व्यवहार आपको वर्तमान पृष्ठ से दूर रीडायरेक्ट किए बिना डाउनलोड करने की अनुमति देगा।
केविन बी

@ केविनबी मेरा कहना है कि मैं एक विशिष्ट स्थिति में हूं। मुझे कई फाइलें डाउनलोड करनी हैं जो HTML से पीडीएफ फाइलें पैदा कर रही हैं। और यदि HTML सामग्री बड़ी है, तो कभी-कभी इसमें कई सेकंड लगते हैं और अगर मैं window.locationइसके लिए उपयोग करता हूं , यदि पहली फ़ाइल को उत्पन्न होने में बहुत लंबा समय लगता है, तो दूसरा अनुरोध शुरू होने पर इसे अनदेखा कर दिया जाएगा। यही कारण है कि मुझे इसका उपयोग करना है window.open, क्योंकि window.locationप्रतिक्रिया समाप्त होने पर मुझे कभी भी यह बताने की अनुमति नहीं है।
wonsuc

12

एक "समाधान" जो हमेशा ब्राउज़र कंपनी या संस्करण की परवाह किए बिना काम करेगा, बस स्क्रीन पर एक चेतावनी संदेश डालना है, जो नियंत्रण के करीब है जो एक पॉप-अप बनाएगा, जो विनम्रता से उपयोगकर्ता को चेतावनी देता है कि कार्रवाई के लिए पॉप की आवश्यकता है- ऊपर और कृपया उन्हें साइट के लिए सक्षम करें।

मुझे पता है कि यह फैंसी या कुछ भी नहीं है, लेकिन यह किसी भी सरल नहीं हो सकता है और केवल लगभग 5 मिनट के परीक्षण की आवश्यकता होती है, फिर आप अन्य पनडुब्बियों में जा सकते हैं।

एक बार जब उपयोगकर्ता ने आपकी साइट के लिए पॉप-अप की अनुमति दे दी है, तो यह भी विचार करेगा कि क्या आप पॉप-अप को अधिक नहीं करते हैं। आखिरी चीज जो आप करना चाहते हैं, वह आपके आगंतुकों को परेशान करती है।


1
दुर्भाग्य से, कभी-कभी इस प्रश्न के अन्य सभी समाधान स्वीकार्य नहीं हैं - केवल यह एक। क्यों? क्योंकि वे सभी एक पॉपअप प्रदर्शित करने की कोशिश करते हैं - यह पता लगाने के लिए कि क्या पॉपअप सक्षम हैं या नहीं। अगर मैं इसे चुपचाप करना चाहता हूं तो क्या होगा?
सगई मान

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

1

मैंने @ केविन बी और @ डैनियलबी के समाधानों को संयुक्त किया।
यह बहुत सरल है।

var isPopupBlockerActivated = function(popupWindow) {
    if (popupWindow) {
        if (/chrome/.test(navigator.userAgent.toLowerCase())) {
            try {
                popupWindow.focus();
            } catch (e) {
                return true;
            }
        } else {
            popupWindow.onload = function() {
                return (popupWindow.innerHeight > 0) === false;
            };
        }
    } else {
        return true;
    }
    return false;
};

उपयोग:

var popup = window.open('https://www.google.com', '_blank');
if (isPopupBlockerActivated(popup)) {
    // Do what you want.
}

1
isPopupBlockerActivated फंक्शन कभी नहीं लौटता return (popupWindow.innerHeight > 0) === false;। जब आपका ब्राउज़र Chrome नहीं होता है तो आप गलत कार्य करते हैं। क्योंकि onload अतुल्यकालिक प्रक्रिया है। आपका फ़ंक्शन गलत है और फिर ऑनलोड निष्पादित किया गया है लेकिन इसका परिणाम कभी नहीं लौटाता है।
ओनोर गाज़ियोउलू

0

मैंने बहुत सारे समाधानों की कोशिश की है, लेकिन मैं केवल उसी के साथ काम कर सकता हूं, जो कि उब्लॉक ओरिजिन के साथ भी काम करता है, पॉपअप की बंद स्थिति की जांच करने के लिए एक टाइमआउट का उपयोग करके था।

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

जाहिर है कि यह एक हैक है; इस समस्या के सभी समाधान पसंद हैं।

प्रारंभिक उद्घाटन और समापन के लिए आपको अपने सेट टाइमआउट में पर्याप्त समय प्रदान करने की आवश्यकता है, इसलिए यह कभी भी पूरी तरह से सटीक नहीं होगा। यह परीक्षण और त्रुटि की स्थिति होगी।

इसे अपने प्रयासों की सूची में जोड़ें।


0

एक सरल तरीका यदि आप बाल कोड के मालिक हैं , तो नीचे दिए गए HTML में एक साधारण चर बनाना होगा:

    <script>
        var magicNumber = 49;
    </script>

और फिर निम्न के समान माता-पिता से इसके अस्तित्व की जांच करें:

    // Create the window with login URL.
    let openedWindow = window.open(URL_HERE);

    // Check this magic number after some time, if it exists then your window exists
    setTimeout(() => {
        if (openedWindow["magicNumber"] !== 32) {
            console.error("Window open was blocked");
        }
    }, 1500);

हम यह सुनिश्चित करने के लिए कुछ समय प्रतीक्षा करते हैं कि वेबपृष्ठ लोड किया गया है, और इसके अस्तित्व की जांच करें। जाहिर है, अगर खिड़की 1500ms के बाद लोड नहीं हुई, तो चर अभी भी होगा undefined


-1

Onbeforeunload घटना का उपयोग करके हम निम्नानुसार जांच कर सकते हैं

    function popup()
    {
        var chk=false;
        var win1=window.open();
        win1.onbeforeunload=()=>{
            var win2=window.open();
            win2.onbeforeunload=()=>{
                chk=true;
            };
        win2.close();
        };
        win1.close();
        return chk;
    }

यह पृष्ठभूमि में 2 काली खिड़कियां खोलेगा

फ़ंक्शन बूलियन मान लौटाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.