ব্রাউজার ট্যাবটিতে ফোকাস রয়েছে কিনা তা সনাক্ত করুন


149

কোনও ট্যাবটিতে ফোকাস রয়েছে তা সনাক্ত করার জন্য একটি নির্ভরযোগ্য ক্রস ব্রাউজার উপায় আছে কি?

দৃশ্যমান পরিস্থিতিটি হ'ল আমাদের কাছে একটি অ্যাপ্লিকেশন রয়েছে যা নিয়মিত স্টকের দামের জন্য পোল করে এবং পৃষ্ঠায় ফোকাস না থাকলে আমরা ভোটদান বন্ধ করতে এবং ট্রাফিকের শব্দকে সবাইকে বাঁচাতে পারি, বিশেষত লোকেরা বিভিন্ন পোর্টফোলিও সহ কয়েকটি ট্যাব খোলার ভক্ত are

কি window.onblurএবং window.onfocusএই জন্য একটি বিকল্প?


উত্তর:


127

হ্যাঁ, window.onfocusএবং window.onblurআপনার দৃশ্যের জন্য কাজ করা উচিত:

http://www.thefutureoftheweb.com/blog/detect-browser-window-focus


3
এটির অনফোকসিন / অনফোকসআউট দিক এবং আপনি যে ব্যবহারকারীকে বিরতি দিয়েছিলেন তা বলার বিষয়ে নোটটি আসলেই ভাল নোট। ধন্যবাদ।
ফেন্টন

7
দয়া করে নোট করুন যে আপনি পৃষ্ঠা লোডে পৃষ্ঠাটি সক্রিয় বা নিষ্ক্রিয় হওয়ার মধ্যে পার্থক্য করতে পারবেন না।
pimvdb

@ স্টিভেফেন্টন - onfocusক্রসব্রোজার, যেখানে আপনি উল্লিখিত ইভেন্টগুলি কেবলমাত্র আইই, আমি কেন দেখতে পাচ্ছি না কেন এটি আপনার দ্বারা একটি ভাল নোট হিসাবে বিবেচিত হবে ..
ভাইস্যাঙ্ক

1
@vsync - লিঙ্কযুক্ত নিবন্ধটি পড়ুন, আপনি দেখতে পাবেন এটি 'অনফোকসিন' এবং 'অনফোকস' উভয়ই ব্যবহার করে
ফেন্টন

আপনি অন্তত দুজনের মধ্যে পার্থক্য উল্লেখ করতে পারেন?
লেনার হোয়েট

53

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


var focused = true;

window.onfocus = function() {
    focused = true;
};
window.onblur = function() {
    focused = false;
};

