मैं एक ही समस्या से जूझ रहा था। एक अंतर यह है कि मेरी विधि में AJAX ऑटो-सेविंग शामिल है जो आप जीमेल और ब्लॉगर में देखते हैं। लेकिन वास्तव में, कार्यान्वयन में बदलाव नहीं करना चाहिए।
समस्या यह थी कि मैं सामान्य सारणी में सहेजना नहीं चाहता था क्योंकि उसे सत्यापन (पूर्णांक, मुद्राएं, तिथियां इत्यादि मान्य करना) आवश्यक था। और मैं उस बारे में उपयोगकर्ता को तब तक नहीं छीनना चाहता था जब वे वास्तव में छोड़ने की कोशिश कर रहे हों।
मैं आखिरकार आया था, जिसे अजाक्ससेवडेटा नामक एक टेबल था। यह डेटाबेस में एक स्थायी तालिका है, लेकिन इसमें मौजूद डेटा अस्थायी है। दूसरे शब्दों में, यह उपयोगकर्ता के डेटा को अस्थायी रूप से तब तक संग्रहीत करेगा जब तक वे वास्तव में पृष्ठ को पूरा न करें और अगले पर जाएं।
तालिका बस कुछ स्तंभों से बना है:
AjaxSavedDataID - int:
प्राथमिक कुंजी।
UserID - int:
उपयोगकर्ता (आसान पर्याप्त) की पहचान करें।
पृष्ठ का नाम दिखना - varchar (100):
आवश्यक आप एक से अधिक पृष्ठों के साथ काम कर रहे हैं।
ControlID - varchar (100):
मैं इस एक ControlID फोन है, लेकिन इसे वास्तव में सिर्फ ClientID संपत्ति जो .NET WebControls के सभी के लिए उजागर करता है। इसलिए यदि उदाहरण के लिए txtEmail उपयोगकर्ता नाम के संपर्क में था, तो क्लाइंट आईडी संपर्क_txtEmail होगा।
मूल्य - varchar (max):
मूल्य उपयोगकर्ता किसी दिए गए क्षेत्र या नियंत्रण के लिए प्रवेश किया।
DateChanged - दिनांक:
दिनांक मान जोड़ा गया है या संशोधित।
कुछ कस्टम नियंत्रणों के साथ, यह प्रणाली "बस काम करने" के लिए यह सब आसान बनाता है। हमारी साइट पर, प्रत्येक टेक्स्टबॉक्स, ड्रॉपडाउनलिस्ट, रेडियोबुटटनलिस्ट आदि का क्लाइंट आईडी किसी दिए गए पृष्ठ के लिए अद्वितीय और सुसंगत होने की गारंटी है। तो मैं यह सब लिखने में सक्षम था ताकि सहेजे गए डेटा की पुनर्प्राप्ति स्वचालित रूप से काम करे। दूसरे शब्दों में, जब भी मैं किसी फॉर्म में कुछ फ़ील्ड जोड़ता हूं, तो मुझे इस कार्यक्षमता को तार-अप करने की आवश्यकता नहीं होती है।
यह ऑटो-सेविंग कार्यक्षमता techinsurance.com पर एक बहुत ही गतिशील ऑनलाइन व्यापार बीमा आवेदन में अपना रास्ता बनायेगी ताकि इसे थोड़ा अधिक उपयोगकर्ता के अनुकूल बनाया जा सके।
function getNewHTTPObject() {
var xmlhttp;
/** Special IE only code */
/*@cc_on
@if (@_jscript_version >= 5)
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (E) {
xmlhttp = false;
}
}
@else
xmlhttp = false;
@end
@*/
/** Every other browser on the planet */
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
try {
xmlhttp = new XMLHttpRequest();
}
catch (e) {
xmlhttp = false;
}
}
return xmlhttp;
}
function AjaxSend(url, myfunction) {
var xmlHttp = getNewHTTPObject();
url = url + "&_did=" + Date();
xmlHttp.open("GET", url, true);
var requestTimer = setTimeout(function() { xmlHttp.abort(); }, 2000);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2005 00:00:00 GMT");
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState != 4)
return;
var result = xmlHttp.responseText;
myfunction(result);
};
xmlHttp.send(null);
}
// Autosave functions
var SaveQueue = []; // contains id's to the DOM object where the value can be found
var SaveQueueID = []; // contains id's for binding references (not always the same)
function ArrayContains(arr, value) {
for (i = 0; i < arr.length; i++) {
if (arr[i] == value)
return true;
}
return false;
}
function GetShortTime() {
var a_p = "";
var d = new Date();
var curr_hour = d.getHours();
if (curr_hour < 12)
a_p = "AM";
else
a_p = "PM";
if (curr_hour == 0)
curr_hour = 12;
else if (curr_hour > 12)
curr_hour = curr_hour - 12;
var curr_min = d.getMinutes();
curr_min = curr_min + "";
if (curr_min.length == 1)
curr_min = "0" + curr_min;
return curr_hour + ":" + curr_min + " " + a_p;
}
function Saved(result) {
if (result == "OK") {
document.getElementById("divAutoSaved").innerHTML = "Application auto-saved at " + GetShortTime();
document.getElementById("divAutoSaved").style.display = "";
}
else {
document.getElementById("divAutoSaved").innerHTML = result;
document.getElementById("divAutoSaved").style.display = "";
}
}
function getQueryString(name, defaultValue) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
if (pair[0] == name) {
return pair[1];
}
}
return defaultValue;
}
function urlencode(str) {
return escape(str).replace(/\+/g, '%2B').replace(/%20/g, '+').replace(/\*/g, '%2A').replace(/\//g, '%2F').replace(/@/g, '%40');
}
function AutoSave() {
if (SaveQueue.length > 0) {
var url = "/AjaxAutoSave.aspx?step=" + getQueryString("step", "ContactInformation");
for (i = 0; i < SaveQueue.length; i++) {
switch (document.getElementById(SaveQueue[i]).type) {
case "radio":
if (document.getElementById(SaveQueue[i]).checked)
url += "&" + SaveQueueID[i] + "=" + urlencode(document.getElementById(SaveQueue[i]).value);
break;
case "checkbox":
if (document.getElementById(SaveQueue[i]).checked)
url += "&" + SaveQueueID[i] + "=" + urlencode(document.getElementById(SaveQueue[i]).value);
default:
url += "&" + SaveQueueID[i] + "=" + urlencode(document.getElementById(SaveQueue[i]).value);
}
}
SaveQueue = [];
SaveQueueID = [];
AjaxSend(url, Saved);
}
}
function AddToQueue(elem, id) {
if (id == null || id.length == 0)
id = elem.id;
if (!ArrayContains(SaveQueueID, id)) {
SaveQueue[SaveQueue.length] = elem.id;
SaveQueueID[SaveQueueID.length] = id;
}
}
अपने पृष्ठ में जोड़ें इस काम करने के लिए:
window.setInterval("AutoSave()", 5000);
और एक को यह लागू करने के लिए
मामले आप रुचि रखते हैं, यहाँ जावास्क्रिप्ट कि अनुमति देता है ऑटो की बचत है टेक्स्टबॉक्स, ड्रॉपडाउनलिस्ट, लिस्टबॉक्स, या चेकबॉक्स आपको बस इस विशेषता को जोड़ने की आवश्यकता है:
onchange="AddToQueue(this)"
... या इसके लिए एक रेडियोबटन सूची या चेकबॉक्स सूची:
onchange="AddToQueue(this, '" + this.ClientID + "')"
मुझे लगता है कि यह वह दृष्टिकोण है जिसे मैं लेना चाहता हूं, लेकिन धारावाहिक भाग वह हिस्सा है जिसकी मुझे सहायता चाहिए। –
एक रिलीज आलेख प्रतीत होता है जो एक संदर्भ जोड़ा गया है, शायद यहां कोई भी शर्मिंदा नहीं होने पर धारावाहिक तकनीकों के बारे में एक दूसरा प्रश्न पूछें। – djna