كيف يمكنني اكتشاف ما إذا كان المتصفح يحظر النافذة المنبثقة؟

StackOverflow https://stackoverflow.com/questions/2914

  •  08-06-2019
  •  | 
  •  

سؤال

في بعض الأحيان، أصادف صفحة ويب تحاول فتح نافذة جديدة (لإدخال المستخدم، أو شيء مهم)، ولكن مانع النوافذ المنبثقة يمنع حدوث ذلك.

ما الأساليب التي يمكن أن تستخدمها نافذة الاتصال للتأكد من تشغيل النافذة الجديدة بشكل صحيح؟

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم JavaScript لفتح النافذة المنبثقة، فيمكنك استخدام شيء مثل هذا:

var newWin = window.open(url);             

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

نصائح أخرى

لقد جربت عددًا من الأمثلة المذكورة أعلاه، لكن لم أتمكن من جعلها تعمل مع Chrome.يبدو أن هذا الأسلوب البسيط يعمل مع Chrome 39 وFirefox 34 وSafari 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.");
    }
}

تحديث:النوافذ المنبثقة موجودة منذ العصور القديمة حقًا.كانت الفكرة الأولية هي عرض محتوى آخر دون إغلاق النافذة الرئيسية.اعتبارًا من الآن، هناك طرق أخرى للقيام بذلك:جافا سكريبت قادرة على إرسال طلبات للخادم، لذلك نادرًا ما يتم استخدام النوافذ المنبثقة.لكن في بعض الأحيان لا يزالون في متناول اليد.

في الماضي، أساءت المواقع الشريرة استخدام النوافذ المنبثقة كثيرًا.يمكن أن تؤدي الصفحة السيئة إلى فتح العديد من النوافذ المنبثقة التي تحتوي على إعلانات.تحاول معظم المتصفحات الآن حظر النوافذ المنبثقة وحماية المستخدم.

تحظر معظم المتصفحات النوافذ المنبثقة إذا تم استدعاؤها خارج معالجات الأحداث التي يطلقها المستخدم مثل onclick.

إذا فكرت في الأمر، فهذا أمر صعب بعض الشيء.إذا كان الكود موجودًا مباشرة في معالج onclick، فهذا سهل.ولكن ما هي النافذة المنبثقة التي تفتح في setTimeout؟

جرب هذا الكود:

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

يتم فتح النافذة المنبثقة في Chrome، ولكن يتم حظرها في Firefox.

…وهذا يعمل في فايرفوكس أيضًا:

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

الفرق هو أن Firefox يتعامل مع المهلة التي تبلغ 2000 مللي ثانية أو أقل بشكل مقبول، ولكن بعد ذلك - يزيل "الثقة"، على افتراض أنها الآن "خارج نطاق إجراء المستخدم".إذن فالأول محظور والثاني ليس كذلك.


الإجابة الأصلية التي كانت موجودة في عام 2012:

تم اختبار هذا الحل لفحص مانع منبثقة في 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);

أتمنى أن يساعدك هذا!:)

"حل" واحد من شأنه أن يفعل ذلك دائماً العمل بغض النظر عن شركة المتصفح أو الإصدار هو ببساطة وضع رسالة تحذير على الشاشة، في مكان ما بالقرب من عنصر التحكم الذي سينشئ نافذة منبثقة، والتي تحذر المستخدم بأدب من أن الإجراء يتطلب نافذة منبثقة ويرجى تمكينه الموقع.

أعلم أن الأمر ليس خياليًا أو أي شيء من هذا القبيل، ولكن لا يمكن أن يكون الأمر أكثر بساطة ويتطلب اختبارًا لمدة 5 دقائق فقط، ثم يمكنك الانتقال إلى كوابيس أخرى.

بمجرد أن يسمح المستخدم بالنوافذ المنبثقة لموقعك، سيكون من المفيد أيضًا عدم المبالغة في استخدام النوافذ المنبثقة.آخر شيء تريد القيام به هو إزعاج زوار موقعك.

لقد جربت الكثير من الحلول، ولكن الحل الوحيد الذي تمكنت من التوصل إليه والذي نجح أيضًا مع uBlock Origin، كان من خلال استخدام المهلة للتحقق من حالة إغلاق النافذة المنبثقة.

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

من الواضح أن هذا اختراق.مثل كل الحلول لهذه المشكلة.

تحتاج إلى توفير ما يكفي من الوقت في setTimeout الخاص بك لحساب الافتتاح والإغلاق الأولي، لذلك لن يكون دقيقًا تمامًا.سيكون موقف التجربة والخطأ.

أضف هذا إلى قائمة المحاولات الخاصة بك.

باستخدام حدث 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;
    }

سيفتح نافذتين أسودتين في الخلفية

ترجع الدالة قيمة منطقية.

لقد قمت بدمج حلول @Kevin B وDanielB.
هذا أبسط بكثير.

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.
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top