আমি কীভাবে অনবাইফ্রাউনলোড ডায়লগটিকে ওভাররাইড করতে এবং এটি নিজের সাথে প্রতিস্থাপন করতে পারি?


346

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

window.onbeforeunload=handler

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

এখন পর্যন্ত আমি ব্যর্থ হয়েছি এবং আমি উত্তর খুঁজে পেয়েছি বলে মনে হয় এমন আর কাউকে পাইনি। এটা কি সম্ভব?

আমার পৃষ্ঠায় জাভাস্ক্রিপ্ট:

<script type="text/javascript">   
   window.onbeforeunload=closeIt;
</script>

ক্লোজআইটি () ফাংশন:

function closeIt()
{
  if (changes == "true" || files == "true")
  {
      return "Here you can append a custom message to the default dialog.";
  }
}

JQuery এবং jqModal ব্যবহার করে আমি এই ধরণের জিনিস চেষ্টা করেছি (একটি কাস্টম কনফার্ম ডায়ালগ ব্যবহার করে):

$(window).beforeunload(function() {
        confirm('new message: ' + this.href + ' !', this.href);
        return false;
    });

যা কাজ করে না - আমি পূর্বেই লোড ইভেন্টের সাথে আবদ্ধ হতে পারি না।


1
আপনি কি আপনার বর্তমান কোড এবং এটি উত্পাদন করে তার উদাহরণ দিতে পারেন?
ওভেন

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

আরও তথ্যের জন্য এখানে দেখুন: stackoverflow.com/questions/140460
বেন ম্যাকআইন্টির


1
ক্রোমে সম্ভব নয়, রেফারেন্স: stackoverflow.com/questions/37782104/…
অভিজিৎ

উত্তর:


299

আপনি এর জন্য ডিফল্ট কথোপকথনটি সংশোধন করতে পারবেন না onbeforeunload, তাই এটির সাথে কাজ করা আপনার সেরা বাজি হতে পারে।

window.onbeforeunload = function() {
    return 'You have unsaved changes!';
}

মাইক্রোসফ্ট থেকে এটির একটি রেফারেন্স এখানে দেওয়া হয়েছে:

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

সমস্যাটি মনে হচ্ছে:

  1. যখন onbeforeunloadডাকা হয়, এটি হ্যান্ডলারের রিটার্ন মান হিসাবে গ্রহণ করবে window.event.returnValue
  2. এরপরে এটি রিটার্ন মানটিকে স্ট্রিং হিসাবে পার্স করবে (যতক্ষণ না এটি বাতিল হয়)।
  3. যেহেতু falseএকটি স্ট্রিং হিসাবে পার্স করা হয়েছে, তাই ডায়ালগ বাক্সটি ফায়ার হবে, যা পরে উপযুক্ত true/ পাস করবে false

ফলে, সেখানে বরাদ্দ একটি উপায় হবে বলে মনে হচ্ছে না falseকরারonbeforeunload ডিফল্ট সংলাপ থেকে এটি রোধ জন্য নির্ধারিত ।

JQuery এ অতিরিক্ত নোট:

  • ইভেন্টটিকে jQuery এ সেট করা সমস্যাযুক্ত হতে পারে, যেমনটি অন্যকে মঞ্জুরি দেয়onbeforeunload ইভেন্টগুলিকেও ঘটতে । যদি আপনি কেবল আপনার আনলোড ইভেন্টটি ঘটতে চান তবে আমি এর জন্য জাভাস্ক্রিপ্টের সরল।
  • jQuery এর শর্টকাট নেই onbeforeunloadতাই আপনাকে জেনেরিক bindসিনট্যাক্সটি ব্যবহার করতে হবে ।

    $(window).bind('beforeunload', function() {} );

09/04/2018 সম্পাদনা করুন : ক্রম -51 (সিএফ: রিলিজ নোট ) থেকে অনাবৃত ডাউনলোড ডায়লগগুলিতে কাস্টম বার্তাগুলি অবচয় করা হয়েছে


20
আমি খুঁজে পেয়েছি যে জিকুয়ের উদাহরণটি ফায়ার ফক্সে কাজ না করার শেষে দেওয়া হয়েছে। পরিবর্তে সরল উপায়ে স্টিক করুন: উইন্ডো.অনফফরডনলোড = ফাংশন () {...}
জেবি।

21
ফায়ারফক্সটি সম্প্রতি পরিবর্তন করা হয়েছে যাতে ডায়ালগের পাঠ্যটিও
ডেভিড হ্যামন্ড

15
তবে ফেসবুক কীভাবে কাস্টম ডায়ালগ বক্স সরবরাহ করে? উদাহরণস্বরূপ, বার্তাগুলির পৃষ্ঠায় যান, আপনার বন্ধুর বার্তার জবাব দিন এবং তারপরে প্রেরণ ক্লিক করার আগে, অন্য লিঙ্কে ক্লিক করার চেষ্টা করুন। আপনি একটি কাস্টম ডায়ালগ পপআপ দেখতে পাবেন
বরুণ

