কিভাবে ব্রাউজার উইন্ডো বন্ধ ইভেন্ট ক্যাপচার?


149

আমি ব্রাউজার উইন্ডো / ট্যাব বন্ধ ইভেন্টটি ক্যাপচার করতে চাই। আমি jQuery দিয়ে নিম্নলিখিত চেষ্টা করেছি:

jQuery(window).bind(
    "beforeunload", 
    function() { 
        return confirm("Do you really want to close?") 
    }
)

তবে এটি ফর্ম জমা দেওয়ার ক্ষেত্রেও কাজ করে, যা আমি চাই তা নয়। আমি এমন একটি ইভেন্ট চাই যা ব্যবহারকারী তখন উইন্ডোটি বন্ধ করে দেয়।

উত্তর:


212

beforeunloadঘটনা আগুন যখনই ব্যবহারকারী কোনো কারণে আপনার পৃষ্ঠার ছেড়ে।

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

আপনি নিম্নলিখিত কোড সহ ফর্ম জমা এবং হাইপারলিঙ্কগুলি (অন্যান্য ফ্রেম ব্যতীত) বাদ দিতে পারেন:

var inFormOrLink;
$('a').on('click', function() { inFormOrLink = true; });
$('form').on('submit', function() { inFormOrLink = true; });

$(window).on("beforeunload", function() { 
    return inFormOrLink ? "Do you really want to close?" : null; 
})

1.7 এর চেয়ে পুরানো jQuery সংস্করণগুলির জন্য, এটি ব্যবহার করে দেখুন:

var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind("beforeunload", function() { 
    return inFormOrLink ? "Do you really want to close?" : null; 
})

liveপদ্ধতি না কাজ করে submitতাই যদি আপনি একটি নতুন ফর্ম যোগ করুন, ভাল হিসাবে আপনি এটি হ্যান্ডলার জুড়তে অনুমতি প্রয়োজন হবে ঘটনা।

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


