มาทำ Autosave กันเถอะ jQuery Ajax ช่วยได้

มาอัพเดทต่อๆ วันนี้จริงๆว่าจะนอนแล้วล่ะ เหนื่อยๆ ง่วงๆ เพลียๆ มึนๆ ยังไงชอบกล แต่เอาว่า อยากได้ keyword “AJAX” ก็ต้องขยันอัพกันนิดนึง เพราะผมเชื่อในเรื่อง Content is the King เลย พยายมๆ สร้าง Unique Content ที่มีคุณภาพขึ้นมา ^^

วันนี้เราลองมาประยุกต์ใช้ ajax ในการทำ auto save ดีกว่า จริงๆ plugin แบบนี้ ถ้าหาดูจาก Google ก็จะเห็นอยู่ 2-3 ตัว มีทั้งแบบ save ลง Cookie หรือ ส่งไปทำงานตาม url ที่เรากำหนด พร้อม function restore มาเสร็จสรรพ

แต่เนื่องจากวันนี้ผมไม่ได้มา review แต่จะมาอธิบายถึง การประยุกต์ใช้งาน ajax ใน jQuery กัน เลยจะขอลองเขียน plugin แบบ simple ขึ้นมาใช้งานเองกัน เอาแบบง่ายๆ พอเป็นพิธีก็พอ

การทำ Autosave นั้น ก็คือการส่งข้อมูลไป save เป็นระยะๆ ทั้งๆ ที่เรายังไม่ได้กด save เลย โดยการทำแบบนี้ ก็มีข้อดีของมันดังนี้ครับ

1. ช่วยให้ข้อมูล ไม่หายในกรณี ไฟดับ คอมแฮงค์ หรือปัญหาที่ เรียกได้ว่าเป็น อุบัติเหตุ ทางเทคนิค

2. ช่วยเรื่อง session timeout ในกรณีที่ set timeout ของช่วงเวลา login

3. เท่ห์ ….

เอาล่ะ ทีนี้เรามาลองเขียน plugin ง่ายๆกัน สักตัวนึง

