2009-04-16 37 views
5

Tôi cần phải bọc một yêu cầu IE ajax để thông báo cho tôi khi nó xảy ra. tức là tôi cần phải biết khi nào mở được gọi là:Cách sửa đổi hàm tạo ActiveXObject JS?

var xhr = new ActiveXObject ("Microsoft.XMLHTTP");

Cách duy nhất để thực hiện điều đó (tôi nghĩ) là triển khai hàm tạo ActiveXObject cho các cuộc gọi mở proxy tới hàm tạo/đối tượng thực. Bạn có thể giúp tôi làm điều đó không?

cũng: tôi không cần phải tạo đối tượng xhr thực tế, vì vậy xin vui lòng không cho tôi biết để sử dụng khung X vì nó dễ dàng.

tất cả những gì tôi cần biết là khi mở được gọi (không phải mã của tôi) trên đối tượng MS xhr.

Cảm ơn bạn rất nhiều!

Trả lời

-1

Tôi khuyên bạn nên sử dụng jQuery cho AJAX. Đó là khuôn khổ rất nhỏ nhưng rất linh hoạt và nhanh chóng. Hãy xem docs here.

+0

tôi đang làm việc trên mã mà sẽ cắm vào mã của những người khác (một cái gì đó giống như một bookmarklet). tôi không biết những gì họ đã sử dụng khuôn khổ, nhưng tôi cần phải nắm bắt các sự kiện ajax. – mkoryak

2

Có lẽ bạn có thể thử một cái gì đó như thế này:

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; 

Tất nhiên, thay vì cảnh báo bạn có thể có mã theo dõi của riêng bạn. Tôi đã thử nó ra và nó hoạt động trên yêu cầu 'plain javascript' và cũng yêu cầu được thực hiện với jquery. Tôi nghĩ rằng nó sẽ làm việc bất kể khung được sử dụng để thực hiện yêu cầu.

EDIT ngày 21 tháng 4 Tôi thực sự không biết ActiveXObject có thể được mở rộng ra sao. Đoán của tôi là một cái gì đó như thế này sẽ làm việc:

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; 

Thật không may (hoặc có thể không) Tôi không có IE, vì vậy tôi không thể kiểm tra nó. Nhưng cung cấp cho nó một spin và cho tôi biết nếu nó đã làm các trick.

+0

bệnh thử điều đó. bị bệnh có thể cần phải thực hiện một cho việc thực hiện XHR firebox, và một cho IE.Cảm ơn – mkoryak

+0

apr 21: Tôi đã thử rằng, nó không hoạt động vì "nguyên mẫu là null hoặc không phải là một đối tượng" tuyên bố IE. Tôi nghĩ rằng nó không phải là một đối tượng javascript thực sự, nhưng một số điều đột biến activeX. Tôi nghĩ rằng cách để đi là để sửa đổi các constructor ActiveXObject để làm cho một đối tượng proxied – mkoryak

+1

Tôi nghĩ rằng bạn là ngay trên activeXObject không trở về một đối tượng javascript thực sự. Tôi sợ tôi không thể giúp bạn với cách mở rộng nó. Chúc may mắn và tiếp tục cập nhật trạng thái, nếu có thể. – andi

1

Không có gì "để có được ở đối tượng thực sự" nó là đối tượng thực sự!

Âm thanh như bạn đang tìm kiếm một cái gì đó giống như anh chàng này đang làm ....

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

Tôi không cố gắng tìm ra cách sử dụng ajax, tôi đang cố gắng tìm hiểu cách chặn tất cả các cuộc gọi đến đối tượng HXR bất kể khung (hoặc không có khung) nào được gọi thông qua – mkoryak

+0

Vâng, các loại cơ sở ghi đè tốt một công thức cho thảm họa nhưng nếu bạn vẫn muốn làm điều đó, bạn sẽ phải bằng cách nào đó ghi đè lên toàn bộ ActiveXObject và XHR trong hai trình bao bọc lớp và chặn các cuộc gọi theo cách đó. Rất nhiều công việc;) ActiveXObject.prototype.constructor = function (progId) {} ​​ Chúc may mắn –

0

này đã luôn luôn làm việc cho tôi.

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; 
} 
+0

tôi không cố gắng viết trình bao bọc để thực hiện cuộc gọi ajax. xem nhận xét tiếp theo trong câu hỏi của tôi – mkoryak

Các vấn đề liên quan