2009-02-27 6 views
0

J'ai un problème particulièrement délicat avec AJAX, qui fonctionne bien dans IE7 et Firefox, mais pas dans IE6.Comment puis-je ajouter des propriétés à un objet dans IE6?

Je dispose d'un framework AJAX très simple, qui nécessite d'étendre l'objet XMLHttpRequest (ou dans le cas d'IE, le XMLHttpRequest ActiveXObject) en ajoutant quelques propriétés. section pertinente du code est le suivant:

//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"; 

Le problème semble être que FF et IE7 permettent l'extension d'un objet de cette façon, mais IE6 ne le fait pas (il se plaint que « L'objet ne prend pas en charge cette propriété ou méthode "). J'ai essayé d'utiliser la propriété "prototype" et diverses méthodes de l'héritage "réel", mais je n'arrive pas à comprendre ce qui se passe avec IE6

Répondre

1

Sur IE7, vous obtenez un XMLHttpRequest "natif JavaScript" objet. Comme avec tous les objets JavaScript, vous pouvez leur ajouter des propriétés arbitraires sans problème - bien que ce ne soit pas toujours une bonne idée, car si un futur navigateur ajoutait un vrai membre 'onReturnFunc', vous le confondriez.

Sur IE6 ou IE7 lorsque l'option 'native XMLHttpRequest' est désactivée, vous retombez à l'aide de l'XMLXttpRequest ActiveX d'origine. Toutefois, les objets ActiveX ont un comportement assez différent des objets JavaScript et l'une des différences est que vous ne pouvez pas ajouter de propriétés arbitraires.

Généralement, vous devriez avoir votre propre classe wrapper qui contient toutes les données dont vous avez besoin, et qui contient une référence à l'objet 'réel' XMLHttpRequest.

+0

Ok, mais je ne comprends toujours pas pleinement à JS, var/scope méthode particulièrement le « ce » var - il est une petite bête étrange. Supposons que j'ai un objet wrapper, et une méthode de cet objet crée la requête, comment je définirais la fonction onreadystatechange, et comment ferait-il référence à l'emballage (ceci?) – Graza

+0

Oui, 'ceci' est un petit mot. Voir http://stackoverflow.com/questions/585840/x/585918#585918 pour plus d'informations sur le fonctionnement de * effectivement *. Vous voudriez créer une méthode liée sur le callback de votre wrapper, puis définissez le paramètre onreadystatechange sur celui-ci. – bobince

1

Le problème est que c'est le navigateur fourni XMLHttpRequest qui supporte expandos. Cependant IE6 n'a pas de XMLHttpRequest donc votre code tombe à l'aide de l'objet ActiveXObject. L'objet MSXML fourni ne prend pas en charge les expandos.

Une meilleure approche serait d'utiliser une fermeture de toute façon, quelque chose comme: -

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; 
} 
Questions connexes