【问题标题】:How to modify ActiveXObject JS constructor?如何修改 ActiveXObject JS 构造函数?
【发布时间】:2009-04-16 15:54:02
【问题描述】:

我需要包装一个 IE ajax 请求,以便在它发生时通知我。即我需要知道何时调用 open:

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

这样做的唯一方法(我认为)是实现 ActiveXObject 构造函数来代理对真实构造函数/对象的打开调用。你能帮我做吗?

还有: 我不需要创建实际的 xhr 对象,所以请不要告诉我使用 X 框架,因为它很简单。

我只需要知道何时在 MS xhr 对象上调用 open(不是由我的代码)。

非常感谢!

【问题讨论】:

    标签: javascript ajax binding proxy


    【解决方案1】:

    由于 OP 发布了一个类似的问题,并且我发布了一个恰好适合 this 问题的答案,他让我链接到我的答案,而不是在这里重复。

    【讨论】:

      【解决方案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,所以我无法测试它。但是试一试,让我知道它是否成功了。

      【讨论】:

      • 我试试看。我可能需要为 firebox XHR 实现制作一个,为 IE 制作一个。谢谢
      • apr 21:我试过了,它不起作用,因为“原型为空或不是对象”声称 IE。我认为它不是一个真正的 javascript 对象,而是一些 activeX 突变的东西。我认为要走的路是修改 ActiveXObject 构造函数以制作代理对象
      • 我认为您在 activeXObject 上没有返回真正的 javascript 对象是正确的。恐怕我无法帮助您扩展它。祝你好运,如果可以的话,请继续更新状态。
      • 哦,也许您可​​以就这个问题提出一个新问题,即在 javascript 中扩展 ActiveXObject。我想你会得到更多的答案。
      【解决方案3】:

      没有什么是“真正的对象”,它是真正的对象!

      听起来你正在寻找这个家伙正在做的事情......

      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);
          }
        }
      }
      

      【讨论】:

      • 我不是想弄清楚如何使用 ajax,我想弄清楚如何拦截对 HXR 对象的所有调用,而不管它是通过哪个框架(或没有框架)调用的跨度>
      • 是的,好的,重写基类型是灾难的根源,但如果你仍然想这样做,你必须以某种方式覆盖两个类包装器中的整个 ActiveXObject 和 XHR 并以这种方式拦截调用.大量工作;) ActiveXObject.prototype.constructor = function(progId) {} 祝你好运
      【解决方案4】:

      这一直对我有用。

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

      【讨论】:

      • 我不是在尝试编写用于进行 ajax 调用的包装器。请参阅我的问题中的后续评论
      【解决方案5】:

      我建议您将 jQuery 用于 AJAX 。它非常小但非常灵活和快速的框架。查看docs here

      【讨论】:

      • 我正在编写可以插入其他人代码的代码(类似于书签)。我不知道他们使用了什么框架,但我需要捕获 ajax 事件。
      猜你喜欢
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多