20
@ ভারুন - পুরাতন সংবাদ তবে ফেসবুক সম্ভবত তাদের সমস্ত অ্যাঙ্করগুলির ক্লিক ইভেন্টে হ্যান্ডলারগুলি রাখছে, তবে আপনি যদি ব্রাউজারে ইউআরএলটি পুনরায় লেখেন বা উইন্ডোটি বন্ধ করেন তবে এটি স্ট্যান্ডার্ড পদ্ধতিতে ফিরে আসে যা তাদের কোনও নিয়ন্ত্রণে নেই।
তাবলু কুইজিকো

1
@ ভারুন আমিও অবাক হয়েছি যে এই উত্তরটি যেভাবে অসম্ভব তা উত্তর হিসাবে চিহ্নিত করা হয়েছে এবং এতে 150 টি উর্ধ্বতন রয়েছে ... ঠিক বুঝতে পেরেছি, এফবির কাস্টম বার্তাটি কেবল তাদের সাইটের লিঙ্কের মাধ্যমেই পাওয়া যায়। আপনি যদি সরাসরি নেভিগেট করেন তবে নয় ...
সাবেস্টিয়ান রিচার

28

আমার জন্য jQuery ব্যবহার করে এবং আইই 8, ক্রোম এবং ফায়ারফক্সে পরীক্ষিত যা কাজ করেছিল তা হ'ল:

$(window).bind("beforeunload",function(event) {
    if(hasChanged) return "You have unsaved changes";
});

এখানে IE এবং অন্যান্য ব্রাউজার আচরণের মধ্যে পার্থক্য রয়েছে বলে কোনও প্রম্পট প্রয়োজন না হলে কোনও কিছু না ফেরানো গুরুত্বপূর্ণ।


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

21

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

আমি স্ট্যান্ডার্ড jQuery ডায়ালগের পরিবর্তে বোক্সি ব্যবহার করেছি, এটি এখানে উপলভ্য: http://onehackoranother.com / প্রকল্পসমূহ / jquery/boxy/

$(':input').change(function() {
    if(!is_dirty){
        // When the user changes a field on this page, set our is_dirty flag.
        is_dirty = true;
    }
});

$('a').mousedown(function(e) {
    if(is_dirty) {
        // if the user navigates away from this page via an anchor link, 
        //    popup a new boxy confirmation.
        answer = Boxy.confirm("You have made some changes which you might want to save.");
    }
});

window.onbeforeunload = function() {
if((is_dirty)&&(!answer)){
            // call this if the box wasn't shown.
    return 'You have made some changes which you might want to save.';
    }
};

আপনি অন্য ইভেন্টের সাথে সংযুক্ত থাকতে পারেন এবং কী ধরণের অ্যাঙ্কর ক্লিক করা হয়েছিল তার উপরে আরও ফিল্টার করতে পারেন, তবে এটি আমার জন্য কাজ করে এবং আমি কী করতে চাই এবং অন্যদের ব্যবহার বা উন্নত করার জন্য উদাহরণ হিসাবে কাজ করে। ভেবেছি আমি এই সমাধানটি চাই তাদের জন্য এটি ভাগ করব।

আমি কোড কেটে ফেলেছি, সুতরাং এটি এখনকার মতো কাজ করতে পারে না।


ফিরে আসুন 'আপনি কিছু পরিবর্তন করেছেন যা আপনি সংরক্ষণ করতে চাইতে পারেন' ' আমার জন্য কাজ করে না। আমাকে 'সতর্কতা_মেসেজ' বলার পরিবর্তে এই বার্তাটি সংরক্ষণ করতে হয়েছিল এবং আমি সতর্কতা_মেসেজটি ফিরে এসেছি। তবে কেবল এটিই আমার পক্ষে কাজ করেছিল!
সুগনিয়া

আপনি IE, ক্রোম, ফায়ারফক্সে পরীক্ষা করেছেন?
কিকিনেট

9

1) অনবরোডনলোড নয়, অনব্যলোড ব্যবহার করুন।

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

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


খালি এফওয়াইআই এই যে কেউ পড়ছেন ^ ক্রোম অপ্রত্যাশিত লোডে সিঙ্ক্রোনাস এজেএক্স কলগুলি হ্রাস করে চলেছে
মরগানভেদেবদেব

4

return;কোনও বার্তার পরিবর্তে একটি রাখার চেষ্টা করুন .. এটি আমার জন্য বেশিরভাগ ব্রাউজারে কাজ করছে। (এটি কেবলমাত্র ডায়ালগের উপস্থাপনাগুলি প্রতিরোধ করে)

