2008-10-29 15 views
5

के लिए वेब फ़ॉर्म सामग्री को संरक्षित कैसे किया जा सकता है जब कोई वेब फ़ॉर्म सबमिट किया जाता है और उपयोगकर्ता को दूसरे पृष्ठ पर ले जाता है, तो अक्सर यह मामला होता है कि उपयोगकर्ता फिर से फ़ॉर्म सबमिट करने के लिए बैक बटन पर क्लिक करेगा (फॉर्म मेरे मामले में एक उन्नत खोज है।)बैक बटन

जब मैं बैक पर क्लिक करता हूं तो उपयोगकर्ता द्वारा चुने गए फॉर्म विकल्पों को विश्वसनीय रूप से संरक्षित कैसे कर सकता हूं (इसलिए उन्हें फिर से फॉर्म भरने के साथ स्क्रैच से शुरू करने की आवश्यकता नहीं है केवल कई फॉर्म तत्वों में से एक को बदल रहे हैं?)

क्या मुझे सत्र डेटा (कुकीज़ या सर्वर-साइड) में फॉर्म विकल्प संग्रहीत करने के मार्ग पर जाना है या ब्राउज़र को इसे संभालने का कोई तरीका है मुझे?

(पर्यावरण PHP/जावास्क्रिप्ट है - और साइट पर IE6 + और Firefox2 + काम करना चाहिए)

उत्तर

4

मैं सत्र में डाल दिया था।
यह सबसे विश्वसनीय होने वाला है और भले ही वे सीधे "वापस" नहीं जाते हैं, फिर भी उनके पास उनके खोज विकल्प होंगे। इसे कुकी में रखकर भी काम करेगा, लेकिन इसकी सिफारिश नहीं की जाएगी जब तक कि यह बहुत छोटा रूप न हो।

6

मुझे विश्वास है कि आप ब्राउज़र की करुणा पर हैं। जब आप वापस हिट करते हैं, तो ब्राउज़र सामग्री के लिए सर्वर से नया अनुरोध नहीं करता है, यह कैश का उपयोग करता है (लगभग हर ब्राउजर में मैंने देखा है)। तो सर्वर-साइड कुछ भी बाहर है।

मुझे आश्चर्य है कि क्या आप परिणाम पृष्ठ के ऑन-लोड ईवेंट के दौरान कुकी में खोज परिणाम संग्रहीत करने की तरह बहुत जटिल कर सकते हैं, और फिर खोज पृष्ठ पर जावास्क्रिप्ट में कुकी पढ़ना और फॉर्म भरना - लेकिन यह सिर्फ अटकलें है, मुझे नहीं पता कि यह काम करेगा या नहीं।

+5

सर्वर-साइड एक विकल्प नहीं है - जावास्क्रिप्ट को पृष्ठ के लिए फिर से निष्पादित किया गया है - इसलिए हम एक अजाक्स अनुरोध कर सकते हैं। –

+0

यह सच है। मैं उसके बारे में भूल गया। –

2

आपके पास समस्या यह है कि ब्राउज़र पृष्ठ के कैश किए गए संस्करण को वापस कर देगा, और शायद इसके लिए सर्वर से फिर से नहीं पूछेगा, जिसका अर्थ सत्र का उपयोग करना अप्रासंगिक होगा।

हालांकि आप पृष्ठ के लोड ईवेंट पर पहले सबमिट किए गए फॉर्म के विवरण लोड करने के लिए AJAX का उपयोग कर सकते हैं।

1

पोस्ट के बाद आपको मूल रूप से इसे किसी भी तरीके से संभवतः अपने सर्वर पर संग्रहीत करना होगा (शायद सुझाए गए सत्र चर में)। आपको अपने सर्वर से डेटा प्राप्त करने के लिए AJAX कॉल जारी करने के लिए लोड पर निष्पादित करने के लिए फॉर्म पेज पर जावास्क्रिप्ट को भी सेट करना होगा (कहें, जेएसओएन प्रारूप) और डेटा फ़ील्ड को डेटा के साथ प्रीफिल करें।

उदाहरण jQuery कोड:

