2008-12-15 12 views
6

उनके शरीर में निम्नलिखित क्रमशः के साथ दो वेब पृष्ठों पर विचार करें:document.write() बनाम डीओएम नोड्स डालने: फॉर्म जानकारी को संरक्षित करें?

<body> 
<script> 
document.writeln('<textarea></textarea>') 
</script> 
</body> 

और

<body> 
<script> 
var t = document.createElement('textarea'); 
document.body.appendChild(t); 
</script> 
</body> 

(कुछ बड़ा है, जहां textareas है जावास्क्रिप्ट से उत्पन्न किया जा करने के लिए के हिस्से के रूप में उनमें से लगता है और पेज में हार्ड कोड नहीं किया जा सकता है)। वे दोनों एक ही आउटपुट का उत्पादन करते हैं, लेकिन पूर्व को "बुरा" माना जाता है, जबकि बाद में इसे करने का "सही" तरीका माना जाता है। (दाएं?)

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

क्या बाद की विधि का उपयोग करने का कोई तरीका है और अभी भी उपयोगी सुविधा है जो उपयोगकर्ता ने किसी फ़ॉर्म में टाइप किया है, भले ही वे गलती से रीफ्रेश करें या बैक बटन के माध्यम से वापस आएं (कम से कम फ़ायरफ़ॉक्स पर)?

+0

मैंने अभी एक आईडी और नाम जोड़ने की कोशिश की और इससे मदद नहीं मिली। यदि मैं इसके बजाय insertBefore (t, document.body.firstChild) का उपयोग करता हूं तो मैं इसे दोनों से गायब कर सकता हूं। – some

+0

परेशान करना यह है कि उपयोगकर्ता के काम को संरक्षित करना किसी भी अच्छे ब्राउज़र में * डिफ़ॉल्ट * होना चाहिए, ऐसा कुछ नहीं जो केवल गैर मानक हैक्स के साथ काम करता हो। – ShreevatsaR

उत्तर

5

मुझे विश्वास है कि document.write संस्करण वास्तव में पृष्ठ पर एक मौजूदा सामग्री को उड़ा देता है। हां, शरीर और स्क्रिप्ट टैग अब और नहीं होंगे। यही कारण है कि लोग आमतौर पर appendChild का उपयोग करते हैं।

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

+0

नहीं, यह सच नहीं है। document.write() पृष्ठ पर मौजूद मौजूदा सामग्री में खुशी से जोड़ देगा। – ShreevatsaR

+2

वास्तव में, यदि आप पृष्ठ के प्रारंभिक अधिभार में नहीं हैं तो यह होगा। यदि आप बाद में ऐसा करते हैं, तो कहें कि जब अजाक्स कॉल लौटाता है, तो यह पृष्ठ मिटा देगा। –

+0

चेस सेबर्ट सही है कि पृष्ठ को लोड होने के बाद इसे पृष्ठ मिटा दिया जाएगा। – some

0

क्या आपके लिए एक हुक जोड़ने के लिए संभव है जिसे आप नए टेक्स्टरेरा को लक्षित करने के लिए उपयोग कर सकते हैं? जैसे। एक <div>

<div id="addtextarea"></div> 

var e = document.getElementByID('addtextarea'); 
e.innerHTML = '<textarea></textarea>'; 

तो अगर आप सामग्री या तो आप innerHTML मान ले HTML या पाठ क्षेत्र के केवल पाठ नोड मान पाठ निकालने के लिए शामिल करने के लिए कर सकता है याद करने के लिए की जरूरत है।

4

document.write() पृष्ठ सामग्री को तब तक नहीं उड़ाएगा जब तक कि इसे पृष्ठ के रूप में इनलाइन निष्पादित किया जाता है। ऑनलाइन विज्ञापन दस्तावेज़ में लिखने के लिए document.write() का व्यापक उपयोग करता है।

यदि आपने पृष्ठ इतिहास में बाद में दस्तावेज़.write() विधि को निष्पादित किया है (शरीर को पूरी तरह से प्रस्तुत करने के बाद) तो चेस कहता है, यह मौजूदा निकाय को उड़ा देगा और दस्तावेज़ को तर्क प्रदर्शित करेगा ।लिखना()।

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

0

आम तौर पर, मैं एक डोम तत्व बनाना और इसे सम्मिलित करना पसंद करता हूं - विशेष रूप से जब से मैं इसे पृष्ठ में चाहता हूं (यानी object.appendChild या body.appendChild का उपयोग करें)। इससे कोई फर्क नहीं पड़ता कि प्रविष्टि पृष्ठ लोड के दौरान या बाद में है, इसलिए मैं एक सामान्यीकृत प्रविष्टि फ़ंक्शन का उपयोग कर सकता हूं और पूर्ण पृष्ठ लोड के दौरान या उसके बाद इसे किसी भी समय उपयोग कर सकता हूं।

हालांकि, लोड प्रक्रिया के दौरान, यदि आप सामग्री सम्मिलित कर रहे हैं जिसमें जावास्क्रिप्ट शामिल है (यानी एक एससीआरआईपीटी प्रकार = "टेक्स्ट/जावास्क्रिप्ट" ......./एससीआरआईपीटी अनुक्रम), तो आपको दस्तावेज़ का उपयोग करना होगा।स्क्रिप्ट निष्पादित करने के लिए लिखें।

  • document.body.appendChild (theInsertionObject) का उपयोग करना ठीक से स्क्रिप्ट टैग अनुक्रम सहित लोड की प्रक्रिया में वर्तमान बिंदु पर प्रविष्टि जोड़ना होगा, लेकिन यह JavaScript का निष्पादन नहीं होगा।

  • आप document.write (theInsertionCode) का उपयोग करते हैं, कोड लोड की प्रक्रिया में वर्तमान बिंदु पर डाला हो जाएगा, और किसी भी एम्बेडेड स्क्रिप्ट टैग अनुक्रम पेज भरी हुई है के शेष के पहले निष्पादित किया जाएगा।