นับตั้งแต่มีการเผยแพร่บทความ [JavaScript] การปรับแต่ง MessageBox ชาวเน็ตจำนวนมากได้เขียนเพื่อสอบถามวิธีการเรียกใช้เมธอด ShowInfo บนฝั่งเซิร์ฟเวอร์ ฉันคิดว่ามีวิธีประนีประนอมเพื่อให้บรรลุผลในช่วงสุดสัปดาห์
ก่อนอื่น เราควรจะอธิบายให้กระจ่างได้ว่าเหตุใดเราจึงใช้ Page.Write เพื่อส่งออกวิธี JS แบบกำหนดเองไปยังเพจ และเหตุใด IE จึงไม่รู้จักมัน และข้อผิดพลาด "XXX ไม่ได้กำหนดไว้" จะปรากฏขึ้น เหตุผลนั้นง่ายมาก เนื่องจากสคริปต์ที่เราส่งออกโดยใช้ Page.Write จะปรากฏที่ด้านบนของหน้า เมื่อ IE อ่านว่าเป็นฟังก์ชันจาวาสคริปต์ IE จะเริ่มดำเนินการดังกล่าว อย่างไรก็ตาม ไฟล์ js ที่เราเชื่อมโยงไปไม่ได้ถูกอ่านโดย IE ในขณะนี้ ดังนั้น IE จึงไม่สามารถจดจำวิธีการที่เรากำหนดไว้ในไฟล์ js ได้ แล้วเหตุใดจึงมีการแจ้งเตือนการเขียนได้? เนื่องจากการแจ้งเตือนเป็นฟังก์ชันสคริปต์ที่ฝังอยู่ใน IE IE จึงจดจำได้ไม่ว่าจะมีเพจหรือไม่ก็ตาม
เมื่อคุณพบปัญหาแล้ว ปัญหาก็จะได้รับการแก้ไขตามธรรมชาติ:
1. ฝังวิธีการที่เรากำหนดเองลงใน IE ---> มันดูแปลกๆ นิดหน่อย 555
2. รอจนกว่าเพจจะโหลดก่อนที่จะเริ่มกิจกรรม --->ทริกเกอร์เหตุการณ์ ใช่
คุณจะรู้ได้อย่างไรว่าเพจโหลดเสร็จแล้ว?
1. ผ่านสถานะของเอกสาร
2. ทริกเกอร์โดยเหตุการณ์ (windows.onload)
อันแรกดูเหมือนจะปลอดภัยน้อยกว่า บางครั้งมันยังแสดงว่ากำลังส่งข้อมูลถึงแม้จะโหลดเสร็จแล้ว (FF เป็นสถานการณ์ที่ชัดเจนที่สุด) ดังนั้นจึงปลอดภัยกว่าที่จะใช้เหตุการณ์
กำหนดวิธีการง่ายๆ ติดตั้งใน windows.onload และทำเครื่องหมายเมื่อดำเนินการ
var loadComplete = เท็จ;
ฟังก์ชั่น LoadCompleted()
-
โหลดเสร็จสมบูรณ์= จริง;
-
window.attachEvent("onload",LoadCompleted);
ฮ่าๆ ด้วยวิธีนี้เราแค่ต้องตัดสินว่าเพจนั้นโหลดโดยการตัดสินว่า loadComplete หรือไม่
var mImgdir = "";
var mCaption = "คำอธิบายภาพ";
var mMsg = "ข้อความ";
var mOkClick= null;
ฟังก์ชั่น ShowMessage (imgdir, คำบรรยาย, msg, OkClick)
-
ถ้า (โหลดเสร็จสมบูรณ์)
-
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
-
-
ด้วยวิธีนี้ เมื่อ loadComplete ไม่เป็นเท็จ เราจะไม่ดำเนินการเมธอด KMessageBox.ShowInfo() แต่จะไม่มีพรอมต์ข้อผิดพลาด JS
เพียงอย่างเดียวไม่เพียงพอ เนื่องจากสคริปต์เอาต์พุตจะถูกเรียกใช้งานเพียงครั้งเดียวโดย IE เมื่อส่งออกเพจ แต่ขณะนี้ loadComplete=false ดังนั้นเราจึงจำเป็นต้องตรวจสอบเป็นประจำว่าเพจถูกโหลดหรือไม่ เมื่อพูดถึงเรื่องเวลา เราแค่ใช้ setTimeout & setInterval เราต้องการการตรวจจับอย่างต่อเนื่อง ดังนั้นเราจึงใช้เมธอด setInterval รหัสสุดท้ายมีดังนี้:
var loadComplete = เท็จ;
var mImgdir = "";
var mCaption = "คำอธิบายภาพ";
var mMsg = "ข้อความ";
var mOkClick= null;
var ตัวจับเวลา ID;
ฟังก์ชั่น ShowMessage (imgdir, คำบรรยาย, msg, OkClick)
-
ถ้า (โหลดเสร็จสมบูรณ์)
-
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
//ยกเลิกการโหลดเหตุการณ์นี้ window.detachEvent("onload",function(){LoadCompleted;}); //หยุดการทริกเกอร์เวลา
window.clearInterval(รหัสจับเวลา);
}
}
ฟังก์ชัน LoadCompleted() { loadComplete=true; }
window.attachEvent("onload",LoadCompleted);
//ตั้งค่ากลไกการตรวจจับเวลา
timerID = window.setInterval (ShowMessage, 1);
แน่นอนว่าโค้ดข้างต้นเข้ากันได้กับ IE เท่านั้นเนื่องจากใช้แนบ Event และ detachEvent สำหรับการทำให้มันเข้ากันได้กับเบราว์เซอร์อื่น ๆ โปรดดู [JavaScript] การปรับแต่งวิธีแสดงชื่อเรื่องสำหรับวิธีการจัดการ:
if(!document.attachEvent)//ไม่ใช่ IE
-
document.attachEvent = function(){document.addEventListener(อาร์กิวเมนต์[0].substr(2),อาร์กิวเมนต์[1],อาร์กิวเมนต์[2])}
-
if(!window.attachEvent)//ไม่ใช่ IE
-
window.attachEvent = function(){window.addEventListener(อาร์กิวเมนต์[0].substr(2),อาร์กิวเมนต์[1],อาร์กิวเมนต์[2])}
-
ทางฝั่งเซิร์ฟเวอร์ ตราบใดที่ StringBuilder สร้างสคริปต์ด้านบนแล้วเขียนสคริปต์ มันก็เพียงพอแล้ว ข้างต้นเป็นเพียงการให้แนวคิด แน่นอนว่า มีวิธีอื่นอีก ตัวอย่างเช่น ฉันไม่ได้ใช้การตรวจจับตามกำหนดเวลา ฉันเมานต์โดยตรงใน windows.onload และปล่อยให้เพจตรวจสอบและดำเนินการโดยอัตโนมัติ มันก็ไม่ใช่ความคิดที่ไม่ดีเช่นกัน :) ดังคำกล่าวที่ว่า ถนนทุกสายมุ่งสู่กรุงโรม~~~~~
แนวคิดข้างต้นมาจาก yui และ yui ได้นำ MessageBox แบบกำหนดเองที่สวยงามยิ่งขึ้นไปใช้ เพื่อนๆ ที่สนใจสามารถศึกษาร่วมกันได้
http://www.cnblogs.com/walkingboy/archive/2006/08/28/autorun_customerfunction.html