Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

custom XMLHttpRequest.prototype.open

var open = XMLHttpRequest.prototype.open;

XMLHttpRequest.prototype.open = function(method, uri, async, user, pass) {
    this.addEventListener("readystatechange", function(event) {  
    if(this.readyState == 4){
       var self = this;
       var response = {
         method: method,
         uri: uri,
         responseText: self.responseText
      };
      console.log(response);  
    } else {
        console.log(this.readyState);
    }
    }, false);
  open.call(this, method, uri, async, user, pass);
};

I am trying to listen for XHR before they are being sent. Something similar to jQuery's beforeSend in the $.ajax method.

My goal is to listen for all XHR's before they are being sent. I suppose the closest thing would be to check above if this.readyState === 1?

Would the code above cause any ajax libraries like jQuery to malfunction because I use prototype on XMLHttpRequest?

like image 426
Johan Avatar asked Apr 02 '13 15:04

Johan


People also ask

What does XHR open do?

open() The XMLHttpRequest method open() initializes a newly-created request, or re-initializes an existing one. Note: Calling this method for an already active request (one for which open() has already been called) is the equivalent of calling abort() .

How do I access XMLHttpRequest response?

You can get it by XMLHttpRequest. responseText in XMLHttpRequest. onreadystatechange when XMLHttpRequest. readyState equals to XMLHttpRequest.

How do I find the URL of XMLHttpRequest?

The read-only XMLHttpRequest. responseURL property returns the serialized URL of the response or the empty string if the URL is null . If the URL is returned, any URL fragment present in the URL will be stripped away. The value of responseURL will be the final URL obtained after any redirects.


1 Answers

I am trying to listen for XHR before they are being sent.

Then try to spoof the send() method, not the open() one.

Would the code above cause any ajax libraries like jQuery to malfunction because I use prototype on XMLHttpRequest?

No, not really. Only,

  • it won't work where those libs choose not to use XMLHttpRequest (particularly IE)
  • …and even fail if the browser does not support the XMLHttpRequest object (or does not support accessing or modifying its prototype)
  • libs might be able to work around your spoof by dereferencing the functions before you can (though I don't know any common lib that does)
  • Your code calls the native method with a fixed number of arguments, not sure if that affects anything, and it does not re-return the result (even if we know it's undefined). To be 100% sure, use return open.apply(this, arguments);.
like image 112
Bergi Avatar answered Sep 30 '22 05:09

Bergi