2009-02-11 25 views
21

मेरे पास AJAX- आधारित ग्रिड नियंत्रण है।क्या मैं windows.onbeforeunload को AJAX कॉल करते समय कॉल करने से रोक सकता हूं

हम खिड़की में हुक करते हैं। यह जांचने के लिए कि क्या उनके पास सहेजा गया डेटा है और यदि उन्हें एक संदेश के साथ प्रस्तुत किया गया है, तो "क्या आप वाकई नेविगेट करना चाहते हैं ... आपके पास सहेजा गया डेटा है ..."।

यह सब अच्छा है।

लेकिन AJAX कॉल विंडो को ट्रिगर भी करते हैं। इसलिए, अगर ग्रिड में डेटा सहेजा गया है और हम एक AJAX कॉल (जैसे किसी अन्य ग्रिड में एक पंक्ति को हटाने के लिए) करते हैं तो उपयोगकर्ता को "क्या आप वाकई दूर नेविगेट करना चाहते हैं ... आपके पास सहेजा गया डेटा नहीं है ... "संदेश जो अच्छा नहीं है।

क्या AJAX कॉल के लिए ऑनबर्ननलोड ईवेंट को दबाना संभव है? या यह पता लगाना संभव है कि एक कॉल एक AJAX कॉल है? अन्यथा हमें हैकिंग प्राप्त करनी होगी!

धन्यवाद

उत्तर

2

यह वास्तव में अजीब है, तो आप सुनिश्चित करें कि आपके अजाक्स कॉल एक नई कड़ी लोड नहीं है कर रहे हैं? onbeforeunload spec

देखने के लिए कि अजाक्स कॉल शायद में सूचीबद्ध तालिका आह्वान करने के लिए कार्यों के किसी भी चलाता है:

यकीन है कि आप इस प्रासंगिक विनिर्देश पढ़ रहें।

+0

धन्यवाद। Spec पढ़ें और यह "दस्तावेज़" लिखने के लिए "document.write" संदर्भित करता है। यह निश्चित रूप से ग्रिड लाइब्रेरी के साथ एक गुच्छा हो रहा है जिसका हम उपयोग कर रहे हैं। – Paul

0

यदि आप एएसपी.NET AJAX आंशिक पोस्टबैक के बारे में बात कर रहे हैं, तो मुझे आज भी इस व्यवहार का सामना करना पड़ा, ठीक वही काम करना। (आप नहीं कर रहे हैं, मेरी पोस्ट पूरी तरह से ध्यान न दें।)

मेरे अनुभव अब तक में, यह की तरह अगर आपके आंशिक पोस्टबैक एक इनपुट से शुरू हो रहा है, यह एक आंशिक पोस्टबैक के दौरान onbeforeunload सक्रिय नहीं होगा लगता है , लेकिन यदि आंशिक पोस्टबैक हाइपरलिंक द्वारा ट्रिगर किया गया है, तो यह होगा। ऐसा लगता है कि ब्राउजर मानता है कि अगर आप एंकर टैग में कुछ भी क्लिक करते हैं (केवल आईई और फ़ायरफ़ॉक्स में परीक्षण किया जाता है लेकिन हाँ) पर क्लिक करते हैं तो आप नेविगेट कर रहे हैं।

पृष्ठ के पास एक निश्चित छिपी हुई फ़ील्ड है या नहीं, पहले से ही क्लाइंट-साइड निर्धारित करने के लिए मैं उपयोग कर रहा था, जब नेविगेट दूर चेतावनी दिखाने के लिए उचित है, तो मैं इसे आसानी से ठीक करने में सक्षम था अगर स्थिति को मेरे ऑनबेरनलोड के लिए छुपा फ़ील्ड का मान, और मूल्य निर्धारित करने के लिए पेजरक्वेट मैनेजर के BeginRequest और EndRequest हैंडलर में हुकिंग करना। यह आंशिक पोस्टबैक के दौरान चेतावनी को प्रभावी ढंग से अक्षम करता है। यदि आप अधिक विशिष्ट चीजें जांचना चाहते हैं तो आप यहां अधिक जटिल तर्क जोड़ सकते हैं।

