2009-04-16 12 views
5

我需要包裝一個IE瀏覽器ajax請求通知我,當它發生。即我需要知道什麼時候打開被調用:如何修改ActiveXObject的JS構造函數?

var xhr = new ActiveXObject(「Microsoft.XMLHTTP」);

要做到這一點(我認爲)的唯一方法是實現ActiveXObject構造函數來代表對實際構造函數/對象的開放調用。你能幫我做到嗎?

另請參見: 我不需要創建實際的xhr對象,所以請不要告訴我使用X框架,因爲它很容易。

所有我需要知道的是當開放在MS xhr對象上被調用(而不是我的代碼)。

非常感謝!

回答

-1

我建議你爲AJAX使用jQuery。它非常小,但非常靈活和快速的框架。退房docs here

+0

我工作的代碼,將插入其他民族代碼(有點像書籤)。我不知道他們使用了什麼框架,但我需要捕捉Ajax事件。 – mkoryak 2009-04-16 16:14:05

2

或許你可以嘗試這樣的事:

XMLHttpRequest.prototype.real_open = XMLHttpRequest.prototype.open; 

var your_open_method = function(sMethod, sUrl, bAsync, sUser, sPassword) { 
    alert('an XHR request has been made!'); 
    this.real_open(sMethod, sUrl, bAsync, sUser, sPassword); 
} 

XMLHttpRequest.prototype.open = your_open_method; 

當然,取而代之的警報,你可以有自己的跟蹤代碼。我試過了,它可以處理'普通的javascript'請求以及使用jquery進行的請求。我認爲它應該工作,不管用於提出請求的框架。

編輯4月21日 我真的不知道如何擴展ActiveXObject。我的猜測是,這樣的事情應該工作:

XHR = new ActiveXObject("Microsoft.XMLHTTP"); 
var XHR.prototype.old_open = XHR.prototype.open; 
var new_open = function(sMethod, sUrl, bAsync, sUser, sPassword) { 
    alert('an IE XHR request has been made!'); 
    this.old_open(sMethod, sUrl, bAsync, sUser, sPassword); 
} 

XHR.prototype.open = new_open; 

不幸的是(或者也許不是),我沒有IE瀏覽器,所以我不能測試它。但是,讓它旋轉一下,讓我知道它是否有竅門。

+0

虐待那個。生病可能需要爲firebox XHR的實現製作一個,另一個用於IE。謝謝 – mkoryak 2009-04-16 17:53:35

+0

apr 21:我已經試過了,它不工作,因爲「原型爲空或不是對象」聲稱IE。我認爲它不是一個真正的javascript對象,而是一些activeX突變體的東西。我認爲要走的路是修改ActiveXObject構造函數來創建代理對象 – mkoryak 2009-04-22 14:57:54

+1

我認爲你是正確的activeXObject不返回一個真正的JavaScript對象。恐怕我無法幫助你如何擴展它。祝你好運,並保持更新狀態,如果可以的話。 – andi 2009-04-23 06:53:47

1

沒有什麼「能夠得到真實的物體」這是真正的物體!

聽起來像是你正在尋找的東西像這傢伙是幹什麼....

http://www.adobepress.com/articles/article.asp?p=439600

document.write("<script type=\"text/javascript\" src=\"js/HTTP.js\"></script>"); 

function Ajax() 
{ 
    this.toString = function() { return "Ajax"; } 
    this.http = new HTTP(); 

    this.makeRequest = function(_method, _url, _callbackMethod) 
    { 
    this.request = (window.XMLHttpRequest)? new XMLHttpRequest(): new ActiveXObject("MSXML2.XMLHTTP"); 
    this.request.onreadystatechange = _callbackMethod; 
    this.request.open(_method, _url, true); 
    this.request.send(_url); 
    } 

    this.checkReadyState = function(_id, _1, _2, _3) 
    { 
    switch(this.request.readyState) 
    { 
     case 1: 
     document.getElementById(_id).innerHTML = _1; 
     break; 
     case 2: 
     document.getElementById(_id).innerHTML = _2; 
     break; 
     case 3: 
     document.getElementById(_id).innerHTML = _3; 
     break; 
     case 4: 
     return this.http.status(this.request.status); 
    } 
    } 
} 
0

這一直爲我工作。

var xmlHttp; 

function yourajaxfunction(str) 
{ 
    xmlHttp=GetXmlHttpObject(); 
    if (xmlHttp==null){ 
     alert ("Browser does not support HTTP Request"); 
     return; 
    } 

    var url="yourserversidecodefile.php"; 
    url=url+"?q="+str; 

    xmlHttp.onreadystatechange=stateChanged; 
    xmlHttp.open("GET", url, true); 
    xmlHttp.send(null); 
} 

function stateChanged() { 
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete"){ 
     document.getElementById("txtHint").innerHTML=xmlHttp.responseText; 
    } 
} 

function GetXmlHttpObject(){ 
    var xmlHttp=null; 

    try { 
     // Firefox, Opera 8.0+, Safari 
     xmlHttp=new XMLHttpRequest(); 
    } 
    catch (E1) { 
     //Internet Explorer 
     try { 
     xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); 
     } 
     catch (E2) { 
     xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
    } 

    return xmlHttp; 
} 
相關問題