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


103

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

var newWin = window.open(url);

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

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

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

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

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

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


Yoav, पॉप अप अवरुद्ध है या नहीं, इसकी परवाह किए बिना स्थान वही दिखाता है। किसी और के पास एक उत्तर है जो उपयोगकर्ता को 3.5 सेकंड प्रतीक्षा करने में शामिल नहीं करता है?

अदृश्यबेकन और एंडी के नवीनतम समाधान क्रोम 10 में काम नहीं करते हैं: "क्रोम के लिए विफल" संदेश प्रकट होता है भले ही परीक्षण पॉप-अप सफलतापूर्वक प्रदर्शित किया गया हो। कोई उपाय?

मुझे लगता है कि एक नया प्रश्न क्रम में होगा क्योंकि इनमें से कुछ समाधान केवल क्रोम के शुरुआती संस्करणों के साथ काम करते हुए दिखाई देते हैं।
ब्रायन फील्ड

1
@ जॉर्ज बोले मैं सहमत हूं, लेकिन सिर्फ स्पष्ट होने के लिए, उनमें से कुछ क्रोम (19) के वर्तमान संस्करण में काम करते हैं। एंड्रॉइड (या स्क्रीनएक्स, जैसा कि दूसरों ने सुझाव दिया है) का उपयोग करने का एंड्रयू का मूल विचार सेटटाइम दृष्टिकोण के साथ मिलकर मेरे लिए ठीक काम कर रहा है। लेकिन, हां, जब तक मैंने खुद का परीक्षण नहीं किया, तब तक इन सभी उत्तरों की समझ बनाने की कोशिश करना वास्तव में भ्रामक था।
नियमित '20

इसे आज़माएँ: stackoverflow.com/a/31299484/1927014
व्लादा

जवाबों:


66

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

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

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

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

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


धनी, आप एक जावास्क्रिप्ट पॉपअप गुरु हैं। धन्यवाद। ठीक वैसा ही मुझे चाहिए।
एंड्रयू एन्स्ले

4
इस पर कोई अपडेट? अब और काम नहीं कर रहा है ... विशेष रूप से क्रोम में
क्रिस वैगनर

मुझे लगता है कि मुझे क्रोम के नए संस्करणों के लिए यह काम करने का एक तरीका मिला। विवरण के लिए मेरा उत्तर देखें।
अदृश्यबोन

2
असल में क्रोम में एक बग है। हालाँकि यह पॉपअप छुपाता है, फिर भी यह निष्पादित होता है और आपको अभी भी विंडो ऑब्जेक्ट वापस मिल जाता है - इसलिए नियमित जांच से काम नहीं चलता है। यहाँ समाधान है कि मेरे लिए काम किया है: var popup = window.open (url); if (पॉपअप) {popup.onload = function () {कंसोल.लॉग (popup.innerHeight> 0; 'open': 'block'); }} और {कंसोल.लॉग ('अवरुद्ध'); } यहां काम कर रहे उदाहरण: jsbin.com/uticev/3
रेमी शार्प

1
यह उत्तर अब सही नहीं है, कृपया इसे @Predrag Stojadinović के उत्तर में बदल दें
लुकास बी

16

अदृश्यबाकॉन के स्निपेट में केवल एक सुधार (IE9, सफारी 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);
    };
}

पॉपअप की अनुमति होने पर खिड़की क्यों बंद करें? क्या वह पॉपअप बंद नहीं होगा जिसे आप पहले स्थान पर खोलना चाहते थे?
११

3
JQuery का उपयोग, ओनलोड के बजाय, मैं $ (myPopup) करूँगा। पहले से ही ()। स्थानीय रूप से मेरा IE बहुत तेज़ था, और "ऑनलोड" पहले ही हो चुका था।
मैट कॉनटोली

12

निम्नलिखित पॉपअप ब्लॉकर जाँच के लिए एक jQuery समाधान है। FF (v11), Safari (v6), Chrome (v23.0.127.95) और IE (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);

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


यह वास्तव में मददगार है। साझा करने के लिए धन्यवाद।
सुवेंदु शेखर गिरि

आपका स्वागत है सुवेन्दु, मुझे खुशी है कि आपने इसे उपयोगी पाया! हैप्पी कोडिंग! :)
केविन बी