window.onbeforeunload = function(evt) {            
        //Your Extra Code
        return;
}

3
রিটার্ন নাল ডায়লগটি খোলার থেকে আটকাবে
ব্রেট ওয়েবার

1
রিটার্ন নাল ডায়লগটি খোলার থেকে আটকাবে না। আমি এটি Chrome এ চেষ্টা করেছি এবং এটি কেস নয়।
রে

2
আমি আই-তেও রায়ের মন্তব্য নিশ্চিত করতে পারি। ফিরে nullআসা "নাল" এর পাঠ্য সহ একটি ডায়ালগ খুলবে। তবে, return void(0);ডায়ালগটি খুলবে না।
এমটিগ্লিট

1
পূর্ববর্তী লোড ফাংশনের অভ্যন্তরে কোনও রিটার্নের স্টেটমেন্ট না রেখে ডায়ালগটি খোলা হবে না।
OuuGiii


3

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

function onunload = (){
    window.open('logout.php');
}

এই পৃষ্ঠাটি যখন ব্যবহারকারী পৃষ্ঠাটি ছেড়ে দেয় বা সক্রিয় উইন্ডোটি বন্ধ করে এবং ব্যবহারকারীরা 'লগআউট.এফপি' দ্বারা লগ আউট হয় তখন ডাকে called লগআউট পিএইচপি কোডটি ধারণ করে সাথে সাথেই নতুন উইন্ডোটি বন্ধ হয়ে যায়:

window.close();

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

3

আমি একই সমস্যার মুখোমুখি হয়েছি, আমার বার্তাটি দিয়ে নিজের ডায়ালগ বাক্সটি পাওয়া ঠিক ছিল, তবে আমি যে সমস্যার মুখোমুখি হয়েছিলাম তা হ'ল: 1) এটি সমস্ত ন্যাভিগেশনগুলিতে বার্তা দিচ্ছিল আমি এটি কেবল ক্লিকের জন্যই চাই। 2) আমার নিজের নিশ্চিতকরণ বার্তার সাথে যদি ব্যবহারকারী এটি বাতিল করে নির্বাচন করে তবে এটি ব্রাউজারের ডিফল্ট ডায়লগ বাক্সটি দেখায়।

নিম্নলিখিতটি আমি খুঁজে পেয়েছি সমাধানের কোড, যা আমি আমার মাস্টার পৃষ্ঠাতে লিখেছি।

function closeMe(evt) {
    if (typeof evt == 'undefined') {
        evt = window.event; }
    if (evt && evt.clientX >= (window.event.screenX - 150) &&
        evt.clientY >= -150 && evt.clientY <= 0) {
        return "Do you want to log out of your current session?";
    }
}
window.onbeforeunload = closeMe;


1

"বাইন্ড" কমান্ড "এক" এর বিশেষায়িত সংস্করণটি কী ব্যবহার করবেন। ইভেন্ট হ্যান্ডলারটি প্রথমবার কার্যকর হলে, এটি স্বয়ংক্রিয়ভাবে ইভেন্ট হ্যান্ডলার হিসাবে সরানো হবে।

$(window).one("beforeunload", BeforeUnload);

বেশ নিশ্চিত যে এটি .on ("পূর্বেই লোড"
সের্গিউ মিন্দ্রাস

2
@ সার্জিইউ মিন্দ্রস না, এটি .one()- এটি ইভেন্টটি কেবল একবার ঘটতে শোনার জন্য ইভেন্ট শ্রোতাকে সংযুক্ত করে: "উপাদানগুলির জন্য একটি ইভেন্টের সাথে একটি হ্যান্ডলার সংযুক্ত করুন event প্রতিযোগিতামূলক ইভেন্টের জন্য উপাদানটি হ্যান্ডলারকে একবারে কার্যকর করা হয়" " api.jquery.com/one
শান

0

কৌণিক 9 পদ্ধতির:

constructor() {
    window.addEventListener('beforeunload', (event: BeforeUnloadEvent) => {
     if (this.generatedBarcodeIndex) {
      event.preventDefault(); // for Firefox
      event.returnValue = ''; // for Chrome
      return '';
     }
     return false;
    });
   }

ব্রাউজার সমর্থন এবং কাস্টম বার্তা অপসারণ:

  • ক্রম 51 মিনিটে কাস্টম বার্তার জন্য সমর্থন সরিয়েছে
  • অপেরা 38 মিনিটের মধ্যে কাস্টম বার্তার জন্য সমর্থন সরিয়েছে
  • ফায়ারফক্স ৪৪.০ মিনিটে কাস্টম বার্তার জন্য সমর্থন সরিয়েছে
  • সাফারি 9.1 মিনিটের মধ্যে কাস্টম বার্তার জন্য সমর্থন সরিয়েছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.