هل يمكنني استخدام عوامل التصفية المسبقة لـ jQuery لاكتشاف أحداث onreadystatechange حيث يكون ReadyState==3؟

StackOverflow https://stackoverflow.com/questions/6035987

سؤال

أحاول تنفيذ تقنية XHR المتدفقة Comet في jQuery، ولكن أواجه بعض المشاكل في اكتشاف ملف onreadystatechange حدث.أنا أستخدم فايرفوكس 4.0.1.

أنا استخدم المرشحات المسبقة (متاح منذ jQuery 1.5) لتعديل كائن XHR الأصلي، وتحديدًا لإضافة معالج حدث إلى onreadystatechange حدث.لقد حصلت على تنفيذ الخام لذلك في http://jsfiddle.net/Rdx6f/.يُلحق هذا الرمز بالمستند كائن XHR readyState و responseText الصفات عندما onreadystatechange تم إطلاق الحدث.ولكن من الغريب أنه يبدو فقط أنه يكتشف onreadystatechange الحدث متى readyState هو 1.

بمعنى آخر، يبدو أن jQuery يكتشف ملف onreadystatechange حدث عندما يكون كائن XMLHttpRequest في حالة "مفتوح" (readyState 1)، ولكن ليس عندما يكون كائن XHR في حالة "الرؤوس المستلمة" (readyState 2)، أو "loading" (readyState 3)، أو "done" (readyState 4) .

والغريب أنني إذا alert() في معالج الحدث، ثم أنا يفعل انظر onreadystatechange التعامل عندما تكون حالة الاستعداد هي 1 و2 و3 و4.يرى http://jsfiddle.net/Rdx6f/1/.نفس الرمز كما http://jsfiddle.net/Rdx6f/, ، فقط alert()بدلاً من إلحاق المستند.

يمكنني أيضًا الكشف onreadystatechange الأحداث عندما readyState هو 1 أو 2 أو 3 أو 4 في JavaScript الأصلي - راجع http://jsfiddle.net/d7vaH/.(تم أخذ هذا الرمز بشكل حرفي تقريبًا من تنفيذ ديلان شيمان لتدفق XHR في الصفحة 115 من كتاب "مواقع الويب الأسرع".)

هل أفعل شيئًا خاطئًا هنا، مثل استخدام مرشحات Ajax المسبقة لـ jQuery بشكل خاطئ أو ارتكاب خطأ في JavaScript؟هل ربما يكون هذا خطأ في jQuery؟

هل كانت مفيدة؟

المحلول

لعِلمِكَ:لقد بحثت في هذا الأمر بعمق واتضح أن jQuery (منذ 1.5) يستخدم حدث onreadystatechange داخليًا.والنتيجة هي أن jQuery سوف دائماً اكتب وظيفتها الداخلية في حدث onreadystatechange، مع الكتابة فوق كل ما قمت بتعيينه عليه.يحدث هذا عندما يتم إرسال استدعاء AJAX فعليًا، مما يعني أن الوظيفة التي كتبتها لـ onreadystatechange ستعمل حتى ذلك الوقت (مما يعني أنها ستعمل حتى ReadyState = 1، ولكن ليس لفترة أطول).

وهذا هو الحل المقترح في الوقت الحالي: http://jsfiddle.net/tBTW2/

في الوقت الحالي، لا أستطيع رؤية حل بديل (أفضل) دون عدم استخدام jQuery (أو العودة إلى الإصدار 1.4.4 أو إصدار أقل، حيث يعمل بشكل مثالي) أو تحرير كود jQuery (لأنه كما هو الحال الآن، فسيظلون دائمًا الكتابة فوق كل ما تحاول ربطه).

ومع ذلك، في الإصدارات القادمة (على الأرجح في 1.8)، يخطط فريق jQuery لتنفيذ الدعم لتشغيل الأحداث اعتمادًا على حالات الاستعداد المختلفة.سوف يستخدمون المؤجلات بطريقة ما.

هذه هي التذكرة التي تحافظ على هذا التغيير القادم:

http://bugs.jquery.com/ticket/9883

نصائح أخرى

فيما يلي عملية التصفية المسبقة التي تم ربطها بشكل صحيح من خطأ jQuery bugzilla #8327,

http://jsfiddle.net/d8ckU/1/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top