هل يمكنني استخدام عوامل التصفية المسبقة لـ jQuery لاكتشاف أحداث onreadystatechange حيث يكون ReadyState==3؟
-
14-11-2019 - |
سؤال
أحاول تنفيذ تقنية 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 لتنفيذ الدعم لتشغيل الأحداث اعتمادًا على حالات الاستعداد المختلفة.سوف يستخدمون المؤجلات بطريقة ما.
هذه هي التذكرة التي تحافظ على هذا التغيير القادم:
نصائح أخرى
فيما يلي عملية التصفية المسبقة التي تم ربطها بشكل صحيح من خطأ jQuery bugzilla #8327,