8
হ্যাঁ, দুর্দান্ত কাজ! Jquery সমর্থন নতুন সংস্করণ ('ফর্ম')। লাইভ ('জমা দিন, ফাংশন () {})।
ভেঙ্কট ডি

4
আপনার সমাধানটি ভাল তবে আমি রিফ্রেশের ক্ষেত্রে কীভাবে ইভেন্টটি বাতিল করব? আমি ব্রাউজারটি বন্ধ থাকলেই ইভেন্টটি চাই, রিফ্রেশের কোনও ক্ষেত্রে নেই
রিফেল

দেখে মনে হচ্ছে ব্রাউজারটি নিশ্চিত ডায়ালগ হিসাবে পূর্ববর্তী লোডের রিটার্ন মান প্রদর্শন করে। সুতরাং আমি এই উত্তরটি আরও নির্ভুল বলে মনে করি: লিঙ্ক
তাহাগ

2
ব্যবহার করে একটি পৃষ্ঠার এই হাতল রিফ্রেশ করে Ctrl + r, F5, Ctrl + Shift + rএবং ব্রাউজার URL- এ পরিবর্তন?
আরতি

1
@Jonny: এটা ঠিক এখন .on()
স্ল্যাक्स

45

beforeunloadফর্মের ইভেন্ট হ্যান্ডলারের মধ্যে কেবল ইভেন্ট হ্যান্ডলারটিকে কেবল আবদ্ধ করুন submit:

jQuery('form').submit(function() {
    jQuery(window).unbind("beforeunload");
    ...
});

3
এটি কি ফর্ম ট্যাগ সংজ্ঞাতে নির্দিষ্ট করে jQuery ব্যবহার করা ঠিক তত সহজ নয়? : `<ফর্ম onsubmit =" উইন্ডো.অনফফরুনলড = নাল; ">
অবাক

4
@ এও তবে আপনাকে onsubmit=...প্রতিটি ফর্মের মধ্যে এটি অন্তর্ভুক্ত করতে হবে । (নির্দিষ্ট
ওয়েবপ্যাপে

16

ক্রস-ব্রাউজার সমাধানের জন্য (ক্রোম 21, আই 9, এফএফ 15 এ পরীক্ষিত) নীচের কোডটি ব্যবহার করে বিবেচনা করুন, যা স্ল্যাকসের কোডটির সামান্য টুইটযুক্ত সংস্করণ:

var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind('beforeunload', function(eventObject) {
    var returnValue = undefined;
    if (! inFormOrLink) {
        returnValue = "Do you really want to close?";
    }
    eventObject.returnValue = returnValue;
    return returnValue;
}); 

নোট করুন যে ফায়ারফক্স 4 সাল থেকে "আপনি কি সত্যিই বন্ধ করতে চান?" বার্তাটি প্রদর্শিত হয় না। এফএফ কেবল একটি জেনেরিক বার্তা প্রদর্শন করে। Https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload এ নোটটি দেখুন


3
এটি ব্রাউজার জুড়ে ধারাবাহিকভাবে কাজ করে। শুধু একটি দ্রুত নোট; আমি উভয়টি liveএবং bindবিবৃতিগুলিকে আপডেট করেছি on, যা সর্বশেষ স্তরের jQuery এর সাথে দুর্দান্ত কাজ করে। ধন্যবাদ!
সাবেলফোস্টে


4

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

var inFormOrLink;
$('a[href]:not([target]), a[href][target=_self]').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind('beforeunload', function(eventObject) {
    var returnValue = undefined;
    if (! inFormOrLink) {
        returnValue = "Do you really want to close?";
    }
    eventObject.returnValue = returnValue;
    return returnValue;
});

1
এই উত্তরটি সঠিক তবে আপনি যখন ব্রাউজারটি রিফ্রেশ করেন তখন এই ইভেন্টটি নিয়ে সমস্যা রয়েছে তাদের ক্ষেত্রে নিম্নলিখিত কোডগুলিতে আপনার পরিবর্তন করুন: যদি (inFormOrLink! == অপরিজ্ঞাত &&! InFormOrLink)
লিওন পিয়ারে

4

আমার উত্তরটি সহজ বেঞ্চমার্ক সরবরাহের লক্ষ্য।

কিভাবে

উত্তর দেখুন @ এসএলক্স

$(window).on("beforeunload", function() { 
    return inFormOrLink ? "Do you really want to close?" : null; 
})

শেষ পর্যন্ত আপনার পৃষ্ঠাটি বন্ধ করতে ব্রাউজারটি কতক্ষণ সময় নেয়?

যখনই কোনও ব্যবহারকারী পৃষ্ঠাটি বন্ধ করে দেয় ( xবোতাম বা CTRL+ W), ব্রাউজার প্রদত্ত beforeunloadকোডটি কার্যকর করে, তবে অনির্দিষ্টকালের জন্য নয়। একমাত্র ব্যতিক্রম হ'ল নিশ্চিতকরণ বাক্স ( return 'Do you really want to close?) যা ব্যবহারকারীর প্রতিক্রিয়ার জন্য অপেক্ষা করবে।

ক্রোম : 2 সেকেন্ড।
ফায়ারফক্স : ∞ (বা ডাবল ক্লিক করুন, বা নিকটে জোর করুন)
প্রান্ত : ∞ (বা ডাবল ক্লিক করুন)
এক্সপ্লোরার 11 : 0 সেকেন্ড।
সাফারি : টোডো

আমরা এটি পরীক্ষা করার জন্য কী ব্যবহার করতাম:

  • অনুরোধ লগ সহ একটি নোড.জেএস এক্সপ্রেস সার্ভার
  • নিম্নলিখিত সংক্ষিপ্ত এইচটিএমএল ফাইল

এটি যা করে তা হ'ল ব্রাউজারটি তার পৃষ্ঠাটি (সিঙ্ক্রোনালি) বন্ধ করার আগে যতটা সম্ভব অনুরোধ পাঠানো।

<html>
<body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script>
    function request() {
        return $.ajax({
            type: "GET",
            url: "http://localhost:3030/" + Date.now(),
            async: true
        }).responseText;
    }
    window.onbeforeunload = () => {
        while (true) {
            request();
        }
        return null;
    }
    </script>
</body>
</html>

ক্রোম আউটপুট:

GET /1480451321041 404 0.389 ms - 32  
GET /1480451321052 404 0.219 ms - 32  
...  
GET /hello/1480451322998 404 0.328 ms - 32

1957ms  2 seconds // we assume it's 2 seconds since requests can take few milliseconds to be sent.

3

আমি স্লেক্সের উত্তরটি ব্যবহার করেছি তবে এটি এখনকার মতো কাজ করছে না, যেহেতু অনবফরডনলোড রিটার্নভ্যালু একটি স্ট্রিং হিসাবে পার্স করা হয় এবং তারপরে ব্রাউজারের নিশ্চিতকরণ বাক্সে প্রদর্শিত হয়। সুতরাং সত্য সত্য "সত্য" এর মতো প্রদর্শিত হয়েছিল।

শুধু রিটার্ন ব্যবহার করে কাজ করেছেন worked এখানে আমার কোড

var preventUnloadPrompt;
var messageBeforeUnload = "my message here - Are you sure you want to leave this page?";
//var redirectAfterPrompt = "http://www.google.co.in";
$('a').live('click', function() { preventUnloadPrompt = true; });
$('form').live('submit', function() { preventUnloadPrompt = true; });
$(window).bind("beforeunload", function(e) { 
    var rval;
    if(preventUnloadPrompt) {
        return;
    } else {
        //location.replace(redirectAfterPrompt);
        return messageBeforeUnload;
    }
    return rval;
})

1

সম্ভবত আপনি অনসবিট পরিচালনা করতে এবং একটি পতাকা সেট করতে পারেন যা পরে আপনি নিজের অনবরেউনলোড হ্যান্ডলারটি চেক করেন।


1
jQuery(window).bind(
                    "beforeunload",
                      function (e) {
                          var activeElementTagName = e.target.activeElement.tagName;
                          if (activeElementTagName != "A" && activeElementTagName != "INPUT") {
                              return "Do you really want to close?";
                          }
                      })

1

দুর্ভাগ্যক্রমে, এটি কোনও পুনরায় লোড, নতুন পৃষ্ঠা পুনর্নির্দেশ, বা ব্রাউজার বন্ধ ইভেন্টটি ট্রিগার করা হবে। একটি বিকল্প হ'ল ইভেন্টটি ট্রিগারকারী আইডিটিকে ধরা এবং যদি এটি ফর্ম হয় তবে কোনও ফাংশন ট্রিগার করবেন না এবং যদি এটি ফর্মটির আইডি না হয় তবে পৃষ্ঠাটি বন্ধ হয়ে গেলে আপনি যা করতে চান তা করুন। আমি নিশ্চিত না যে এটি সরাসরি সম্ভব এবং ক্লান্তিকর কিনা।

গ্রাহক ট্যাবটি বন্ধ করার আগে আপনি কয়েকটি ছোট ছোট কাজ করতে পারেন। জাভাস্ক্রিপ্ট ব্রাউজার বন্ধ ট্যাব / ব্রাউজার বন্ধ সনাক্ত করে তবে আপনার ক্রিয়াকলাপগুলির তালিকা বড় হলে এবং ট্যাবটি শেষ হওয়ার আগে বন্ধ হয়ে যায় আপনি অসহায় less আপনি এটি চেষ্টা করতে পারেন তবে আমার অভিজ্ঞতার সাথে এটির উপর নির্ভর করে না।

window.addEventListener("beforeunload", function (e) {
  var confirmationMessage = "\o/";
  /* Do you small action code here */
  (e || window.event).returnValue = confirmationMessage; //Gecko + IE
  return confirmationMessage;                            //Webkit, Safari, Chrome
});

https://developer.mozilla.org/en-US/docs/Web/Reference/Events/beforeunload?redirectlocale=en-US&redirectslug=DOM/Mozilla_event_reference/beforeunload


0

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


0

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

<!--The definition of event and initializing the trigger flag--->


$(document).ready(function() {
updatefgallowPrompt(true);
window.onbeforeunload = WarnUser;   
}

function WarnUser() {
var allowPrompt = getfgallowPrompt();
    if(allowPrompt) {
    saveIndexedDataAlert();
    return null;
    } else {
        updatefgallowPrompt(true);
        event.stopPropagation
    }
}

<!--The method responsible for deciding weather the unload event is triggered from submit or not--->
function saveIndexedDataAlert() {
    var allowPrompt = getfgallowPrompt();
    var lenIndexedDocs = parseInt($('#sortable3 > li').size()) + parseInt($('#sortable3 > ul').size());

    if(allowPrompt && $.trim(lenIndexedDocs) > 0) {
        event.returnValue = "Your message";
    } else {
        event.returnValue = "   ";
        updatefgallowPrompt(true);
    }
}

<!---Function responsible to reset the trigger flag---->
$(document).click(function(event) {  
$('a').live('click', function() { updatefgallowPrompt(false); });
 });

<!--getter and setter for the flag---->
function updatefgallowPrompt (allowPrompt){ //exit msg dfds
    $('body').data('allowPrompt', allowPrompt); 
}   

function getfgallowPrompt(){        
    return $('body').data('allowPrompt');   
}

0

JQuery 1.7 হিসাবে, .live () পদ্ধতি অবচয় করা হয়েছে। ইভেন্ট হ্যান্ডলার সংযুক্ত করতে .on () ব্যবহার করুন। JQuery এর পুরানো সংস্করণ ব্যবহারকারীদের .live () এর অগ্রাধিকার হিসাবে .delegate () ব্যবহার করা উচিত

$(window).bind("beforeunload", function() {
    return true || confirm("Do you really want to close?"); 
}); 

সম্পূর্ণ বা লিঙ্কে

$(window).unbind();

0

এটিও চেষ্টা করে দেখুন

window.onbeforeunload = function ()
{       
    if (pasteEditorChange) {
        var btn = confirm('Do You Want to Save the Changess?');
           if(btn === true ){
               SavetoEdit();//your function call
           }
           else{
                windowClose();//your function call
           }
    }  else { 
        windowClose();//your function call
    }
};

-1

শুধু যাচাই করুন ...

function wopen_close(){
  var w = window.open($url, '_blank', 'width=600, height=400, scrollbars=no, status=no, resizable=no, screenx=0, screeny=0');
  w.onunload = function(){
    if (window.closed) {
       alert("window closed");
    }else{ 
       alert("just refreshed");
    }
  }
}

এটি কাজ করে না। এই মুহুর্তে আনলোড ইভেন্টে আগুন (বিটিডব্লিউ, এটি ডকুমেন্ট থেকে আগুন), উইন্ডোটি বন্ধ === মিথ্যা;
সের্গেই পি। ওরফে অ্যাজুরে

-1
var validNavigation = false;
            jQuery(document).ready(function () {

                wireUpEvents();
            });

            function endSession() {
                // Browser or broswer tab is closed
                // Do sth here ...
                alert("bye");
            }

            function wireUpEvents() {
                /*
                * For a list of events that triggers onbeforeunload on IE
                * check http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
                */
                window.onbeforeunload = function () {
                    debugger
                    if (!validNavigation) {
                        endSession();
                    }
                }

                // Attach the event keypress to exclude the F5 refresh
                $(document).bind('keypress', function (e) {
                    debugger
                    if (e.keyCode == 116) {
                        validNavigation = true;
                    }
                });

                // Attach the event click for all links in the page
                $("a").bind("click", function () {
                    debugger
                    validNavigation = true;
                });

                // Attach the event submit for all forms in the page
                $("form").bind("submit", function () {
                    debugger
                    validNavigation = true;
                });

                // Attach the event click for all inputs in the page
                $("input[type=submit]").bind("click", function () {
                    debugger
                    validNavigation = true;
                });

            }`enter code here`

-7

নিম্নলিখিত আমার জন্য কাজ করে;

 $(window).unload(function(event) {
    if(event.clientY < 0) {
        //do whatever you want when closing the window..
    }
 });

এটি একটি jquery ফাংশন।
ম্যাক্সিসাম

7
event.clientYযদি আপনি ব্রাউজার বন্ধ বোতাম বা ট্যাব বন্ধ বোতামে ক্লিক করুন নেতিবাচক। তবে, কীবোর্ড শর্টকাটগুলি (F5, Ctrl-R) ব্যবহার করে পৃষ্ঠাটি পুনরায় লোড করার সময় বা কীবোর্ড শর্টকার্টগুলি (যেমন Alt-F4) ব্যবহার করে ব্রাউজারটি বন্ধ করার সময় এই মানটি ইতিবাচক। সুতরাং, পৃষ্ঠা পুনরায় লোড ইভেন্ট থেকে ব্রাউজার ঘনিষ্ঠ ইভেন্টের পার্থক্য করতে আপনি ইভেন্টের অবস্থানের উপর নির্ভর করতে পারবেন না।
জুলিয়েন ক্রোনেগ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.