Chrome এ অবরুদ্ধ পপআপ সনাক্ত করুন


103

অন্যান্য ব্রাউজারগুলিতে পপআপ ব্লক করা হয়েছে কিনা তা সনাক্ত করার জন্য আমি জাভাস্ক্রিপ্ট কৌশল সম্পর্কে সচেতন ( এই প্রশ্নের উত্তরে বর্ণিত )) এখানে বেসিক পরীক্ষা:

var newWin = window.open(url);

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

তবে এটি ক্রোমে কাজ করে না। পপআপ অবরুদ্ধ থাকা অবস্থায় "পপআপ ব্লকড" বিভাগটি কখনই পৌঁছায় না।

অবশ্যই, পরীক্ষাটি একটি পরিমাণে কাজ করছে যেহেতু ক্রোম প্রকৃতপক্ষে পপআপটিকে অবরুদ্ধ করে না, তবে নীচের ডানদিকে একটি ছোট ছোট উইন্ডোতে এটি খুলবে যা "অবরুদ্ধ" পপআপগুলি তালিকাভুক্ত করে।

আমি যা করতে চাই তা বলতে সক্ষম হ'ল পপআপটি ক্রোমের পপআপ ব্লকার দ্বারা আটকানো হয়েছে কিনা। আমি বৈশিষ্ট্য সনাক্তকরণের পক্ষে ব্রাউজার স্নিফিং এড়ানোর চেষ্টা করি। ব্রাউজার স্নিফিং ছাড়া এটি করার কোনও উপায় আছে?

সম্পাদনা : আমি এখন নির্মানের ব্যবহার চেষ্টা করেছি newWin.outerHeight, newWin.leftএবং অন্যান্য অনুরূপ বৈশিষ্ট্য এই কাজ করা সম্ভব। গুগল ক্রোম যখন পপআপ অবরুদ্ধ থাকে তখন সমস্ত অবস্থান এবং উচ্চতার মানগুলিকে 0 হিসাবে ফিরিয়ে দেয়।

দুর্ভাগ্যক্রমে, পপআপটি আসলে অজানা সময়ের জন্য খোলা থাকলেও এটি একই মানগুলি প্রদান করে। কিছু মায়াবী সময়কালের পরে (আমার পরীক্ষার কয়েক সেকেন্ডে), অবস্থান এবং আকারের তথ্য সঠিক মান হিসাবে ফিরে আসে। অন্য কথায়, আমি এখনও এটি সন্ধানের কাছাকাছি নেই কোন সাহায্য প্রশংসা করা হবে।


Yoav, পপ আপ ব্লক করা আছে কিনা তা নির্বিশেষে অবস্থানটি একই দেখায়। অন্য কারওও একটি উত্তর আছে যা ব্যবহারকারীর সাথে 3.5 সেকেন্ড অপেক্ষা করতে জড়িত না?

ইনভিজেবলব্যাকন এবং অ্যান্ডির সর্বশেষ সমাধানগুলি ক্রোম 10 এ কাজ করে না: "ক্রোমের জন্য ব্যর্থ" বার্তাটি প্রদর্শিত হবে এমনকি টেস্ট পপ-আপ সফলভাবে প্রদর্শিত হয়েছিল। কোন ধারণা?

আমি মনে করি যে একটি নতুন প্রশ্ন ক্রমযুক্ত হবে কারণ এর মধ্যে কয়েকটি সমাধান ক্রোমের প্রাথমিক সংস্করণগুলির সাথে কেবল কাজ করেছে।
ব্রায়ান ফিল্ড

1
@ জর্জি বেইলি আমি একমত, তবে কেবল স্পষ্ট করে বলতে গেলে তাদের মধ্যে কিছু ক্রোমের বর্তমান সংস্করণে কাজ করে (১৯) অ্যান্ড্রুর আসল ধারণাটি আউটআরহাইট (বা স্ক্রিনএক্স, যেমন অন্যরা পরামর্শ দিয়েছেন) সেটটাইমআউট পদ্ধতির সাথে একত্রিত হয়ে আমার পক্ষে ভাল কাজ করছে। তবে, হ্যাঁ, আমি নিজের পরীক্ষা না করা পর্যন্ত এই সমস্ত উত্তরকে বোঝার চেষ্টা করা সত্যিই বিভ্রান্তিকর ছিল।
নিয়মিত মেক

