[ oracle ] SQL developer opens multiple table tabs

Preferences

 

รูปภาพ

Advertisements

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 )