Как я могу добавить свойства к объекту в IE6? - PullRequest
0 голосов
/ 27 февраля 2009

У меня особенно сложная проблема с использованием AJAX, которая отлично работает в IE7 и Firefox, но не в IE6.

У меня есть очень простая домашняя среда AJAX, которая требует, чтобы я расширил объект XMLHttpRequest (или, в случае IE, ActiveXObject XMLHttpRequest), добавив несколько свойств. Соответствующий раздел кода выглядит следующим образом:

//the following is the constructor for our ajax request object - which extends the standard object. It is used in the method below it   
function FD_XMLHttpRequest() {     
  var xmlHttpReq = false;
  if (window.XMLHttpRequest) { // Mozilla/Safari
    xmlHttpReq = new XMLHttpRequest();
  } else if (window.ActiveXObject) { // IE
    xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
  }
  //we now have the request object - extend it with things we might need to store with it
  xmlHttpReq.onReturnFunc = null; //******ERROR IN IE6******
  xmlHttpReq.targetDivId = null;  //******ERROR IN IE6******
  return xmlHttpReq;  
} 
//To use:
myXHReq = new FD_XMLHttpRequest();
myXHReq.onReturnFunc = someFunction; 
myXHReq.targetDivId = "myDiv";  

Проблема, похоже, заключается в том, что FF и IE7 позволяют расширять объект таким способом, а IE6 этого не делает (жалуется, что «Объект не поддерживает это свойство или метод»). Я пытался использовать свойство «prototype» и различные методы «реального» наследования, но я не могу полностью понять, что происходит с IE6

Ответы [ 2 ]

1 голос
/ 27 февраля 2009

Проблема в том, что в его браузере предусмотрен XMLHttpRequest, который поддерживает эксплоиды. Однако IE6 не имеет XMLHttpRequest, поэтому ваш код переходит на использование ActiveXObject. MSXML-объект не поддерживает развертывание.

Лучше было бы использовать закрытие в любом случае, что-то вроде: -

function getContentForElem(url, elem, completed)
{
    var xhr = getXhr()
    xhr.open("GET", url, true)
    xhr.onreadystatechange = fnstatechange
    xhr.send()
    return xhr;

    function fnstatechange()
    {
       if (xhr.readyState == 4)
       {
           if (xhr.status == 200)
           {
                elem.innerHTML = xhr.responseText;
           }
           if (completed) completed(xhr)
       }
    }
}

function getXhr()
{
    var xhr;
    if (window.XMLHttpRequest)
        xhr = new XMLHttpRequest();
    else
        xhr = new ActiveXObject("MSXML2.XMLHTTP.3.0");
    return xhr;
}
1 голос
/ 27 февраля 2009

В IE7 вы получаете объект XMLHttpRequest «родного JavaScript». Как и со всеми объектами JavaScript, вы можете добавлять к ним произвольные свойства без проблем - хотя это не всегда хорошая идея, потому что, если будущий браузер добавит собственный реальный член «onReturnFunc», вы его спутаете.

В IE6 или IE7, когда опция «native XMLHttpRequest» отключена, вы возвращаетесь к использованию исходного ActiveX XMLHttpRequest. Однако объекты ActiveX ведут себя совершенно иначе, чем объекты JavaScript, и одно из отличий заключается в том, что вы не можете добавлять произвольные свойства.

Как правило, у вас должен быть свой собственный класс-обертка, содержащий все необходимые дополнительные данные и ссылку на «настоящий» объект XMLHttpRequest.

...