এটি চেষ্টা করুন: স্ট্যাকওভারফ্লো.com
31299484

উত্তর:


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).load(function() {
  this.opener.postMessage({'loaded': true}, "*");
  this.close();
});

অভিভাবকরা এই বার্তাটি ব্যবহার করে শোনেন:

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

আশাকরি এটা সাহায্য করবে.


ধনী, আপনি একজন জাভাস্ক্রিপ্ট পপআপ গুরু। ধন্যবাদ. আমার যা প্রয়োজন তা হ'ল।
অ্যান্ড্রু এনসলি

4
এই সম্পর্কে কোন আপডেট? আর কাজ করে না বলে মনে হচ্ছে ... বিশেষত ক্রোমে
ক্রিস ওয়াগনার

আমি মনে করি Chrome এর নতুন সংস্করণগুলির জন্য এই কাজটি করার একটি উপায় খুঁজে পেয়েছি। বিস্তারিত জানার জন্য আমার উত্তর দেখুন।
অদৃশ্যব্যাকন

2
মূলত ক্রোমে একটি বাগ রয়েছে। যদিও এটি পপআপটি আড়াল করে, এটি এখনও কার্যকর করে এবং আপনি এখনও উইন্ডো অবজেক্টটি ফিরে পান - তাই নিয়মিত চেকগুলি কাজ করে না। আমার জন্য কাজ করা সমাধানটি এখানে: var পপআপ = উইন্ডো.ওপেন (ইউআরএল); যদি (পপআপ) {popup.onload = ফাংশন () {কনসোল.লগ (popup.innerHeight> 0? 'খোলা': 'অবরুদ্ধ'); ;} else {কনসোল.লগ ('অবরুদ্ধ'); এখানে কার্যকারী উদাহরণ: jsbin.com/uticev/3
রেমি শার্প

1
এই উত্তরটি এখন আর সঠিক নয়, দয়া করে এটিকে @ প্র্রেড স্টোজাদিনোভিয়ের জবাবে পরিবর্তন করুন
লুকাস বি

16

ইনভিজেবলব্যাকন স্নিপেটে কেবলমাত্র একটি উন্নতি হয়েছে (আই 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);
    };
}

পপআপগুলি অনুমোদিত হলে উইন্ডোটি বন্ধ করুন কেন? আপনি যে পপআপটি প্রথম স্থানে খুলতে চেয়েছিলেন তা কি বন্ধ হবে না?
এলেমজয়

3
JQuery ব্যবহার করে, অনলোডের পরিবর্তে, আমি $ (মাইপপআপ) করব ready প্রস্তুতি ()। স্থানীয়ভাবে চালানো আমার আইই খুব দ্রুত এবং "অনলোড" ইতিমধ্যে ঘটেছে।
ম্যাট কনলি

12

নীচে পপআপ ব্লকার চেক করার একটি jQuery সমাধান রয়েছে। এটি এফএফ (ভি 11), সাফারি (ভি 6), ক্রোম (v23.0.127.95) এবং আইই (ভি 7 এবং ভি 9) পরীক্ষিত হয়েছে। আপনি ফিট হিসাবে দেখতে ত্রুটি বার্তাটি হ্যান্ডেল করতে _ডিসপ্লেআরার ফাংশন আপডেট করুন।

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
ইউআরএলটি খোলার চেষ্টা করা হচ্ছে / তার চারপাশে পাস করার জন্য আমি এই কোডটি টুইট করেছি। এটি _ডিসপ্লেআরার () পদ্ধতিটি সতর্কতা প্রদর্শনের জন্য (আমি টোস্টার ব্যবহার করছি) ব্যবহারকারীকে জানিয়ে দিচ্ছে যে এখানে একটি সমস্যা রয়েছে এবং একটি ক্লিকযোগ্য লিঙ্ক সরবরাহ করতে পারে যা এটি সরাসরি লিঙ্ক হওয়ায় বেশিরভাগ ব্লকারকে আটকায়। ভাগ করে নেওয়ার জন্য ধন্যবাদ!!
টাইলার ফোরসিত

@ টাইলারফোর্সটি আপনার সমাধান সম্পর্কে আরও কোনও তথ্য আছে? সামগ্রীতে সরাসরি ক্লিকযোগ্য লিঙ্ক সরবরাহ করতে সক্ষম হতে চাই।
জোশুয়া ডান্স

