ajax comet basic tutorial

เพราะว่า server ไม่สามารถเปิด connection ไปยัง browser ได้
ทางเดียวที่เป็นไปได้คือ ให้ browser hold connection ไว้

เช่น ถ้าเป็น php ก็ใช้ sleep

แล้วไปแก้ปัญหา server timeout โดยการเปิด connection ใหม่ ( resetConnection )

resetConnection คร่าวๆ คือ ใข้ heartbeat

ก็คือ call function heartbeat ทุกครั้งที่ response กลับมา เพื่อกันไม่ให้ heartbeat มันไป resetConnection

var timeoutId = null;

function heartbeat(){

clearTimeout(timeoutId);

timeoutId = setTimeout(resetConnection, 10000); // 10 sec.

}

ถ้า connection มันขาดหายไป ( timeout ไปแล้ว ) มันก็จะ resetConnection ใหม่ให้เอง

ซึ่งปกติเขาใช้ iframe เป็นตัว connector กัน โดยเซต src ( location ) ของ iframe เป็นไฟล์ response เลย

แต่มันด้วยการที่มันเป็น iframe เลยมีปัญหานิดหน่อย คือ browser จะขึ้นสถานะเป็น Loading ตลอดเวลา เพราะว่า connection ไปยัง server ในหน้า iframe ไม่ได้ถูกปิดไป

วิธีแก้สำหรับ IE คือ

แทนที่จะใส่ iframe ตรงๆ ก็ไปใส่ iframe ไว้ใน ActiveRecord(“htmlfile”); ซึ่งเป็น object ของ IE

ซึ่ง htmlfile ของ IE มันแยกจากหน้าเวป ดังนั้น จะไม่มีสถานะ loading ใน browser มาให้วุ่นวายใจ

เช่น

oPage = new ActiveRecord("htmlfile");

oPage.open();

oPage.write("<html><body></body></html>");

oPage.close("");

# โดยอย่าลืมใส่ reference ไปที่หน้าปัจจุบันด้วย เพราะว่า htmlfile ของ IE มันแยกเด็ดขาดจากหน้าเพจจริงๆ ( ใช้ parent หรือ top เรียกไม่ได้ )

oPage.parentWindow._parent = self;  # คือ เซตให้เพจลูกเรียก parent._parent แล้วมาเจอ object นี้นั่นเอง
# ดังนั้นในเพจ response ใน iframe จึงเรียก parent._parent.heartbeat() ได้

# หมายเหตุ <em>_parent</em> เป็นชื่อเฉยๆ นะ จะเปลี่ยนเป็นอย่างอื่นก็ได้แหละ</strong>

oPage.body.innerHTML = "<iframe src=\"http://dsin.blogspot.com\"></iframe>"

วิธีแก้สำหรับ firefox คือ

firefox มีวิธีจัดการกับ HTTP streaming ได้ดีกว่า IE

แทนที่จะใช้ iframe ก็ให้ไปใช้ XMLHttpRequest แทน โดยดักจับ สถานะ .readyState เป็น 3 ( คือ ส่งแล้ว ยังไม่ complete )

ref : comet and reverse ajax book ( Apress )