আফাইক, focusএবং blurসমস্ত ... সবকিছুতে সমর্থিত ( http://www.quirksmode.org/dom/events/index.html দেখুন )


2
জাভাস্ক্রিপ্ট পুরোপুরি লোড হওয়ার আগে আপনি ব্যবহারকারীদের ট্যাব পরিবর্তন করার ঝুঁকিটি চালান, এইভাবে সমাধানটির জন্য ভুল মান নির্ধারণ করুন। এটির আশেপাশে একটি ভাল উপায় আছে তা নিশ্চিত নয়।
JayD3e

আপডেট লিঙ্কগুলি হ'ল আমি যা খুঁজছিলাম। তাদের যোগ করার জন্য ধন্যবাদ!
webLacky3rdClass

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

1
এটি একটি বিপজ্জনক সমাধান কারণ এটি আরও বড় অ্যাপ্লিকেশনটিতে অন্য কিছু ইভেন্ট শ্রোতাদের ওভাররাইড করার ঝুঁকি চালায়। : আপনি পরিবর্তে এই উত্তর অনুসরণ করা উচিত stackoverflow.com/a/21935031/549503
mmmeff

51

এই সমস্যাটি অনুসন্ধান করার সময়, আমি একটি প্রস্তাব পেয়েছি যে পৃষ্ঠা ভিজিবিলিটি API ব্যবহার করা উচিত। বেশিরভাগ আধুনিক ব্রাউজারগুলি আমি এই আইপি ব্যবহার করতে পারি: http://caniuse.com/#feat=pagevisibility অনুসারে এই এপিআই সমর্থন করে ।

এখানে একটি কার্যকারী উদাহরণ ( এই স্নিপেট থেকে প্রাপ্ত ):

$(document).ready(function() {
  var hidden, visibilityState, visibilityChange;

  if (typeof document.hidden !== "undefined") {
    hidden = "hidden", visibilityChange = "visibilitychange", visibilityState = "visibilityState";
  } else if (typeof document.msHidden !== "undefined") {
    hidden = "msHidden", visibilityChange = "msvisibilitychange", visibilityState = "msVisibilityState";
  }

  var document_hidden = document[hidden];

  document.addEventListener(visibilityChange, function() {
    if(document_hidden != document[hidden]) {
      if(document[hidden]) {
        // Document hidden
      } else {
        // Document shown
      }

      document_hidden = document[hidden];
    }
  });
});

আপডেট: উপরের উদাহরণটিতে গেকো এবং ওয়েবকিট ব্রাউজারগুলির জন্য উপসর্গযুক্ত বৈশিষ্ট্য ব্যবহৃত হয়েছিল, তবে আমি সেই প্রয়োগটি সরিয়ে দিয়েছি কারণ এই ব্রাউজারগুলি কিছুক্ষণের জন্য উপসর্গ ছাড়াই পৃষ্ঠা ভিজিবিলিটি এপিআই সরবরাহ করে আসছে। আইই 10 এর সাথে সামঞ্জস্য রাখতে আমি মাইক্রোসফ্টের নির্দিষ্ট উপসর্গ রেখেছি kept


যখন বিক্রেতার উপসর্গগুলি এটি থেকে যায়, আমি সম্ভবত স্যুইচ করব!
ফেন্টন

কেবলমাত্র এটির সাথে আসল সমস্যাটি বিক্রেতার উপসর্গ নয় কারণ একটি অফিসিয়াল ডাব্লু 3 সি সুপারিশ রয়েছে (তারিখ 29. অক্টোবর 2013)। কিছু ক্ষেত্রে সমস্যাটি হ'ল পৃষ্ঠা ভিজিবিলিটি এআইআই 10 এবং নতুনটি সমর্থিত। আপনার যদি আইই 9 সমর্থন করতে চান তবে আপনার আলাদা পদ্ধতির সন্ধান করা উচিত ...
ইলিজা

সমস্ত আধুনিক ব্রাউজারের জন্য এটি করার সঠিক উপায়। +1
আজেদি 32

আপনি কি নিশ্চিত যে এই বিক্রেতা উপসর্গগুলি এমনকি প্রয়োজনীয়? এমডিএন এবং ক্যানআইউসের মতে, সংস্করণ ৩২ থেকে ক্রোম বা ফায়ারফক্সে ১ version সংস্করণ থেকে এগুলি প্রয়োজনীয় ছিল না এবং আইইয়ের জন্য এগুলি কখনও প্রয়োজন হয় নি।
Ajedi32

@ আজেদী 32 ধন্যবাদ এটি এখনও কী প্রাসঙ্গিক এবং এখন কী ছেড়ে যেতে পারে তা দেখার জন্য আমাকে কিছু পরীক্ষা এবং খনন করতে হবে।
ইলিজা

37

অবাক হওয়ার মতো কারও নাম উল্লেখ করা হয়নি document.hasFocus

if (document.hasFocus()) console.log('Tab is active')

এমডিএন আরও তথ্য আছে।


আমার জন্য কাজ করে (ক্রোম এবং ফায়ারফক্সে পরীক্ষিত)। গৃহীত উত্তর (onfocus / onblur) হয়নি না কাজ
harmv

সঠিক উত্তরটি আবার একেবারে নীচে। স্ট্যাকওভারফ্লো যাওয়ার উপায়!
অক্টোবর এগার

সত্যিই, এটি কি সঠিক উত্তর নয়? কেউ কি কোন খারাপ দিক দেখে?
গ্যাসপাড়

2
এর একমাত্র ক্ষতিটি হ'ল যদি আপনি এটি নির্ধারণের চেষ্টা করছেন যে ট্যাবটি কোনও আইফ্রেমের মধ্যে থেকে ফোকাসে রয়েছে কিনা, তবে প্যারেন্ট পৃষ্ঠাটি ফোকাসের বাইরে না থাকলে আইফ্রেমটি লোড হওয়ার ক্ষেত্রে এটি ব্যর্থ হবে। পাশাপাশি এটি কভার করতে আপনাকে পৃষ্ঠাটির দৃশ্যমানতা এপিআই সহ যেতে হবে।
ইভান

29

হ্যাঁ এগুলি আপনার পক্ষে কাজ করা উচিত। আপনি কেবল আমাকে এই লিঙ্কটি স্মরণ করিয়ে দিয়েছিলেন যে আমি সেই কৌশলগুলি কাজে লাগিয়েছি। আকর্ষণীয় পড়া


2
+1 - এটি খুব চালাক কৌশল, আমি ভাবতে পারি যে প্রচুর লোককে বোকা বানানো।
ফেন্টন

2
কি এক বিদ্বেষপূর্ণ এবং কৌতুকপূর্ণ আক্রমণ। আকর্ষণীয় যে পড়া, ধন্যবাদ।
ভু

4

আমি এটি এইভাবে করব (রেফারেন্স http://www.w3.org/TR/page-visibility/ ):

    window.onload = function() {

        // check the visiblility of the page
        var hidden, visibilityState, visibilityChange;

        if (typeof document.hidden !== "undefined") {
            hidden = "hidden", visibilityChange = "visibilitychange", visibilityState = "visibilityState";
        }
        else if (typeof document.mozHidden !== "undefined") {
            hidden = "mozHidden", visibilityChange = "mozvisibilitychange", visibilityState = "mozVisibilityState";
        }
        else if (typeof document.msHidden !== "undefined") {
            hidden = "msHidden", visibilityChange = "msvisibilitychange", visibilityState = "msVisibilityState";
        }
        else if (typeof document.webkitHidden !== "undefined") {
            hidden = "webkitHidden", visibilityChange = "webkitvisibilitychange", visibilityState = "webkitVisibilityState";
        }


        if (typeof document.addEventListener === "undefined" || typeof hidden === "undefined") {
            // not supported
        }
        else {
            document.addEventListener(visibilityChange, function() {
                console.log("hidden: " + document[hidden]);
                console.log(document[visibilityState]);

                switch (document[visibilityState]) {
                case "visible":
                    // visible
                    break;
                case "hidden":
                    // hidden
                    break;
                }
            }, false);
        }

        if (document[visibilityState] === "visible") {
            // visible
        }

    };  

@ ইলিজার দেওয়া উত্তরের থেকে এই উত্তরটি কীভাবে পৃথক হতে পারে তা ব্যাখ্যা করতে পারেন - একটি পার্থক্য থাকতে পারে, তবে এটি সূক্ষ্ম - সুতরাং এটি কী এবং এর কেন আলাদা হওয়া উচিত তার একটি ব্যাখ্যা প্রশংসা হবে।
ফেন্টন

2

ক্রস ব্রাউজার jQuery সমাধান! গিটহাবে কাঁচা উপলব্ধ

মজা এবং ব্যবহার করা সহজ!

নীচের প্লাগইনটি আইই, ক্রোম, ফায়ারফক্স, সাফারি ইত্যাদির বিভিন্ন সংস্করণের জন্য আপনার স্ট্যান্ডার্ড পরীক্ষার মধ্য দিয়ে যাবে এবং সেই অনুযায়ী আপনার ঘোষিত পদ্ধতিগুলি প্রতিষ্ঠা করবে। এটি যেমন:

  • onblur | .blur / onfocus | ফোকাস " নকল " কল
  • শব্দের মতো বিকল্প অ্যাপ্লিকেশন নির্বাচনের মাধ্যমে উইন্ডো ফোকাস হারাচ্ছে
    • এটি অনাকাঙ্ক্ষিত হতে পারে কেবল কারণ, যদি আপনার কোনও ব্যাঙ্ক পৃষ্ঠা খোলা থাকে এবং এটি অনব্লুর ইভেন্টটিকে পৃষ্ঠাটি মাস্ক করতে বলে, তবে আপনি যদি ক্যালকুলেটর খোলেন, আপনি পৃষ্ঠাটি আর দেখতে পারবেন না!
  • পৃষ্ঠা লোড ট্রিগার না

: ব্যবহার হিসাবে সহজ হিসাবে 'থেকে নীচে স্ক্রোল করুন চালান স্নিপেট '

$.winFocus(function(event, isVisible) {
    console.log("Combo\t\t", event, isVisible);
});

//  OR Pass False boolean, and it will not trigger on load,
//  Instead, it will first trigger on first blur of current tab_window
$.winFocus(function(event, isVisible) {
    console.log("Combo\t\t", event, isVisible);
}, false);

//  OR Establish an object having methods "blur" & "focus", and/or "blurFocus"
//  (yes, you can set all 3, tho blurFocus is the only one with an 'isVisible' param)
$.winFocus({
    blur: function(event) {
        console.log("Blur\t\t", event);
    },
    focus: function(event) {
        console.log("Focus\t\t", event);
    }
});

//  OR First method becoms a "blur", second method becoms "focus"!
$.winFocus(function(event) {
    console.log("Blur\t\t", event);
},
function(event) {
    console.log("Focus\t\t", event);
});

/*    Begin Plugin    */
;;(function($){$.winFocus||($.extend({winFocus:function(){var a=!0,b=[];$(document).data("winFocus")||$(document).data("winFocus",$.winFocus.init());for(x in arguments)"object"==typeof arguments[x]?(arguments[x].blur&&$.winFocus.methods.blur.push(arguments[x].blur),arguments[x].focus&&$.winFocus.methods.focus.push(arguments[x].focus),arguments[x].blurFocus&&$.winFocus.methods.blurFocus.push(arguments[x].blurFocus),arguments[x].initRun&&(a=arguments[x].initRun)):"function"==typeof arguments[x]?b.push(arguments[x]):
"boolean"==typeof arguments[x]&&(a=arguments[x]);b&&(1==b.length?$.winFocus.methods.blurFocus.push(b[0]):($.winFocus.methods.blur.push(b[0]),$.winFocus.methods.focus.push(b[1])));if(a)$.winFocus.methods.onChange()}}),$.winFocus.init=function(){$.winFocus.props.hidden in document?document.addEventListener("visibilitychange",$.winFocus.methods.onChange):($.winFocus.props.hidden="mozHidden")in document?document.addEventListener("mozvisibilitychange",$.winFocus.methods.onChange):($.winFocus.props.hidden=
"webkitHidden")in document?document.addEventListener("webkitvisibilitychange",$.winFocus.methods.onChange):($.winFocus.props.hidden="msHidden")in document?document.addEventListener("msvisibilitychange",$.winFocus.methods.onChange):($.winFocus.props.hidden="onfocusin")in document?document.onfocusin=document.onfocusout=$.winFocus.methods.onChange:window.onpageshow=window.onpagehide=window.onfocus=window.onblur=$.winFocus.methods.onChange;return $.winFocus},$.winFocus.methods={blurFocus:[],blur:[],focus:[],
exeCB:function(a){$.winFocus.methods.blurFocus&&$.each($.winFocus.methods.blurFocus,function(b,c){this.apply($.winFocus,[a,!a.hidden])});a.hidden&&$.winFocus.methods.blur&&$.each($.winFocus.methods.blur,function(b,c){this.apply($.winFocus,[a])});!a.hidden&&$.winFocus.methods.focus&&$.each($.winFocus.methods.focus,function(b,c){this.apply($.winFocus,[a])})},onChange:function(a){var b={focus:!1,focusin:!1,pageshow:!1,blur:!0,focusout:!0,pagehide:!0};if(a=a||window.event)a.hidden=a.type in b?b[a.type]:
document[$.winFocus.props.hidden],$(window).data("visible",!a.hidden),$.winFocus.methods.exeCB(a);else try{$.winFocus.methods.onChange.call(document,new Event("visibilitychange"))}catch(c){}}},$.winFocus.props={hidden:"hidden"})})(jQuery);
/*    End Plugin      */

// Simple example
$(function() {
	$.winFocus(function(event, isVisible) {
		$('td tbody').empty();
		$.each(event, function(i) {
			$('td tbody').append(
				$('<tr />').append(
					$('<th />', { text: i }),
					$('<td />', { text: this.toString() })
				)
			)
		});
		if (isVisible) 
			$("#isVisible").stop().delay(100).fadeOut('fast', function(e) {
				$('body').addClass('visible');
				$(this).stop().text('TRUE').fadeIn('slow');
			});
		else {
			$('body').removeClass('visible');
			$("#isVisible").text('FALSE');
		}
	});
})
body { background: #AAF; }
table { width: 100%; }
table table { border-collapse: collapse; margin: 0 auto; width: auto; }
tbody > tr > th { text-align: right; }
td { width: 50%; }
th, td { padding: .1em .5em; }
td th, td td { border: 1px solid; }
.visible { background: #FFA; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<h3>See Console for Event Object Returned</h3>
<table>
    <tr>
        <th><p>Is Visible?</p></th>
        <td><p id="isVisible">TRUE</p></td>
    </tr>
    <tr>
        <td colspan="2">
            <table>
                <thead>
                    <tr>
                        <th colspan="2">Event Data <span style="font-size: .8em;">{ See Console for More Details }</span></th>
                    </tr>
                </thead>
                <tbody></tbody>
            </table>
        </td>
    </tr>
</table>


প্লাগইনটির জন্য আপনার কোডটি সর্বনিম্ন করা উচিত।
প্যাট্রিক দেশজার্ডিনস

@ পেট্রিকডিজারডিনস হ্যাঁ অন্যান্য কাজের পাশাপাশি এই সপ্তাহান্তে করার পরিকল্পনা করুন। আমি? আমার কাছে থাকা গুচ্ছ একগুচ্ছ জিনিস for জিডিএমকিইনস্ট্রি গিথুব এ। পুরানো উত্তরের সাথে লিঙ্কগুলি যুক্ত করব কারণ আমি তাদের সংক্ষিপ্তসার হিসাবে যুক্ত করব
SpYk3HH

আমি যদি "ওয়ার্ড" বা "ক্যালকুলেটর" এর মতো অন্য কোনও অ্যাপ্লিকেশনটিতে স্যুইচ করি তখন পৃষ্ঠাটি ফোকাস হারাতে চান?
বেনাস

@ বেনাস ভুল হতে পারে, তবে আমি বিশ্বাস করি যে এটি খুব বেসিকের মূল কার্যকারিতা jQuery(window).blur/focusযা অনেকের দ্বারা অনাকাঙ্ক্ষিত ছিল, এই কারণেই আমি এই প্লাগইনটি তৈরি করার অন্যতম কারণ। প্লাগইনটি jQuery ইতিমধ্যে যা সরবরাহ করে না তা সরবরাহ করতে সহায়তা করে
SpYk3HH
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.