1
@ জোশুয়াড্যান্স এখানে একটি সংক্ষিপ্ত বিবরণ রয়েছে যা আমি স্রেফ আমার সংশোধিত কোডটি প্রদর্শন করতে এবং এটিতে কীভাবে আবেদন করছি। আশা করি এটা সাহায্য করবে! gist.github.com/tylerforsythe/452ceaad62f507d7cb7bd7ddbffe650c
টাইলার

10

রিচের উত্তর ক্রোমের জন্য আর কাজ করবে না। দেখে মনে হচ্ছে ক্রোম আসলে পপআপ উইন্ডোয় যে কোনও জাভাস্ক্রিপ্ট কার্যকর করে। আমি অবরুদ্ধ পপআপগুলি পরীক্ষা করতে 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

পিতা-মাতার তুলনায় উইন্ডোর অবস্থান পরীক্ষা করুন। ক্রোম উইন্ডোটিকে প্রায় অফ-স্ক্রিনে উপস্থিত করে তোলে ।


আমি এটি চেষ্টা করব এবং আপনাকে আমার ফলাফলগুলি জানাতে দেব। ধন্যবাদ।
অ্যান্ড্রু এনসলে

গুগল ক্রোম যখন পপআপ "অবরুদ্ধ" থাকে তখন বাম এবং শীর্ষ অফসেটগুলি 0 হিসাবে প্রতিবেদন করে। আমি ভেবেছিলাম এটি আমার সোনার টিকিট, তবে নেই। এটি প্রকৃতপক্ষে খোলার সাথে সাথেই অফসেটগুলি 0 হিসাবে প্রতিবেদন করেছে। খোলার পরে ভবিষ্যতে কিছু যাদুবিদ্যায় শীর্ষ এবং বাম অফসেটগুলি সঠিকভাবে রিপোর্ট করা হয়।
অ্যান্ড্রু এনসলে

আমার পোস্টটি এমনভাবে পরীক্ষা করুন যা দেখে মনে হয় যে চেক করার আগে অফসেটগুলি সেট করা আছে।
ইনভিজেবলব্যাকন

2

পপআপগুলি ক্রোমে না খোলার বিষয়ে আমার একই সমস্যা ছিল। আমি হতাশ হয়ে পড়েছিলাম কারণ আমি কোনও লোড পপআপের মতো লুক্কায়িত কিছু করার চেষ্টা করছিলাম না, যখন ব্যবহারকারী ক্লিক করলে কেবল একটি উইন্ডো খোলার চেষ্টা করছিল। আমি হতাশ হয়ে পড়েছিলাম কারণ আমার ফাংশনটি চালানো যা ফায়ারব্যাগ কমান্ড লাইন থেকে উইন্ডো.ওপেন () অন্তর্ভুক্ত করেছিল, যখন আমার লিঙ্কটিতে আসলে ক্লিক করা হয়নি! এখানে আমার সমাধান ছিল:

ভুল উপায়: একটি ইভেন্ট শ্রোতার কাছ থেকে উইন্ডো.ওপেন () চালানো (আমার ক্ষেত্রে, একটি ডিওএম নোডের অনক্লিক ইভেন্ট পদ্ধতিতে dojo.con সংযুক্ত)।

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

সঠিক উপায়: নোডের অনক্লিক সম্পত্তিটিতে একটি ফাংশন বরাদ্দ করা হচ্ছে যা উইন্ডো.ওপেন () বলে।

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

এবং, অবশ্যই, যদি আমার প্রয়োজন হয় আমি এখনও একই অনক্লিক ইভেন্টের জন্য ইভেন্ট শ্রোতাদের করতে পারি। এই পরিবর্তনটির সাথে, আমি আমার উইন্ডোগুলি খুলতে পারি যদিও ক্রোম "কোনও সাইটকে পপ-আপগুলি দেখানোর অনুমতি দেবেন না" সেট করা থাকলেও। আনন্দ.

যদি ক্রোমের পদ্ধতিতে বুদ্ধিমান কেউ যদি আমাদের বাকী অংশগুলিকে এটি কেন পার্থক্য করে তা বলতে পারে তবে আমি এটি শুনতে খুব পছন্দ করব, যদিও আমি সন্দেহ করি যে এটি দূষিত প্রোগ্রামেটিক পপআপগুলিতে দরজা বন্ধ করার চেষ্টা মাত্র।


