تحليل سمات Responsexml والتلاعب بها
إذا كنت تستخدم xmlhttprequest للحصول على محتويات مستند XML عن بُعد ، فستكون خاصية ResponsexML كائن DOM مستصيبًا من وثيقة XML ، والتي يصعب معالجتها وتحليلها. فيما يلي خمس طرق رئيسية لتحليل وثائق XML:
1. استخدم XPath لتحديد جزء الصيغة من المستند.
2. استخدم Jxon لتحويله إلى شجرة كائن JavaScript.
3. تحليل يدويًا وسلسلة XML في سلاسل أو كائنات.
4. استخدم XMLSerializer لتسلسل شجرة DOM في سلسلة أو ملف.
5. إذا كنت تعرف محتوى مستند XML مقدمًا ، فيمكنك استخدام REGEXP. إذا كنت تتأثر بالخطوط الجديدة عند المسح الضوئي باستخدام REGEXP ، فقد ترغب في حذف جميع الخطوط الجديدة. ومع ذلك ، فإن هذا النهج "الأخير" لأنه إذا تغير رمز XML قليلاً ، فقد يفشل النهج.
يمتلك ويتعامل مع خاصية المسؤولية التي تحتوي على مستندات HTML
ملاحظة: يُسمح بتحليل HTML من خلال سمة XMLHTTPREQUEST.RESPONSEXML في مواصفات W3C XMLHTTPREQUEST. لمزيد من التفاصيل ، يرجى قراءة HTML في xmlhttprequest.
إذا كنت تستخدم xmlhttprequest للحصول على صفحة HTML من الطرف البعيد ، فسيتم تخزين جميع علامات HTML في خاصية Responsetext كسلسلة ، مما يجعل من الصعب معالجة هذه العلامات وتحليلها. هناك ثلاث طرق رئيسية لتحليل علامات HTML هذه:
1. استخدم خاصية XMLHTTPREQUEST.RESPONSEXML.
2. حقن المحتوى في جزء مستند من خلال pragment.body.innerhtml والتكرار من خلال شظايا في DOM.
3. إذا كنت تعرف محتوى مستند HTML مقدمًا ، فيمكنك استخدام REGEXP. إذا كنت تتأثر بالخطوط الجديدة عند المسح الضوئي باستخدام REGEXP ، فقد ترغب في حذف جميع الخطوط الجديدة. ومع ذلك ، فإن هذا النهج هو "الذي يمارسه" لأنه إذا تغير رمز HTML قليلاً ، فقد يفشل النهج.
التعامل مع البيانات الثنائية
على الرغم من أن XMLHTTPrequest يستخدم عمومًا لإرسال وتلقي البيانات النصية ، إلا أنه يمكنه بالفعل إرسال المحتوى الثنائي وقبوله. هناك العديد من الطرق التي تم اختبارها جيدًا لفرض البيانات الثنائية التي يتم إرسالها باستخدام XMLHTTPrequest. طريقة. overridemiMetype () لـ XMLHTTPrequest هي حل ، على الرغم من أنها ليست طريقة قياسية.
var oreq = new xmlhttprequest () ؛ oreq.Open ("get" ، url ، true) ؛ // استرداد البيانات غير المعالجة كأسلوب ثنائي.تمت إضافة خاصية ResponseType إلى مواصفات XMLHTTPrequest المستوى 2 ، مما يجعل من السهل إرسال واستقبال البيانات الثنائية.
var oreq = new xmlhttprequest () ؛ oreq.onload = function (e) {var arrayBuffer = xHr.Response ؛ // not appletext/ * ... */} oreq.open ("get" ، url ، true) ؛ oreq.Responsetype = "ArrayBuffer" ؛ Oreq.send () ؛قبول البيانات الثنائية باستخدام صفيف نوع JavaScript
يمكنك تغيير نوع البيانات للاستجابة التي يتم إرجاعها من الخادم عن طريق تعيين خاصية ResponseType لكائن XMLHTTPrequest. قيم السمة المتاحة هي سلاسل فارغة (افتراضي) ، "ArrayBuffer" ، "Blob" ، "Document" ، و "Text". ستختلف قيم سمة الاستجابة اعتمادًا على قيمة خاصية ResponseType ، والتي قد تكون ArrayBuffer أو blob أو المستند أو السلسلة أو الفارغ (إذا لم يتم إكمال الطلب أو فشل)
يقرأ المثال التالي ملف صورة ثنائي ، ويتم إنشاء مجموعة من الأعداد الصحيحة غير الموقعة 8 بت من البايتات الأصلية الثنائية للملف.
var oreq = new xmlhttprequest () ؛ oreq.open ("get" ، "/myfile.png" ، true) ؛ oreq.Responsetype = "ArrayBuffer" ؛ Oreq.Onload = function (oevent) {var arraybuffer = oreq.response ؛ // ملاحظة: لا oreq.ResponSetext if (arrayBuffer) {var bytearray = new Uint8Array (ArrayBuffer) ؛ لـ (var i = 0 ؛ i <bytearray.byteLength ؛ i ++) {// التشغيل لكل بايت في الصفيف}}} ؛ oreq.send (null) ؛بالإضافة إلى الطريقة أعلاه ، يمكنك أيضًا استخدام API BlobBuilder لإضافة بيانات ArrayBuffer مباشرة إلى كائن BLOB. نظرًا لأن واجهة برمجة التطبيقات لا تزال في المرحلة التجريبية ، يجب إضافة بادئة محددة:
var blobbuilder = window.mozblobbuilder || window.webkitblobbuilder || window.msblobbuilder || window.blobbuilder ؛ var oreq = new xmlHttprequest () ؛ oreq.open ("get" ، "/myfile.png" ، true) ؛ oreq.responsetype = "arraybuffer" ؛ oreq.onload = function (oevent) {var blobbuilder = new Blobbuilder () ؛ blobbuilder.append (oreq.response) ؛ var blob = blobbuilder.getBlob ("Image/PNG") ؛ // ...} ؛ oreq.send () ؛قبول البيانات الثنائية في المتصفحات القديمة
يمكن طريقة LOAD_BINDIND_RESOURCE () التالية تحميل البيانات الثنائية من عنوان URL المحدد وإرجاع البيانات إلى المتصل.
وظيفة load_binary_resource (url) {var req = new xmlhttprequest () ؛ req.open (/'get/' ، url ، false) ؛ // XHR Binary Carset OPT بواسطة Marcus Granado 2006 [http://mgran.blogspot.com] req.overridemiMetype (/'text/plain ؛ charset = x-user-defined/') ؛ req.send (null) ؛ if (req.status! = 200) return /' /' ؛ إرجاع req.sponsetext ؛}تتمثل العملية الرائعة في السطر الخامس ، والتي تعيد كتابة نوع MIME الافتراضي ، مما يجبر المتصفح على التعامل مع الاستجابة كملف نصي عادي ، باستخدام مجموعة أحرف محددة من قبل المستخدم. هذا يخبر المتصفح بعدم تحليل البيانات وإرجاع الباقين غير المجهزة مباشرة.
var fileStream = load_binary_resource (url) ؛ var abyte = filestream.charcodeat (x) & 0xff ؛ // ألقا بايت عالي بت (F7)
يحصل المثال أعلاه على البايتات عند x من البيانات الثنائية التي يتم إرجاعها بواسطة الطلب. نطاق الإزاحة الصالح هو 0 إلى filestream.length-1.
تحقق من ملف التنزيل باستخدام xmlhttprequest للحصول على التفاصيل وعرض ملف التنزيل.
إرسال البيانات الثنائية
تم تحسين طريقة إرسال كائن XMLHTTPrequest ، ويمكن إرسال البيانات الثنائية ببساطة عن طريق تمرير كائن ArrayBuffer أو blob أو ملف.
يقوم المثال التالي بإنشاء ملف نصي ويرسل الملف إلى الخادم باستخدام طريقة POST. يمكنك أيضًا استخدام أنواع البيانات الثنائية الأخرى بخلاف الملف النصي.
var oreq = new xmlhttprequest () ؛ oreq.open ("post" ، url ، true) ؛ oreq.onload = function (oevent) {// بعد الانتهاء من التحميل.} ؛ var bb = new blobbuilder () ؛ // مطلوب بادئة مناسبة: window.mozblobbuilder أو window.webkitblobbuilderbb.append (/'abc123/') ؛ oreq.send (bb.getblob (/'text/plain/')) ؛أرسل مجموعة من الأنواع كبيانات ثنائية
يمكنك إرسال صفائف نوع JavaScript كبيانات ثنائية.
var myarray = new ArrayBuffer (512) ؛ var longint8view = new uint8array (myarray) ؛ for (var i = 0 ؛ i <longint8view.length ؛ i ++) {longint8view [i] = i ٪ 255 ؛} var xhr = new xmlhttprequest ؛ خطأ) ؛ xhr.send (myarray) ؛ينشئ المثال أعلاه صفيف عدد صحيح 512 بايت 8 بت ويرسله. بالطبع ، يمكنك أيضًا إرسال أي بيانات ثنائية.
مراقبة التقدم
مراقبة أحداث التقدم التي تدعم DOM هي لعملية نقل XMLHTTPREQUEST وتتبع مواصفات حدث API API: تنفذ هذه الأحداث واجهة ProgressEvent.
var req = new xmlhttprequest () ؛ // تحميل الاستماع req.addeventListener ("Progress" ، updateProgress ، false) ؛ req.addeventListener ("load" ، transfercomplete ، false) ؛ req.addeventlistener ("error" ، transferfailed ، false) ؛ false) ؛ req.open (...) ؛ ... // التقدم في التحويلات من الخادم إلى العميل (التنزيلات) Function UpdateProgress (evt) {if (evt.lengthcomputable) {var prexComplete = evt.loaded/ evt.total ؛ ...} آخر {// غير قادر على حساب معلومات التقدم لأن الحجم الإجمالي غير معروف}}ملاحظة: تحتاج إلى إضافة الاستماع للحدث قبل طلب الاتصال Open (). وإلا فلن يتم تشغيل حدث التقدم.
في المثال السابق ، يتم تحديد حدث التقدم ليتم معالجته بواسطة وظيفة updateProgress () ويتلقى إجمالي عدد البايتات المرسلة إلى إجمالي التحميل وتم نقله بالفعل ، وهو الطول الكلي (البايتات) للبيانات المرسلة من رأس "طول المحتوى". ومع ذلك ، إذا كانت قيمة خاصية الطول القابلة للتماسك خاطئة ، فإن العدد الإجمالي للبايت غير معروف والقيمة الإجمالية هي 0. إذا كان الطول معروفًا ، فإن الخاصية ذات الطول صحيحة
يوجد حدث التقدم في كل من التنزيل وتحميل الإرسال. يتم تشغيل الحدث المتعلق بالتنزيل على كائن XMLHTTPrequest ، تمامًا مثل المثال أعلاه. يتم تشغيل الأحداث ذات الصلة بالتحميل على كائن XMLHTTPREQUEST.UPLOAD ، مثل هذا:
var req = new xmlhttprequest () ؛ // تنزيل المستمع req.upload.addeventListener ("Progress" ، updateProgress) ؛ req.upload.addeventListener ("load" ، transferComplete) ؛ req.AddEventIndRistener ("error" ، transferfailed) ؛ TransferCanceled) ؛ req.open () ؛ملاحظة: حدث التقدم غير صالح عند استخدام الملف: البروتوكول.
استخدم حدث LoadEnd للكشف عن جميع شروط نهاية التحميل الثلاثة (الإجهاض ، التحميل ، الخطأ):
req.addeventListener ("loadend" ، loadend ، false) ؛
تجدر الإشارة إلى أنه لا توجد وسيلة لمعرفة بالضبط حالة المعلومات التي يتلقاها حدث Loadend الناجم عن إنهاء التشغيل ؛ ومع ذلك ، يمكنك استخدام هذا الحدث للتعامل معه في نهاية جميع عمليات الإرسال.
يؤدي كائن XMLHTTPrequest إلى أنواع مختلفة من الأحداث في مراحل مختلفة من الطلب ، لذلك لا يحتاج إلى التحقق من خاصية ReadyState.
عندما يتم استدعاء SEND () ، يتم تشغيل حدث واحد من LOADSTART. عندما يتم تحميل استجابة الخادم ، سيشهد كائن XMLHTTPrequest حدثًا تقدمًا ، وعادة ما يكون كل 50 ميلي ثانية ، بحيث يمكن استخدام هذه الأحداث لإعطاء المستخدمين ملاحظات حول تقدم الطلب.
إذا اكتمل الطلب بسرعة ، فقد لا يؤدي أبدًا إلى حدوث حدث التقدم. عند اكتمال الحدث ، سيتم تشغيل حدث التحميل.
هناك 3 حالات لا يمكن إكمال طلبات HTTP ، والتي تتوافق مع 3 أحداث. إذا كانت مهلة الطلب ، فسيتم تشغيل حدث المهلة. إذا تم إحباط الطلب ، فسيتم تشغيل حدث الإحباط. تمنع أخطاء الشبكة مثل الكثير من عمليات إعادة التوجيه الطلب من الانتهاء ، ولكن عندما تحدث هذه ، يتم تشغيل حدث خطأ.
بالنسبة لأي طلب محدد ، لن يؤدي المتصفح إلا إلى إحدى أحداث الحمل والإجهاض والتهمة والخطأ ، وكذلك حدث التقدم.
if (/'OnProgress/' in (new xmlhttprequest ())) {// الكشف عما إذا كانت أحداث التقدم مدعومة var request = new xmlhttprequest () ؛ request.onprogress = function (e) {if ( }}}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.