বিরতি পৃষ্ঠা প্রস্থান ইভেন্ট


117

আমার সিস্টেমে কোনও পৃষ্ঠা সম্পাদনা করার সময়, কোনও ব্যবহারকারী অন্য ওয়েবসাইটে নেভিগেট করার সিদ্ধান্ত নিতে পারে এবং এটি করার ফলে তারা সংরক্ষণ না করে সমস্ত সম্পাদনা হারাতে পারে।

আমি অন্য পৃষ্ঠায় যাওয়ার যে কোনও প্রয়াসকে বাধা দিতে চাই এবং ব্যবহারকারীকে নিশ্চিত হওয়ার জন্য অনুরোধ করব যেহেতু তারা সম্ভবত তাদের বর্তমান কাজ হারাতে পারে।

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

এইগুলি কীভাবে প্রতিলিপি করা যায়? আমি আইই 8 কে লক্ষ্য করছি, তবে এফএফ এবং ক্রোমের সাথেও সামঞ্জস্য থাকতে চাই।


উত্তর:


154

ঘোময়ের জবাবের মতো, তবে এটি আইই এবং ফায়ারফক্সের পুরানো সংস্করণগুলিকে সমর্থন করে।

window.onbeforeunload = function (e) {
  var message = "Your confirmation message goes here.",
  e = e || window.event;
  // For IE and Firefox
  if (e) {
    e.returnValue = message;
  }

  // For Safari
  return message;
};

1
আপনি কি প্রথম লাইনটি বর্ণনা করতে পারেন (var বার্তা = ...)? আমি জানি না যে কমা এবং দ্বিতীয় প্রকাশটি কী করছে।
এমটিমুরডক

7
@ এমটিমুরডক এটি একাধিক ভেরিয়েবল ঘোষণার জন্য কেবল জাভাস্ক্রিপ্ট সিনট্যাক্স। var foo, bar;হিসাবে একইvar foo; var bar;
টি গুয়েন

4
@ এমটিমুরডক, দ্বিতীয় বিবৃতি " ভার ই = ই || উইন্ডো.ইভেন্ট;" মানে সেট করতে প্যারামিটার সমান (যদি এটি এর truthy) অথবা window.event যদি না truthy। যদি প্যারামিটার নাল হয় তবে সত্যতা হবে না ।
টি এনগুইন

3
@ ব্লাইক অ্যাডএভেন্টলিস্টনার আইই 8 তে সমর্থিত নয়। এমনকি প্রশ্নটি না পড়ে মানুষের উত্তর সম্পাদনা করবেন না।
এলি গ্রে

2
ক্রোমে আর কোনও কাজ করে না (অবনমিত): developers.google.com/web/updates/2016/04/…
মীখা শোয়াব

25

এই নিবন্ধটি দেখুন। আপনি যে বৈশিষ্ট্যটি সন্ধান করছেন তা হ'ল অনবিত্ত আনলোড

কোডের উদাহরণ:

  <script language="JavaScript">
  window.onbeforeunload = confirmExit;
  function confirmExit()
  {
    return "You have attempted to leave this page.  If you have made any changes to the fields without clicking the Save button, your changes will be lost.  Are you sure you want to exit this page?";
  }
</script>

2
"এই পৃষ্ঠায় থাকুন" এর পরিবর্তে ব্যবহারকারী "এই পৃষ্ঠাটি ছেড়ে দিন" বিকল্পটি বেছে নিয়েছেন তা সনাক্ত করার কোনও উপায় আছে কি?
শিল্পা সোনি

@ শিলপাসনি আপনি শিগগিরই একটি আনলোড ইভেন্ট, বিকাশকারী.মুজিলা.আর.ইন.উস / ডকস / ওয়েবে / এপিআই / উইন্ডো / আনলোড_ভেন্ত পাবেন তবে আমি মনে করি না এর সাথে একটি সুসংগত উপায় আছে।
স্কিপাইলট

6