আপনার সমাধান ভাগ করে নেওয়ার জন্য ধন্যবাদ। এটা কাজ করে। ক্রোমে পপ-আপগুলি খোলার এটি সর্বোত্তম এবং সবচেয়ে পরিষ্কার উপায়। আপনার উত্তর শীর্ষে থাকা উচিত। বাকী সমাধানগুলি কেবল "নোংরা" হ্যাক।
মনদীপ জানজুয়া

2

এখানে একটি সংস্করণ যা বর্তমানে ক্রোমে কাজ করছে's রিচের সমাধান থেকে কেবল একটি ছোট্ট পরিবর্তন, যদিও আমি একটি মোড়কে যুক্ত করেছিলাম যা সময়টিও পরিচালনা করে।

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

এই খণ্ডটি উপরের সমস্তগুলি অন্তর্ভুক্ত করে - কোনও কারণে - স্ট্যাকওভারফ্লো নীচের কোড ব্লকে কোডের প্রথম এবং শেষ লাইনগুলি বাদ দিচ্ছে, তাই আমি এটিতে একটি ব্লগ লিখেছিলাম। সম্পূর্ণ ব্যাখ্যার জন্য এবং বাকী (ডাউনলোডযোগ্য) কোডটির জন্য আমার ব্লগটি একবার দেখুন দেখুন কোডোডোবড.ব্লগস্পট.কম

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

জেসনের উত্তরটি কেবলমাত্র আমিই ভাবতে পারি তবে এটির মতো অবস্থানের উপর নির্ভর করা কিছুটা দ্বিধায় পড়ে যায়!

এই দিনগুলিতে, আপনাকে সত্যিই প্রশ্নটি জিজ্ঞাসা করার দরকার নেই "উত্তরটি আমার অবাঞ্ছিত পপআপ অবরুদ্ধ ছিল?", কারণ উত্তরটি হ'ল "হ্যাঁ" - সমস্ত প্রধান ব্রাউজারেই ডিফল্টরূপে পপআপ ব্লকার চালু করে দেয়। ডাইরেক্ট ক্লিকের প্রতিক্রিয়া হিসাবে উইন্ডো.ওপেন () -তে সর্বদা সেরা পন্থা থাকে, যা প্রায় সর্বদা অনুমোদিত।


2
আমি সেরা অনুশীলন ইত্যাদি জানি, তবে আমি এমন পরিস্থিতিতে আছি যেখানে আমার এই কাজটি সম্পাদন করা দরকার। এই কারণেই আমি এই প্রশ্নটি জিজ্ঞাসা করেছি এবং "আমার উচিত নয়?"
অ্যান্ড্রু এনসলে

1

ওহে

আমি উপরে বর্ণিত সমাধানগুলিকে কিছুটা সংশোধন করেছি এবং মনে করি এটি কমপক্ষে Chrome এর জন্য কাজ করছে। আমার পৃষ্ঠাটি পপআপটি ব্লক করা হয়েছে কিনা তা সনাক্ত করার জন্য তৈরি করা হয়েছে যখন প্রধান পৃষ্ঠাটি খোলা হয়, পপআপ খোলার সময় নয়, তবে আমি নিশ্চিত যে এখানে কিছু লোক রয়েছে যা এটি পরিবর্তন করতে পারে: :-) এখানে অপূর্ণতাটি পপআপ-উইন্ডো প্রদর্শিত হয়েছে যখন পপআপ-ব্লকার নেই তখন কয়েক সেকেন্ডের জন্য (কিছুটা ছোট করা সম্ভব হতে পারে)।

আমি এটি আমার 'মূল' উইন্ডোর অংশে রেখেছি

<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 এমএসের অভ্যন্তরীণ উচ্চতাটি Chrome দ্বারা সঠিকভাবে সেট করা হয়েছে।

অন্যান্য জাভাস্ক্রিপ্টগুলিতে পপআপগুলি প্রদর্শিত হয় কিনা তা জানতে আমি ভেরিয়েবল পপআপস ব্লক ব্যবহার করি। অর্থাত

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
}

এমনকি পপ-আপের জন্য এমনকি অবরুদ্ধ নয় এমন স্থানটি এখনও "সম্পর্কে: ফাঁকা" থাকবে। আমি ক্রোম v28.0.1500.72
রোমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.