ฉันพบปัญหาข้ามโดเมนเมื่อสองวันก่อนและสามารถแก้ไขได้โดยใช้ JSONP (//www.vevb.com/article/57889.htm)
ฉันได้แยกออกเมื่อเร็ว ๆ นี้:
1.JSONP
คำขอ AJAX, ประเภทข้อมูลคือ JSONP แบบฟอร์มนี้ต้องการคำขอที่จะปรับให้เข้ากับแบบฟอร์มที่ส่งคืนการโทรกลับ ([JSON-Object]) ทางฝั่งเซิร์ฟเวอร์ หากเซิร์ฟเวอร์ส่งคืนวัตถุ JSON ปกติ จากนั้นเมื่อทำการดีบักข้อผิดพลาด "SyntaxError ที่ไม่ได้รับการยกเว้น: โทเค็นที่ไม่คาดคิด" จะถูกรายงานบนคอนโซลของเบราว์เซอร์ Chrome; ข้อผิดพลาด "syntaxerror: หายไป; ก่อนหน้าคำสั่ง" จะถูกรายงานบนคอนโซลของเบราว์เซอร์ Firefox
2. อิเล็กทรอนิกส์ข้ามโดเมน
เพิ่มองค์ประกอบ iframe ลงในหน้า เมื่อคุณต้องการเรียกร้องขอ GET ให้ตั้งค่า SRC ของ IFRAME เป็น URL คำขอ GET เพื่อเริ่มการโทรไปยังคำขอ GET
การคัดลอกรหัสมีดังนี้:
var url = "http://xxx.xxx.xxxx?p1=1&p2=2";
$ ("#iframe"). attr ("src", url); // cross-domain, ใช้ iframe
วิธีการ IFRAME นั้นแข็งแกร่งกว่า JSONP นอกเหนือจากความสามารถในการจัดการคำขอ HTTP แล้วยังสามารถใช้การโทร JS ข้ามโดเมนได้
3. การประมวลผลคุณลักษณะ SRC ขององค์ประกอบสคริปต์
แอตทริบิวต์ SRC ของ IFRAME, IMG, สไตล์, สคริปต์และองค์ประกอบอื่น ๆ สามารถขอทรัพยากรโดยตรงจากโดเมนที่แตกต่างกัน JSONP เป็นการใช้งานทรัพยากรการร้องขอข้ามโดเมนอย่างง่ายโดยใช้แท็กสคริปต์ ดังนั้นนี่จึงเป็นหลักเช่นเดียวกับ JSONP และยังต้องการให้เซิร์ฟเวอร์ร้องขอการโทรกลับ ... แบบฟอร์ม
การคัดลอกรหัสมีดังนี้:
var url = "http://xxx.xxx.xxx?p1=1";
var script = document.createElement ('script');
script.setAttribute ('src', url);
document.getElementByTagname ('head') [0] .AppendChild (สคริปต์);
4. ใช้การประมวลผลบนเซิร์ฟเวอร์
สำหรับผู้ที่ไม่มีข้อกำหนดที่เข้มงวดสำหรับการประมวลผลในส่วนหน้าพวกเขาสามารถห่อหุ้มพวกเขาบนเซิร์ฟเวอร์แล้วเริ่มการโทรบนเซิร์ฟเวอร์ซึ่งสามารถแก้ปัญหาข้ามโดเมนได้ จากนั้นขึ้นอยู่กับว่าจะมีการออกคำขอหรือต้องได้รับมูลค่าคืนเราจะตัดสินใจว่ารหัสใช้โหมดซิงโครนัสหรือแบบอะซิงโครนัส
การคัดลอกรหัสมีดังนี้:
โมฆะคงที่ส่วนตัว createGetHttPresponse (string url, int? หมดเวลา, สตริง useragent, คุกกี้ CookieCollection)
-
if (string.isnullorEmpty (URL))
-
โยนอาร์กิวเมนต์ใหม่ nullexception ("url");
-
VAR Request = WebRequest.Create (URL) เป็น httpWebRequest;
request.method = "รับ";
if (! string.isnullorEmpty (useragent))
-
request.useragent = useragent;
-
if (timeout.hasvalue)
-
request.timeout = timeout.value;
-
ถ้า (คุกกี้! = null)
-
request.cookieContainer = new CookieContainer ();
request.cookiecontainer.add (คุกกี้);
-
request.begingetResponse (null, null); // asynchronous
// return request.getResponse () เป็น httpwebresponse;
-
5. ฟลัชข้ามโดเมน
ล้ำสมัยเกินไป == ศึกษาอีกครั้ง
สรุป: 5 วิธีข้างต้นเป็นวิธีทั่วไปในการแก้ปัญหาข้ามโดเมนของ JS อันสุดท้ายค่อนข้างสูง มาแต่งหน้าหลังจากที่ฉันได้ศึกษาอย่างชัดเจน