বিরক্তিকর কনফার্মেশন পপআপের পরিবর্তে সার্ভারে অরক্ষিত ডেটা সফলভাবে পোস্ট করা পরিচালনা করতে কিছুটা (মিলিসেকেন্ডের বিষয়টি) রেখে দেরি করে ভাল লাগবে , যা আমি কনসোলে ডামি লেখাটি ব্যবহার করে আমার সাইটের জন্য পরিচালনা করেছি:

window.onbeforeunload=function(e){
  // only take action (iterate) if my SCHEDULED_REQUEST object contains data        
  for (var key in SCHEDULED_REQUEST){   
    postRequest(SCHEDULED_REQUEST); // post and empty SCHEDULED_REQUEST object
    for (var i=0;i<1000;i++){
      // do something unnoticable but time consuming like writing a lot to console
      console.log('buying some time to finish saving data'); 
    };
    break;
  };
}; // no return string --> user will leave as normal but data is send to server

সম্পাদনা: দেখুন Synchronous_AJAX এবং কিভাবে করতে হবে যে সঙ্গে jQuery


পপআপের এই বিকল্পটি আমি পছন্দ করি। পরামর্শের জন্য ধন্যবাদ, রেমি।
ক্রিস বাল্যান্স

2
এটি একেবারে কোনও ধারণা তৈরি করে না -1। জাভাস্ক্রিপ্টটি থ্রেড করা হয়নি আপনি যা করছেন তা পোস্টআরকোয়েস্ট করছে এবং তারপরে কাউকে কিছু না করার অনুমতি দিয়ে সাইটটির গণনা বিরতি দেওয়া (আপনার পোস্টক্রয়েস্ট সহ, ইতিমধ্যে এটি গণনা বিরতির আগেই প্রেরণ করা হয়েছিল)।
fmsf

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

6
আমি প্রযোজনায় এটি ব্যবহার করব না। কনসোল.লগ ক্রসব্রোজার নয়; প্রতিটি পোস্টের অনুরোধ আগের পোস্টগুলির বিলম্বের সাথে ভোগ করে (যার অর্থ পৃষ্ঠায় আপনার লুপ * সময় নির্ধারিত অনুরোধের জন্য স্তব্ধ হয়ে থাকবে); অনুরোধগুলি সমান্তরালে শুরু হয় না; আপনার অনুরোধগুলি সত্যই প্রেরণের নিশ্চয়তা নেই। যদি আমাকে এই সমস্যার মুখোমুখি হতে বাধ্য করা হয় তবে আমি যদি একটি মাত্র অনুরোধ পাই তবে আমি একটি সিঙ্ক্রোনাস এজাক্স অনুরোধ নিয়ে যাব। একাধিক অনুরোধের সাথে আমি অ্যাসিঙ্ক এজ্যাক্স অনুরোধ এবং একটি লুপ ব্যবহার করব যা অনুরোধগুলির কলব্যাকগুলি থেকে ফলাফল (সাফল্য বা ত্রুটি হয়) পরীক্ষা করে।
ফ্রেম্প

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

0

আমার কাছে এমন ব্যবহারকারী রয়েছে যা সমস্ত প্রয়োজনীয় ডেটা সম্পূর্ণ করেনি।

<cfset unloadCheck=0>//a ColdFusion precheck in my page generation to see if unload check is needed
var erMsg="";
$(document).ready(function(){
<cfif q.myData eq "">
    <cfset unloadCheck=1>
    $("#myInput").change(function(){
        verify(); //function elsewhere that checks all fields and populates erMsg with error messages for any fail(s)
        if(erMsg=="") window.onbeforeunload = null; //all OK so let them pass
        else window.onbeforeunload = confirmExit(); //borrowed from Jantimon above;
    });
});
<cfif unloadCheck><!--- if any are outstanding, set the error message and the unload alert --->
    verify();
    window.onbeforeunload = confirmExit;
    function confirmExit() {return "Data is incomplete for this Case:"+erMsg;}
</cfif>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.