Как изменить конструктор ActiveXObject JS? - PullRequest
5 голосов
/ 16 апреля 2009

Мне нужно обернуть запрос IE ajax, чтобы уведомить меня, когда это произойдет. т.е. мне нужно знать когда вызывается open на этом:

var xhr = новый ActiveXObject ("Microsoft.XMLHTTP");

Единственный способ сделать это (я думаю) - реализовать конструктор ActiveXObject, чтобы прокси-вызовы открывать для реального конструктора / объекта. Можете ли вы помочь мне сделать это?

также: мне не нужно создавать реальный объект xhr, поэтому, пожалуйста, не говорите мне использовать X framework, потому что это легко.

все, что мне нужно знать, это когда open вызывается (не моим кодом) для объекта MS xhr.

Большое спасибо!

Ответы [ 5 ]

3 голосов
/ 28 апреля 2009

Поскольку ОП опубликовал аналогичный вопрос, и я разместил ответ, который также соответствует этому вопросу, он попросил меня дать ссылку на мой ответ, а не повторять его здесь.

2 голосов
/ 16 апреля 2009

Возможно, вы можете попробовать что-то вроде этого:

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. Я думаю, что это должно работать независимо от структуры, которая использовалась, чтобы сделать запрос.

РЕДАКТИРОВАТЬ 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, поэтому я не могу его проверить. Но попробуй и дай мне знать, все ли получилось.

1 голос
/ 22 апреля 2009

Нечего "достать до реального объекта" - это реальный объект!

Звучит так, будто вы ищете что-то, что делает этот парень ....

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 голосов
/ 22 апреля 2009

Это всегда работало для меня.

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 голосов
/ 16 апреля 2009

Я рекомендую вам использовать jQuery для AJAX. Это очень маленький, но очень гибкий и быстрый каркас. Проверьте документы здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...