عندما يستخدم العديد من الأشخاص AJAX لاستدعاء محتوى على مواقع أشخاص آخرين، سيطالبك JS بخطأ عدم وجود إذن، وهذا تقييد لمكون XMLHTTP - لأسباب أمنية
يُمنع الدخول إلى مواقع الويب التي ليست من نفس النطاق، وإليك مثال للوصول إلى http://www.google.cn،
<نوع البرنامج النصي=نص/جافا سكريبت>
وظيفة إنشاءobj () {
إذا (window.ActiveXObject) {
إرجاع ActiveXObject الجديد (Microsoft.XMLHTTP)؛
}
وإلا إذا (window.XMLHttpRequest) {
إرجاع XMLHttpRequest(); جديد
}
}
وظيفة getWebPage(url) {
var oBao=createobj();
var my_url=url
oBao.open('get',my_url,false);
oBao.onreadystatechange=function(){
إذا (oBao.readyState==4){
إذا (oBao.status==200){
var returnStr=oBao.responseText;
document.write(returnStr);
}آخر{
document.write(لم يتم العثور على العنوان الذي أدخلته أو حدث خطأ في الخادم 505!);
}
}
}
oBao.send(null);
}
getWebPage('http://www.google.cn');
</script>
احفظ هذا الرمز في test.html وافتحه محليًا باستخدام IE دون أي مشكلة، ولكن بعد تحميل هذا الرمز إلى الخادم، تحدث مشكلة - لا يطالب JS بأي خطأ في الإذن!!!
دعونا نفكر في الأمر: نظرًا لأنه لا يمكنك الوصول إلى عناوين غير نفس النطاق، فيمكنك فقط الوصول إلى العناوين الموجودة في نفس المجال. كيف يمكن للملفات الديناميكية في نفس المجال الحصول على محتوى صفحات الويب في نفس المجال؟ ما زلنا نفكر في AJAX، ولكن يتم تنفيذ AJAX هذا من جانب الخادم.
الفكرة العامة هي كما يلي: أرسل أولاً عنوان URL إلى ملف في موقعك باستخدام AJAX، مثل getPage.asp---في getPage.asp، قم بالوصول إلى عنوان URL المقدم مرة أخرى من خلال خادم XMLHTTP---قم بإرجاع المحتوى الذي تم الحصول عليه إلى صفحة URL المقدمة ---- عرض المحتوى
لنبدأ بتنظيم الكود، بدءًا من ملف test.html
<نوع البرنامج النصي=نص/جافا سكريبت>
وظيفة إنشاءobj () {
إذا (window.ActiveXObject) {
إرجاع ActiveXObject الجديد (Microsoft.XMLHTTP)؛
}
وإلا إذا (window.XMLHttpRequest) {
إرجاع XMLHttpRequest(); جديد
}
}
وظيفة getWebPage(url) {
var oBao=createobj();
var my_url=getpage.asp?url=+escape(url);
oBao.open('get',my_url,false);
oBao.onreadystatechange=function(){
إذا (oBao.readyState==4){
إذا (oBao.status==200){
var returnStr=oBao.responseText;
document.write(returnStr);
}آخر{
document.write(لم يتم العثور على العنوان الذي أدخلته أو حدث خطأ في الخادم 505!);
}
}
}
oBao.send(null);
}
getWebPage('http://www.google.cn');
</script>
ثم هناك ملف getpage.asp (ملاحظة: يجب حفظ هذا الملف بتنسيق UTF-8 لمنع الأحرف المشوهة)، كما يلي:
<%
Response.charset=UTF-8
reg=/<meta.+ charset= {0,}([^/ />//]*).+//{0,1}/>
'اسم الوظيفة: GetResStr
'الوظيفة: احصل على كود HTML لعنوان URL المحدد
'المعلمات: URL-عنوان URL الذي سيتم الحصول عليه
الدالة GetResStr(URL)
واضح
خافت ResBody، ResStr، PageCode، ReturnStr
تعيين Http=createobject(MiCROSOFT.XMLHTTP)
Http.open الحصول على، URL، خطأ
المتشعب.إرسال ()
إذا Http.Readystate = 4 ثم
إذا Http.status=200 ثم
ResStr=http.responseText
ResBody=http.responseBody
PageCode=GetCode(ResStr,reg)
ReturnStr=BytesToBstr(http.responseBody,PageCode)
GetResStr=ReturnStr
نهاية إذا
نهاية إذا
وظيفة النهاية
'اسم الوظيفة: BytesToBstr
'الوظيفة: تحويل البيانات الثنائية إلى أحرف
'المعلمات: بيانات الجسم الثنائية، طريقة تشفير النص Cset
الدالة BytesToBstr(Body,Cset)
خافت Objstream
تعيين Objstream = CreateObject(adodb.stream)
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.اكتب النص
objstream.Position = 0
objstream.Type = 2
objstream.Charset =Cset
BytesToBstr = objstream.ReadText
objstream.Close
تعيين objstream = لا شيء
وظيفة النهاية
'اسم الوظيفة: GetCode
'الوظيفة: تحويل ثنائي إلى حرف
'المعلمات: سلسلة str المطلوب الاستعلام عنها، وتعبير regstr-regular
الدالة GetCode(str,regstr)
ديم ريج، serStr
تعيين Reg = RegExp الجديد
Reg.IgnoreCase = صحيح
Reg.MultiLine = صحيح
Reg.Pattern =regstr
إذا Reg.test(str) ثم "إذا تم العثور على عنصر مطابق."
تعيين Cols = Reg.Execute(str)
serStr=Cols(0).SubMatches(0) 'استخدم أول تطابق تم العثور عليه
else 'خلاف ذلك، قم بإعطاء القيمة الافتراضية gb2312، وهي كسول بعض الشيء. إذا لم توفر الصفحة تنسيق الترميز، فمن الصعب حقًا معرفتها.
serStr=gb2312
نهاية إذا
GetCode=serStr
وظيفة النهاية
عنوان URL خافت:url=request.querystring(url)
استجابة.كتابة GetResStr(URL)
%>
تم تنظيم الكود وبعد التجربة تم استخراج محتوى http://www.google.cn بنجاح !!!!!
في الواقع، يمكن الحصول على ملف getpage.asp بسيط، لكنه لا يمكنه معالجة DOM ديناميكيًا مثل js.
هناك مشكلة أخرى. إذا استخدمت الطريقة الأولى للوصول إلى http://www.baidu.com، فستظهر أحرف مشوهة لأن تشفير بايدو هو GB2312.
يقوم XMLHTTP بإرجاع تنسيق ترميز UTF-8. باستخدام الطريقة الثانية، لن تحدث مثل هذه المشكلة طالما أن الموقع الذي يحدد تنسيق الترميز يمكنه إرجاع المعلومات بشكل طبيعي (وهذا لا يشمل بعض المواقع التي تستخدم ترميزًا خاصًا).