جافاسكريبت - كيف يمكنني اكتشاف ما إذا كان المتصفح يحظر النوافذ المنبثقة؟
أحيانًا، أصادف صفحة ويب تحاول فتح نافذة جديدة (لإدخال المستخدم، أو شيء مهم)، لكن مانع النوافذ المنبثقة يمنع حدوث ذلك.
ما هي الطرق التي يمكن أن يستخدمها النافذة المستدعية للتأكد من أن النافذة الجديدة تم إطلاقها بشكل صحيح؟
الإجابة رقم 1
إذا استخدمت JavaScript لفتح النافذة المنبثقة، يمكنك استخدام شيء مثل هذا:
var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined')
{
//POPUP BLOCKED
}
الإجابة رقم 2
لقد جربت عددًا من الأمثلة أعلاه، لكن لم أتمكن من تشغيلها مع كروم. يبدو أن هذا النهج البسيط يعمل مع كروم 39، فايرفوكس 34، سفاري 5.1.7، وإنترنت إكسبلورر 11. إليك مقتطف الشيفرة من مكتبة جافا سكريبت الخاصة بنا.
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.");
}
}
الإجابة رقم 3
تحديث: النوافذ المنبثقة موجودة منذ عصور قديمة حقًا. كانت الفكرة الأساسية هي عرض محتوى آخر دون إغلاق النافذة الرئيسية. حتى الآن، هناك طرق أخرى للقيام بذلك: يمكن لجافاسكريبت إرسال طلبات إلى الخادم، لذلك نادراً ما تُستخدم النوافذ المنبثقة. ولكن أحيانًا لا تزال مفيدة.
في الماضي كانت المواقع الضارة تسيء استخدام النوافذ المنبثقة كثيراً. كانت الصفحة السيئة يمكن أن تفتح العديد من النوافذ المنبثقة التي تحتوي على إعلانات. لذلك الآن تحاول معظم المتصفحات حظر النوافذ المنبثقة وحماية المستخدم.
معظم المتصفحات تقوم بحظر النوافذ المنبثقة إذا تم استدعاؤها خارج معالجات الأحداث التي يطلقها المستخدم مثل النقر.
إذا فكرت في الأمر، فهذا صعب بعض الشيء. إذا كان الكود موجودًا مباشرة في معالج onclick، فهذا سهل. لكن ماذا لو افتتح النافذة المنبثقة في setTimeout؟
جرب هذا الكود:
// open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);
تفتح النافذة المنبثقة في كروم، ولكن يتم حظرها في فايرفوكس.
…وهذا يعمل في فايرفوكس أيضًا:
// open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);
الفرق هو أن فايرفوكس يعتبر أن مهلة 2000 مللي ثانية أو أقل مقبولة، ولكن بعد ذلك - يزيل "الثقة"، بافتراض أنها الآن "خارج تصرف المستخدم". لذلك الأول يتم حظره، والثاني لا يتم حظره.
الإجابة الأصلية التي كانت سارية في عام 2012:
تم اختبار هذا الحل للتحقق من مانع النوافذ المنبثقة في فايرفوكس (الإصدار 11)، وسفاري (الإصدار 6)، وكروم (الإصدار 23.0.127.95) وإنترنت إكسبلورر (الإصدار 7 و 9). قم بتحديث دالة 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);
آمل أن يكون هذا مفيدًا! :)
الإجابة رقم 4
إحدى "الحلول" التي ستعمل دائمًا بغض النظر عن شركة المتصفح أو الإصدار هي ببساطة وضع رسالة تحذير على الشاشة، في مكان ما قريب من عنصر التحكم الذي سينشئ نافذة منبثقة، تحذر المستخدم بأدب من أن الإجراء يتطلب نافذة منبثقة وأنه يُرجى تمكينها للموقع.
أعلم أنه ليس فخمًا أو أي شيء من هذا القبيل، لكنه لا يمكن أن يكون أبسط من ذلك ويتطلب حوالي 5 دقائق فقط للاختبار، ثم يمكنك الانتقال إلى كوابيس أخرى.
بمجرد أن يسمح المستخدم بالنوافذ المنبثقة لموقعك، سيكون من اللطيف أيضًا إذا لم تفرط في استخدام النوافذ المنبثقة. آخر شيء ترغب في فعله هو إزعاج زوارك.