1
मैंने इस कोड को उस url के आस-पास / उसके आसपास घुमा दिया जिसे खोलने का प्रयास किया जा रहा है। यह _displayError () मेथड को अलर्ट प्रदर्शित करने की विधि देता है (मैं टोस्टर का उपयोग कर रहा हूं) उपयोगकर्ता को सूचित करता है कि एक समस्या है और एक क्लिक करने योग्य लिंक प्रदान करें जो कि सीधा लिंक होने के कारण अधिकांश ब्लॉकर्स को दरकिनार कर देगा। साझा करने के लिए धन्यवाद!!
टायलर फोर्सिथे सेप

@TylerForsythe क्या आपके पास अपने समाधान के बारे में कोई और जानकारी है? सामग्री को सीधे क्लिक करने योग्य लिंक प्रदान करने में सक्षम होना पसंद करेंगे।
जोशुआ डांस

1
@JoshuaDance यहाँ एक gist है जिसे मैंने अपने संशोधित कोड को प्रदर्शित करने के लिए बनाया है और मैं इसे कैसे लागू करता हूं। आशा करता हूँ की ये काम करेगा! gist.github.com/tylerforsythe/452ceaad62f507d7cb7bd7ddbffe650c
Tyler Forsythe

10

रिच का जवाब क्रोम के लिए अब काम नहीं करने वाला है। ऐसा लगता है कि Chrome वास्तव में अब पॉपअप विंडो में किसी भी जावास्क्रिप्ट को निष्पादित करता है। मैंने अवरुद्ध पॉपअप के लिए जाँच करने के लिए 0 के स्क्रीनएक्स मान की जाँच समाप्त कर दी है। मुझे यह भी लगता है कि मुझे यह गारंटी देने का एक तरीका मिल गया कि जाँच से पहले यह संपत्ति अंतिम है। यह केवल आपके डोमेन पर पॉपअप के लिए काम करता है, लेकिन आप इस तरह एक ऑनलोड हैंडलर जोड़ सकते हैं:

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

जैसा कि कई ने बताया है, "स्क्रीनएक्स" संपत्ति कभी-कभी असफल पॉपअप के लिए गैर-शून्य रिपोर्ट करती है, यहां तक ​​कि ऑनलोड के बाद भी। मैंने इस व्यवहार को भी अनुभव किया है, लेकिन यदि आप शून्य एमएस टाइमआउट के बाद चेक जोड़ते हैं, तो स्क्रीनएक्स संपत्ति हमेशा एक सुसंगत मूल्य का उत्पादन करती है।

मुझे बताएं कि क्या इस स्क्रिप्ट को और अधिक मजबूत बनाने के तरीके हैं। हालांकि मेरे उद्देश्यों के लिए काम करने लगता है।


यह मेरे लिए नहीं है, onloadकभी नहीं आग।
पत्ती

9

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

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

आउटरहाइट और आउटरविथ क्रोम के लिए हैं क्योंकि ऊपर से 'लगभग: रिक्त' चाल क्रोम में काम नहीं करती है।


1
क्रोम परिवर्तनों पर अच्छी पकड़ और इसे यहां अपडेट करने के लिए धन्यवाद। आपका उत्तर सही होना चाहिए।
लुकास बी

आउटरविदथ और आउटरहाइट क्रोम में भी काम नहीं करता है
रोमन

5

मैं यहां दिए गए उत्तर को कॉपी / पेस्ट करने जा रहा हूं: https://stackoverflow.com/a/27725432/892099 डैनियलबी द्वारा। क्रोम 40 पर काम करता है और यह बहुत साफ है। कोई गंदा हैक या प्रतीक्षा शामिल नहीं है।

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

एक Promiseदृष्टिकोण के बारे में कैसे ?

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

और आप इसे क्लासिक की तरह उपयोग कर सकते हैं window.open

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

आप कोड को बदल सकते हैं ताकि यह वापस लौटने के बजाय वादे को विफल कर दे undefined, मैंने अभी सोचा था कि इस मामले की ifतुलना में एक आसान नियंत्रण प्रवाह था try / catch


यह क्रोम एक्सटेंशन एडब्लॉकर्स का पता लगाने के लिए काम करता है। +1
मिचेल सी वालेस

2

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


मैं कोशिश करूँगा और आपको मेरे परिणाम बताऊंगा। धन्यवाद।
एंड्रयू एनस्ले

पॉपअप "अवरुद्ध" होने पर Google Chrome बाएं और शीर्ष ऑफ़सेट को 0 के रूप में रिपोर्ट करता है। मुझे लगा कि यह मेरा स्वर्णिम टिकट है, लेकिन नहीं। वास्तव में खुलने के तुरंत बाद यह 0 के रूप में ऑफसेट की रिपोर्ट करता है। खोलने के बाद भविष्य में कुछ जादुई बिंदु पर, ऊपर और बाएं ऑफसेट को सही ढंग से सूचित किया जाता है।
एंड्रयू एन्सले