यहां वास्तव में एक अति-सरलीकृत कोड नमूना है। (। खेद अगर मैं मुकाबले और बिंदु जहां यह काम नहीं करता है, लेकिन यह आप एक विचार देना चाहिए करने के लिए सेंसर)

window.onbeforeunload = checkNavigateAway; 

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(onBeginRequest); 
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(onEndRequest); 

function onBeginRequest(sender, args) { 
    var navigateAwayFlag = $("input[id*='navigateAwayValue']"); 
    if (navigateAwayFlag.length > 0) { 
     navigateAwayFlag[0].value = "false"; 
    } 
} 

function onEndRequest(sender, args) { 
    var navigateAwayFlag = $("input[id*='navigateAwayValue']"); 
    if (navigateAwayFlag.length > 0) { 
     navigateAwayFlag[0].value = "true"; 
    } 
} 

function checkNavigateAway() { 
    var navigateAwayFlag = $("input[id*='navigateAwayValue']"); 
    if (navigateAwayFlag.length > 0 && navigateAwayFlag[0].value == "true") 
    { 
     return "Warning Text"; 
    } 
} 

संपादित: बुरी खबर। उपरोक्त आईई 6 में काम नहीं कर रहा है। ऐसा लगता है जैसे यह फ़ायरफ़ॉक्स की तुलना में एक अलग क्रम में घटनाओं को सक्रिय करता है, इसलिए AJAX startRequest से पहले ऑनबर्नलोड लोड हो जाता है ... हाइपरलिंक के माध्यम से ध्वज के मूल्य को बदलने के लिए एक रास्ता खोजना पड़ सकता है, इससे पहले कि वह आग लगने से पहले क्लिक करें।जब मैं लॉगआउट, मैं इस स्क्रिप्ट फोन

var allowConfirm = true; 

    window.onbeforeunload = confirmExit; 
    function confirmExit() 
    { 
    if(allowConfirm) 
     return "Are you sure you want to navigate away from this page?"; 
    else 
     allowConfirm = true; 
    } 

:

शरीर टैग के अंदर:

5

मैं कुछ इस तरह किया

allowConfirm = झूठी; वापसी विंडो। location.href;

+0

यह मेरे लिए काम किया। मेरा सेव एंड रद्द लिंक लिंक एशक्स हैंडलर को कॉल करता है और जिसने एक अनलोड को मजबूर किया, और मैं नहीं चाहता था कि पेज को सहेजने या रद्द करने पर पॉपअप दिखाई दे। – Ray

30

आप किसी हाइपरलिंक द्वारा अपने पोस्टबैक को गति प्रदान करना चाहते हैं, वहाँ एक सरल समाधान नहीं है:

:

<a href="javascript:submitFunction();">Submit</a>

या

<a href="javascript:;" onclick="submitFunction();">Submit</a>

की इसके बजाय सिर्फ इस कोड का उपयोग

<a href="#" onclick="submitFunction();">Submit</a>

ऐसा लगता है कि आईई एक हाइपरलिंक की href-विशेषता की सामग्री वर्तमान पृष्ठ नहीं है (जो तेज वर्ण इंगित करता है) है, तो आईईबी ऑनबर्ननलोड ईवेंट को सक्रिय करता है।

+0

इसने ऑनबर्ननलोड ईवेंट को निकाल दिया। – dhinesh

+4

यदि आप "#" के बजाय href "###" बनाते हैं, तो एक अतिरिक्त लाभ ब्राउज़र पृष्ठ के शीर्ष पर नहीं छोड़ेगा। –

+1