$(document).ready(function() { 
    $.getJSON(
    "/getformdata.php", 
    function(data) { 
     $.each(data.items, function(i,item) { 
     $('#' + item.eid).val(item.val); 
     }); 
    }); 
}); 

आपका /getformdata.php की तरह डेटा वापस हो सकता है:

{ 
    'items': [ 
    { 
     'eid': 'formfield1', 
     'val': 'John', 
    }, 
    { 
     'eid': 'formfield2', 
     'val': 'Doe', 
    } 
    ] 
} 

और यह स्पष्ट रूप से एक खाली सरणी लौट अगर वहाँ सत्र के लिए अभी तक सहेजा कुछ भी नहीं होने पर होता। उपरोक्त कोड किसी न किसी और अवांछित है, लेकिन यह आपको मूल विचार देना चाहिए।

एक साइड नोट के रूप में: ओपेरा और फ़ायरफ़ॉक्स के वर्तमान संस्करण वापस जाने पर फॉर्म फ़ील्ड सामग्री को संरक्षित करेंगे। आपका जेएस कोड इसे ओवरराइट करेगा, लेकिन यह सुरक्षित होना चाहिए।

0

अन्य अजैक्सी विकल्प (इसलिए जावास्क्रिप्ट के बिना उपयोगकर्ताओं के लिए यह अच्छा नहीं है) जावास्क्रिप्ट के माध्यम से फॉर्म जमा करना है और फिर पुष्टिकरण पृष्ठ पर जाना है (या संदेश के साथ बटन को प्रतिस्थापित करके फ़ॉर्म पर संदेश दिखाएं)। इस तरह कोई "पीछे" संभव नहीं है।

0

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

3

यह ब्राउज़र पर निर्भर है, लेकिन ज्यादातर मामलों में आपको कुछ भी करने की ज़रूरत नहीं है।

आईई, फ़ायरफ़ॉक्स, आदि पिछले पृष्ठ में फ़ॉर्म की सामग्री को खुशी से याद रखेगा, और बैक क्लिक होने पर इसे फिर से दिखाएगा ... जब तक आप उस काम को रोकने के लिए कुछ भी नहीं करते हैं, जैसे कि पेज नो-कैश बनाना या पूरी तरह से स्क्रिप्ट से फॉर्म बनाना।

+0

अपवाद यह है कि यदि फॉर्म एक्शन एक https पृष्ठ है, तो मुझे लगता है (और संभवतः यदि फॉर्म स्थान https भी है)। –

0

तुम भी सब कुछ जावास्क्रिप्ट द्वारा स्थानीय कर सकता है (सत्र में सामान लाना दो टैब एक ही फार्म पर खुला साथ ब्राउज़रों भ्रमित करने के लिए की संभावना है। बहुत समय सावधान रहें ऐसा कुछ कर रही है।)। तो आप खोज मूल्य के साथ एक कुकी स्टोर करते हैं और पेजेलोड पर आप चेक करते हैं कि कुकी मौजूद है या नहीं। कुछ ऐसा:

$('#formSubmitButton').click(function() { 
    var value = $('#searchbox').val(); 
    var days = 1; 
    var date = new Date(); 
    date.setTime(date.getTime()+(days*24*60*60*1000)); 
    var expires = "; expires="+date.toGMTString(); 
    document.cookie = "searchbox="+value+expires+"; path=/"; 
}); 

$(document).ready(function() { 
    var nameEQ = "searchbox="; 
    var ca = document.cookie.split(';'); 
    for(var i=0;i < ca.length;i++) { 
     var c = ca[i]; 
     while (c.charAt(0)==' ') c = c.substring(1,c.length); 
     if (c.indexOf(nameEQ) == 0) var valueC = c.substring(nameEQ.length,c.length); 
    } 
    $('#searchbox').val(valueC); 
}); 

इसका परीक्षण नहीं किया गया है लेकिन काम करना चाहिए। इसके लिए आपको jQuery की आवश्यकता होगी।

कुकी कार्यों आया से: http://www.quirksmode.org/js/cookies.html

मैं btw दोनों Firefox और IE डिफ़ॉल्ट रूप से इस व्यवहार है कि कहना चाहिए।