File: autosave.jquerytips.js

  1.  
  2. jQuery.extend({
  3.  
  4.         autosave: function(s) {
  5.                 var defaults = {
  6.                         form: ‘#myform’,
  7.                         delay: 10000,
  8.                         calback:
  9.                 }
  10.                 var options = jQuery.extend(defaults, s);
  11.                 this.save(options);
  12.         },
  13.         save: function(i) {
  14.                 setInterval(function() {
  15.  
  16.                         var eml = document.createElement(‘div’);
  17.                         jQuery(eml).attr(‘id’, ’status’).css({
  18.                                 position: ‘absolute’,
  19.                                 background: ‘red’,
  20.                                 color: ‘white’,
  21.                                 padding: ‘3px 10px’,
  22.                                 font: ‘12px verdana’,
  23.                                 top: jQuery(document).scrollTop(),
  24.                                 right: 0
  25.                         }).html(’saved’);
  26.  
  27.                         jQuery(‘body’).prepend(eml);
  28.  
  29.                         var urlPost = jQuery(i.form).attr(‘action’);
  30.                         var params = jQuery(i.form).find(‘input, textarea, select’).serialize();
  31.                         jQuery.ajax({
  32.                                 url: urlPost,
  33.                                 type: ‘POST’,
  34.                                 data: params,
  35.                                 success: function(rs) {
  36.                                         setTimeout(function() { jQuery(‘#status’).remove() }, 2000);
  37.                                         i.callback(rs);
  38.                                 }
  39.                         });
  40.                 }, i.delay);
  41.         }
  42.  
  43. });
  44.  

จากที่เห็น plugin จะทำงานแบบนี้ครับ คือรับ parameter เข้ามากำหนดค่า ดังนี้
form = id ของ Form ที่เราต้องการทำงานด้วย
delay = ช่วงหน่วงเวลาของการ save แต่ระครั้ง (inteval)
callback = ค่าที่จะ return กลับไปจากไฟล์ปลายทาง

คำสั่งหลักๆ จะอยู่ที่ method save ครับ โดยเริ่มต้นจาก การ set inteval ตามช่วงเวลาหน่วง และ ตกแต่งให้สวยงาม โดยการทำ label save ให้แสดงผล ที่บนขวา ของหน้าจอ

จากนั้นก็จะหา action ของ form มาด้วย

  1. var urlPost = jQuery(i.form).attr(‘action’);

หาค่าทั้งหมดของ input มา serialize ด้วยคำสั่ง

  1. var params = jQuery(i.form).find(‘input, textarea, select’).serialize();

แล้วก็ส่งให้ ajax ทำงาน สุดท้ายส่งค่าอะไรก็ตามที่ ไฟล์ save ส่งมาคืนให้กับ callback

File: sample.html

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html>
  3. <head>
  4. <title>jQueryTips.com</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"></script>
  7. <script src="autosave.jquerytips.js" type="text/javascript"></script>
  8. <script type="text/javascript">
  9. <!–
  10.         $(function() {
  11.  
  12.                 $.autosave({
  13.                         form: ‘#autosave’,
  14.                         delay: 10000,
  15.                         callback: function(data) {
  16.                                 alert( data );
  17.                         }
  18.                 });
  19.  
  20.         });
  21. //–>
  22. </script>
  23. </head>
  24. <body>
  25. <p style="height:500px;"></p>
  26.  
  27. <form method="post" action="save.php" id="autosave">
  28. <fieldset>
  29.         <legend>Auto Save Plugin by jQueryTips.com</legend>
  30.         <p>
  31.                 <label>Field 1</label>
  32.                 <input type="text" name="field_1" value="" />
  33.         </p>
  34.         <p>
  35.                 <label>Field 2</label>
  36.                 <textarea name="field_2"></textarea>
  37.         </p>
  38.         <p>
  39.                 <label>Field 3</label>
  40.                 <select name="field_3">
  41.                         <option value="a">A</option>
  42.                         <option value="b">B</option>
  43.                         <option value="c">C</option>
  44.                 </select>
  45.         </p>
  46.         <p>
  47.                 <label>Field 4</label>
  48.                 <input type="radio" name="field_4" value="yes" /> Yes
  49.                 <input type="radio" name="field_4" value="no" /> No
  50.         </p>
  51.                 <label>Field 5</label>
  52.                 <input type="checkbox" name="field_5" value="agree" /> Agree
  53.         </p>
  54.         <p>
  55.                 <input type="submit" value="Save" />
  56.         </p>
  57. </fieldset>
  58. </form>
  59.  
  60. </body>
  61. </html>

ส่วนนี้คือวิธีเรียกใช้งานครับ โดยระบุ parameters ไป คือ form, delay, callback (data ที่ return กลับมา จะเอามาทำอะไรต่อก็ตามแต่)

เท่านี้ก็เป็นอันเสร็จ

ส่วนการใช้งานในเรื่องของ save นั้นเราอาจจะทำได้แบบนี้ครับ
ส่งค่าเป็นเก็บลง DB จริงๆ เลย แต่ว่าทำ status เท่ากับ draft ไว้จากนั้นส่ง lnsert id กลับมา แล้วให้ callback append input hidden ของ id ลงไปใน เอกสาร HTML

หรือใครอาจจะเอาไปใช้แบบอื่นก็ได้นะครับ เช่นลองเก็บแบบ temporary เช่น memcached, apc, session, cookie, file อะไรก็ตามแต่จะไปคิดกัน

วันนี้พอแค่นี้ล่ะ บายๆ

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

2 Comments »

 
  • Rux says:

    อันนี้แจ่มครับ ขอใช้ๆๆ อิอิ

  • ball6847 says:

    ผมเหมือนโรคจิตอย่างนึง คือถ้าเลี่ยง request ไปยัง server ได้จะเลี่ยงให้หมด นึกๆดูแล้วถ้าใช้พวก storage น่าจะช่วยได้นะครับ คือเซฟข้อมูลไว้ใน client โดยใช้ flash หรือ gear ช่วย (จริงๆแล้ว 2 อย่างนี้ผมก็ไม่เป็นนะ เคยใช้ใน storage ของใน YUI อ่ะคับมันมี api ให้)

 

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>