यह एक अच्छा समाधान है, हालांकि मैं एएसपी का उपयोग कर रहा हूं: लिंकबटन एक दोहराने में इसलिए मुझे href को प्रारूपित करने का विकल्प नहीं मिलता है। इन्हें निम्नानुसार संरचित किया गया है ... इस कॉन्फ़िगरेशन के लिए कोई विचार? हटाएं धन्यवाद – hardba11

0

यह वास्तव में काम करता है:

OnClientClick="eval(this.href);return false" 
2

IE6 के मामले में या आप पोस्टबैक समारोह हुक कर सकते हैं href। अर्थात्: अगर पोस्टबैक समारोह WebForm_DoPostBackWithOptions है और jQuery का उपयोग कर, इस समस्या का ऊपर

var DoPostBackWithOptionsHook = null; 

$(document).ready(function(){ 
    DoPostBackWithOptionsHook = WebForm_DoPostBackWithOptions; 
    WebForm_DoPostBackWithOptions = WebForm_DoPostBackWithOptionsHook; 
} 

function WebForm_DoPostBackWithOptionsHook(options) { 
    var navigateAwayFlag = $("input[id*='navigateAwayValue']"); 
     if (navigateAwayFlag.length > 0) { 
      navigateAwayFlag[0].value = "false"; } 

    return DoPostBackWithOptionsHook(options) 
} 
0

एक वैकल्पिक हल कोड के लिए नीचे इस कोड को जोड़ना jQuery का उपयोग कर हाइपरलिंक टैग की क्लिक करें घटना पर submitFunction() कॉल और href दूर करने के लिए है हाइपरलिंक से विशेषता।

0

यह संभव नहीं है, ब्राउज़र का रीफ्रेश बटन दबाए जाने का कोई तरीका नहीं है।

0

AJAX का उपयोग नहीं कर रहा है, लेकिन फिर भी सहेजे गए परिवर्तनों वाले पृष्ठ को छोड़ना बंद करना चाहता था। मैंने नेविगेटवे सहित कई पूर्व सुझावों का प्रयास किया। उनमें से कोई भी आईई 8 NavigateAway की 0.

मुझे लगता है कि टैग में आईडी के रूप में वर्ग का उपयोग कर और फिर उस पर आधारित बूलियन स्थापना के बारे में समाधान था पर एक ब्लॉग मिला हमेशा वापस आ लंबाई के साथ काम किया। मैंने कोशिश की, लेकिन यह काम नहीं करता है क्योंकि .NET जब एचटीएमएल आउटपुट करता है तो उसमें घोषित कक्षा के साथ एक स्पैन टैग में इनपुट टैग लपेट रहा था। मेरा अंतिम समाधान टैग के आईडी नाम में इग्नोर शब्द रखना था। इसके अलावा, क्लिक से पहले बुलाए जाने वाले पहले से रोकने के लिए कोड द्वारा फंस गया है जो बूलियन सेट करता है, एक को उपयोग करना चाहिए, जैसे कि एएसपी: बटन या एएसपी: इनपुट। अंत में, एएसपी बलों (वीएस आईडीई करता है) प्रारंभिक नाम नियंत्रण का प्रकार होना चाहिए; आईडी = "Button_Save"। एएसपी का उपयोग करना: टैग भी दो बार बुलाए जाने से पहले से रोकता है।

<script type="text/javascript" language="javascript"> 
var stuffchanged = false 
var ignorenavigate = false 

    $(document).ready(function() { 


    //Detect whether the event source has "nonavigate" class specified 
    $("a,input,img,checkbox,button").click(function() { 
     var str = $(this).attr("ID"); 
     ignorenavigate = str.search("Ignore") > 0; 
    }); 

}); 

window.onbeforeunload = confirmExit; 
function confirmExit() { 
    if (stuffchanged && !ignorenavigate) { 
     return "You have attempted to leave this page with unsaved changes. 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?"; 
    } 

} 

    function textchanged() { 
    stuffchanged = true; 
    } 

संबंधित मुद्दे