मेरी पोस्ट को ऐसे तरीके से जांचें जो यह गारंटी देता है कि चेक करने से पहले ऑफ़सेट सेट किए गए हैं।
अदृश्यबाकन

2

मुझे क्रोम में न खुलने वाले पॉपअप के साथ भी ऐसी ही समस्या थी। मैं निराश था क्योंकि मैं कुछ डरपोक करने की कोशिश नहीं कर रहा था, जैसे कि एक onload पॉपअप, बस एक विंडो खोलना जब उपयोगकर्ता ने क्लिक किया। मैं वास्तव में निराश था क्योंकि मेरे फंक्शन को चलाने के लिए जिसमें फायरबग कमांड लाइन से window.open () शामिल था, ने काम किया, जबकि वास्तव में मेरे लिंक पर क्लिक नहीं किया! यहाँ मेरा समाधान था:

गलत तरीका: एक ईवेंट श्रोता (मेरे मामले में, dojo.connect एक DOM नोड के ऑनक्लिक इवेंट मेथड) से चल रहा है।

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

सही तरीका: नोड की onclick संपत्ति को एक फ़ंक्शन असाइन करना, जिसे window.open () कहा जाता है।

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

और, निश्चित रूप से, मैं अभी भी उसी onclick घटना के लिए श्रोताओं घटना कर सकते हैं अगर मुझे जरूरत है। इस परिवर्तन के साथ, मैं अपनी खिड़कियां खोल सकता था, भले ही क्रोम "किसी भी साइट को पॉप-अप दिखाने की अनुमति न दें" पर सेट था। जोय।

अगर क्रोम के तरीकों में कोई भी समझदार बाकी लोगों को बता सकता है कि इससे फर्क क्यों पड़ता है, तो मैं इसे सुनना पसंद करूंगा, हालांकि मुझे संदेह है कि यह दुर्भावनापूर्ण प्रोग्रामेटिक पॉपअप पर दरवाजा बंद करने का प्रयास है।


अपना समाधान साझा करने के लिए धन्यवाद। यह काम करता हैं। क्रोम में पॉप-अप खोलने का यह सबसे अच्छा और सबसे साफ तरीका है। आपका जवाब शीर्ष पर होना चाहिए। बाकी समाधान सिर्फ "गंदे" हैक हैं।
मंदीप जंजुआ

2

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

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 सेकंड बहुत सुरक्षित होना चाहिए)।


2

यह टुकड़ा उपरोक्त सभी को शामिल करता है - किसी कारण से - स्टैकऑवरफ्लो नीचे दिए गए कोड ब्लॉक में कोड की पहली और आखिरी लाइनों को छोड़कर है, इसलिए मैंने इस पर एक ब्लॉग लिखा। एक पूर्ण विवरण और बाकी (डाउनलोड करने योग्य) कोड के लिए मेरे ब्लॉग पर 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();

2

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

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

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

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

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


2
मैं सर्वोत्तम प्रथाओं को जानता हूं, लेकिन मैं ऐसी स्थिति में हूं जहां मुझे इस कार्य को पूरा करने की आवश्यकता है। यही कारण है कि मैंने यह सवाल पूछा और मुझे "नहीं करना चाहिए?"
एंड्रयू एनस्ले

1

नमस्ते

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

मैंने इसे अपनी 'मुख्य' विंडो के अनुभाग में रखा

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

इस तरह दिखता है:

<!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 एमएस के बाद पॉपअप-पेज पर टेस्ट-फंक्शन को कॉल किया है, ताकि क्रोम द्वारा इनरहाइट सही ढंग से सेट किया गया हो।

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

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

यह दुर्भाग्य से उस पृष्ठ को मानता है जिसे आप पॉप अप करने की कोशिश कर रहे हैं जो हमारे द्वारा नियंत्रित किया जाता है। मुझे एक बाहरी पृष्ठ खोलने की आवश्यकता है जिसका मेरे पास कोई नियंत्रण नहीं है।
रोमन

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

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

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

स्थान अभी भी "के बारे में: रिक्त" होगा पॉप-अप के लिए भी जो अवरुद्ध नहीं है। मैंने Chrome v28.0.1500.72
रोमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.