কোনও ব্রাউজার পপআপ ব্লক করছে কিনা তা আমি কীভাবে সনাক্ত করতে পারি?


130

মাঝে মধ্যে, আমি একটি ওয়েবপৃষ্ঠা জুড়ে এসেছি যা একটি নতুন উইন্ডো পপ করার চেষ্টা করে (ব্যবহারকারীর ইনপুট, বা গুরুত্বপূর্ণ কোনও কিছুর জন্য), তবে পপআপ ব্লকার এটি হতে বাধা দেয়।

নতুন উইন্ডোটি সঠিকভাবে চালু হয়েছে তা নিশ্চিত করার জন্য কলিং উইন্ডো কোন পদ্ধতিগুলি ব্যবহার করতে পারে?

উত্তর:


160

আপনি যদি পপআপ খুলতে জাভাস্ক্রিপ্ট ব্যবহার করেন তবে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

var newWin = window.open(url);             

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

ক্রোমের একটি উত্তর এখানে রয়েছে: ক্রোম -ব্লকড-পপআপ-ইন-ক্রোম
আজওয়াকা

@ উত্তরওয়ালা আপনি দয়া করে স্পষ্ট করে বলতে পারেন যদি এই উত্তরটি ক্রোমের জন্য ব্যর্থ হয়, বা অন্য কোনও উত্তর ক্রোমের চেয়ে ভাল হওয়ার কোনও কারণ রয়েছে? ধন্যবাদ!
ক্র্যাশলোট

@ আজওয়াকা কমপক্ষে আজ এই কোডটি ক্রোমে কাজ করছে বলে মনে হচ্ছে, সুতরাং প্রশ্ন।
ক্র্যাশলোট

@ ক্র্যাশলোট - আপনি আমাকে 6 বছর আগে এর উত্তর দিয়েছিলাম এমন কিছু সম্পর্কে জিজ্ঞাসা করছেন - দুঃখের সাথে আমি পরিস্থিতি আর মনে করতে পারি না এবং ব্রাউজারগুলি 6 বছরে অনেক দীর্ঘ পথ পাড়ি দিয়েছে।
আজওয়াকা

40

আমি উপরের কয়েকটি উদাহরণ চেষ্টা করেছি, তবে আমি সেগুলি ক্রোমের সাথে কাজ করতে পারি না। এই সহজ পদ্ধতির ক্রোম 39, ফায়ারফক্স 34, সাফারি 5.1.7 এবং IE 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.");
    }
}

1
@ সুরেন্দ্র দয়া করে, আপনি "কাজ না করে" বলতে কী বোঝাতে চান তা নির্দিষ্ট করতে পারেন? পার্স সময় একটি ত্রুটি? রানটাইম এ ত্রুটি? পপআপ খোলে তবে এটি ব্লকড হিসাবে চিহ্নিত করা হয়? পপআপটি ব্লক করা হয়েছে তবে এটি কি খোলা হিসাবে চিহ্নিত হয়েছে? এক্সপ্লোরার এটি ব্যর্থ হওয়ার কোনও কারণ আমি দেখতে পাচ্ছি না, যদি না এনইউএল-তে ফোকাস () কল করার অনুমতি না দেওয়া হয় তবে এই ক্ষেত্রে NUL এর জন্য পরীক্ষার চেষ্টা করার আগে কেবল একটি পরীক্ষা কার্যকর হবে।
ফ্রান্সেসকোএমএম

পপআপটি সফল হলেও, IE সর্বদা নালায় ফিরে আসে।
ডেভিন গারনার

34

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

অতীতে দুষ্ট সাইটগুলি পপআপগুলিকে প্রচুর অপব্যবহার করে। একটি খারাপ পৃষ্ঠা বিজ্ঞাপন সহ প্রচুর পপআপ উইন্ডো খুলতে পারে। সুতরাং এখন বেশিরভাগ ব্রাউজারগুলি পপআপগুলি অবরুদ্ধ করার এবং ব্যবহারকারীকে সুরক্ষিত করার চেষ্টা করে।

বেশিরভাগ ব্রাউজারগুলি পপআপগুলিকে ব্লক করে যদি তারা অনক্লিকের মতো ব্যবহারকারী-ট্রিগারযুক্ত ইভেন্ট হ্যান্ডলারগুলির বাইরে ডাকা হয়।

যদি আপনি এটি সম্পর্কে চিন্তা করেন, এটি কিছুটা কৃপণ। কোডটি যদি সরাসরি কোনও অন্লিক হ্যান্ডলারে থাকে তবে তা সহজ। কিন্তু সেটটাইমআউটে পপআপটি কী খোলে?

এই কোড ব্যবহার করে দেখুন:

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

পপআপটি Chrome এ খোলে তবে ফায়ারফক্সে অবরুদ্ধ হয়ে যায়।

… এবং এটি ফায়ারফক্সেও কাজ করে:

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

পার্থক্যটি হ'ল ফায়ারফক্স 2000 মিমি বা তার চেয়ে কম সময়ের একটি সময়সীমা গ্রহণযোগ্য হিসাবে গ্রহণযোগ্য, তবে এটির পরে - "বিশ্বাস" সরিয়ে দেয়, ধরে নিয়েছে যে এটি এখন "ব্যবহারকারীর ক্রিয়া বাইরে"। সুতরাং প্রথমটি অবরুদ্ধ, এবং দ্বিতীয়টি নয়।


আসল উত্তর যা বর্তমান ছিল 2012:

পপআপ ব্লকারের পরীক্ষার জন্য এই সমাধানটি এফএফ (ভি 11), সাফারি (ভি 6), ক্রোম (v23.0.127.95) এবং আইই (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

মনে রাখবেন যে পপআপ ইউআরএল যদি ডাউনলোডযোগ্য ফাইল হয় (যা Content-Disposition: attachment;প্রতিক্রিয়া শিরোনামে থাকে), পপআপটি তত্ক্ষণাত বন্ধ হয়ে যাবে, সুতরাং setTimeoutকোডটি ব্যর্থ হবে এবং ব্রাউজারটি অভিযোগ করবে যে "পপআপ ব্লকার সক্ষম হয়েছে!"। ক্রোমের জন্য, আমি @ ড্যানিয়েলবির সমাধানটি প্রস্তাব দিচ্ছি এবং এটি দুর্দান্ত কাজ করে।
wonsuc

1
@ উইনসুক একটি লিঙ্ক খোলার সময় Content-Disposition: attachment;শিরোনাম রয়েছে যাতে এটি আপনাকে পপআপে খোলার প্রয়োজন হয় না। আপনার ডাউনলোড করতে ইচ্ছুক সম্পদটির জন্য সরাসরি লিঙ্ক করুন এবং ব্রাউজারের নেটিভ আচরণ আপনাকে বর্তমান পৃষ্ঠা থেকে দূরে সরিয়ে আপনাকে ডাউনলোড করার অনুমতি দেবে।
কেভিন বি

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

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 টি কালো উইন্ডো খুলবে

ফাংশন বুলিয়ান মান প্রদান করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.