سؤال

لدي القطعة التالية من الكود:

// setup the AJAX request
var pageRequest = false;
if(window.XMLHttpRequest)     pageRequest = new XMLHttpRequest();
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP");

// callback
pageRequest.onreadystatechange = function() {

    alert('pageRequest.readyState: ' + pageRequest.readyState
        + '\npageRequest.status: ' + pageRequest.status);
}

pageRequest.open('POST','ajax.php',true);

// q_str contains something like 'data=value...'

pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
pageRequest.setRequestHeader("Content-length", q_str.length);
pageRequest.setRequestHeader("Connection", "close");

pageRequest.send(q_str);

هذا يعمل بشكل جيد في Chrome ، ولكن IE يختنق عليه ، وبصق "خطأ غير محدد". ويشير إلى الخط مع التنبيه () فيه.لماذا لا يمكن عرض التنبيه؟

يحرر:حسنًا، بعد أن أتجاهل مربع حوار الخطأ، أحصل على التنبيهات الثلاثة كما هو متوقع....

يحرر:الآن أصبح الأمر غريبًا حقًا.إذا قمت بالتغيير

alert('pageRequest.readyState: ' + pageRequest.readyState
        + '\npageRequest.status: ' + pageRequest.status);

ل

alert('pageRequest.readyState: ' + pageRequest.readyState);

ثم يعمل وأحصل على 5 تنبيهات.(1،1،2،3،4)

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

المحلول

والحالة هي استجابة HTTP يسمى مرتين الأولى في الطريقة التي نعود 1 و 1 كما في ReadyState. ReadyState عن 1 يعني "تم إنشاء الكائن، ولكن الإرسال لم يتم استدعاء الأسلوب ". . في ذلك الوقت لم يكن هناك استجابة الحالة من الخادم كما أنها لم تتلق أي طلبات بالتالي باستخدام الوضع في التنبيه أعطاك خطأ.

نصائح أخرى

يثير Chrome 4 خطأ أيضًا (INVALID_STATE_ERR:استثناء DOM 11).سترى الخطأ إذا قمت بفتح وحدة تحكم Chrome Javascript.

يُظهر Firefox 3.6 أيضًا خطأ، ولكن يبدو أنه يتجاهله بصمت (لا يكون مرئيًا في وحدة تحكم الأخطاء).إذا قمت بلف الوظيفة في ملف try..catch كتلة سوف ترى رسالة الخطأ (رمز الفشل الذي تم إرجاعه للمكون:0x80040111 (NS_ERROR_NOT_AVAILABLE)):

pageRequest.onreadystatechange = function() {
  try {
    alert('pageRequest.readyState: ' + pageRequest.readyState
          + '\npageRequest.status: ' + pageRequest.status);
  }
  catch (e) { 
    alert(e); 
  }
}

أول مرتين onreadystatechange يتم استدعاؤه في Internet Explorer، readyState هو 1 (مفتوح).في هذه الحالة، يتم إرسال الطلب، ولكن لم يتم تلقي الرد بعد.يظهر الخطأ عند الاتصال بـ status الملكية في هذا readyState لأنه لا توجد استجابة HTTP لقراءة الحالة منها.

هذا السلوك متوافق مع الإصدارات القديمة من مواصفات W3C XMLHttpRequest, ، التي تنص:

إذا status السمة غير متوفرة يجب أن تثير استثناء.يجب أن تكون متاحة عندما readyState هو 3 (استلام) أو 4 (محمل).عند توفرها ، يجب أن يمثل رمز حالة HTTP (عادة 200 لاتصال ناجح).

استثناءات عند الاسترجاع

DOMEException INVALID_STATE_ERR يجب رفعها إذا تم الوصول إلى هذه السمة عندما يكون لدى ReadyState قيمة غير لائقة.

الإصدارات الأحدث من المواصفات، ومع ذلك، تنص على ذلك status يجب دائمًا إرجاع قيمة:

ال status يجب أن تُرجع السمة نتيجة تشغيل هذه الخطوات:

  1. إذا كانت الحالة غير مرسلة أو مفتوحة، قم بإرجاع 0 وإنهاء هذه الخطوات.
  2. إذا كانت علامة الخطأ صحيحة، فقم بإرجاع 0 وإنهاء هذه الخطوات.
  3. قم بإرجاع رمز حالة HTTP.

وأعتقد أن لديك مشكلة سلسلة سلسلة، عند تقييم PageRequest.status (وهو صحيح). فقط حاول هذا:

status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top