2009-02-27 5 views
0

私はIE7とFirefoxではうまく動作するが、IE6ではうまく動作しないAJAXを使用して、特にトリッキーな問題を抱えています。IE6のオブジェクトにプロパティを追加するにはどうすればよいですか?

私は、いくつかのプロパティを追加して、XMLHttpRequestオブジェクト(またはIEの場合はXMLHttpRequest ActiveXObject)を拡張する必要がある、非常に単純な自家製AJAXフレームワークを持っています。次のようにコードの関連セクションは次のとおりです。

//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は(それはオブジェクトは、このプロパティまたはメソッドをサポートしていない」と文句を言いいません")。私は "プロトタイプ"プロパティと "実際の"継承のさまざまなメソッドを使用しようとしましたが、私はIE6で何が起こっているのかを頭に浮かべることはできません

答えて

1

IE7では 'ネイティブJavaScript' XMLHttpRequestオブジェクト。すべてのJavaScriptオブジェクトと同様、問題なく任意のプロパティを追加することができますが、これは必ずしも良い考えではありません。将来のブラウザに実際の 'onReturnFunc'というメンバを追加すると、混乱する可能性があるからです。

IE6または 'native XMLHttpRequest'オプションが無効のIE7では、元のActiveX XMLHttpRequestを使用します。しかし、ActiveXオブジェクトはJavaScriptオブジェクトとはかなり異なる動作をしますが、違いの1つは任意のプロパティを追加できないことです。

一般に、必要な余分なデータを保持し、 '実際の' XMLHttpRequestオブジェクトへの参照を保持する独自のラッパークラスを用意する必要があります。

+0

[OK]を、私はまだ完全にはVAR/JSのメソッドスコープ、特に「この」VARを理解していない - それはです奇妙な小さな獣。私はラッパーオブジェクトを持っていると仮定し、そのオブジェクトのメソッドが要求を作成すると、どのようにonreadystatechange関数を定義し、ラッパー(これ?)をどのように参照するのでしょうか? – Graza

+0

ええ、 'これは少し芝生です。実際の*動作の詳細については、http://stackoverflow.com/questions/585840/x/585918#585918を参照してください。ラッパーのコールバックにバインドされたメソッドを作成し、それにonreadystatechangeを設定するとします。 – bobince

1

問題は、そのブラウザがexpandosをサポートする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; 
} 
関連する問題