All of this sounds pretty good - do you have a link to the code? (Preferably in a fork up on Github - makes it easy to do a code review.)
--John On Wed, Nov 18, 2009 at 10:10 PM, Julian Aubourg <aubourg.jul...@gmail.com>wrote: > OK, just a post to keep you all updated since I didn't get as much time as > I expected though I have progress, mind you. > > Also, I recommend a good understanding of the internals of $.ajax to follow > everything. > > First, let me start with some design decisions I came up with: > > 1) the fake XHR returned by $.ajax only emulates header related methods & > abort > > The rational behind the decision is as follows: > - the onreadystatechange callback was already used by jQuery internally on > the old implementation, meaning that using it was pointless if not plain > wrong. > - same goes for open & send, it doesn't make sense for external code to use > them > > On a sidenote, readyState could be emulated but I fail to see the point. I > *could* emulate onreadystatechange but is there really a use case for this? > > Of course, the complete(), success() & error() methods are implemented. If > you do something like jQuery.ajax(options).complete(completeCallback); in > async=false mode, the completeCallback method WILL be called with correct > arguments even though the request already completed. > > Each callback family handled "return false;" in callbacks, meaning no > further callbacks of that family will be called later on. > > For backward compatibility, the complete, success & error callbacks > provided in the options object are also called (they are actually added to > the list of callbacks before issuing the request). > > 2) I added the notion of "transport" which is the actual implementation > that will send the request > > ajaxSettings has two new properties: > - transportSelector, a function that will take an options object and > determine what transport type is more suited for the request, > - transportDefinitions which is a hashmap of transport definitions > (obviously). > > Transport definitions contains two functions: > - filter which takes the options object & returns a new transport type if > it deems it more suited than itself > - factory which takes no argument & returns a new transport of the desired > type > > The idea in having the filter function is: > - to set s.global as false if the transport cannot ensure completion > (cross-domain script / jsonp), > - to keep differentiating code as close to the implementation as possible. > A good example are scripts which wont be handled the same if they are cross > domain or not (first will use xhr, second will use a script tag). If > s.transportDefinitions[transportType] is not an object but a function, it is > considered a filter. Following previous example, transportSelector would > just return "script" no matter what, and the script transport definition > would look like this: > s.transportDefinitions["script"] = function (s) { return isCrossDomain(s) ? > "script-tag" : "xhr" } > > Filters get called until a final transportType is found, then the > corresponding transport factory gets called. > > By changing transportSelector & transportDefinitions, a user can completely > > > I also added some options into the ajax options object beside > transportSelector & transportDefinition: > - transport: which can be used to bypass transportSelector (filters called > until final type is found are not bypassed) > - transportDataType: it's the data type used to determine which transport > to use (in transportSelector), if not provided it's equivalent to dataType. > The idea came when I was refactoring and realized that it was no reason why > you couldn't ask for xml through jsonp. So you would have something like > $.ajax({ dataType: "xml", transportDataType: "jsonp", ...}) and the request > will be made through jsonp and the resulting json object will be parsed as > xml (I already implemented the logic). As a consequence dataFilter gets 3 > arguments: > - the data, > - s.dataType, > - a function that permits to get/set the transportDataType (so that you can > make "casts" in your dataFilter). > - crossDomain: a boolean computed into the main $.ajax method to make life > of filters easier. > > So far, I have: > - the logic in $.ajax (with xhr emulation & callbacks system), > - the factory system, > - a helper function to help create transports (in the end only 3 functions > + the filter will have to be provided to create a new transport), > - the interface for a transport (which is much easier to deal with than an > xhr). > > I have yet to implement actual transports and start testing. > > Also, generalizing the implementaton, global events, timeout, ifModified, > etc, are handled for all transports (now, given lack of headers, ifModified > may not have an effect with most transports but still). > > The code hasn't exploded in size but I cannot estimate yet how bigger it > will get. > > Now onto stuff I'd like to see in jQuery and am very tempted to add in the > process is ful-fledged support for CORS with the definition of > jQuery.support.crossDomainRequest (values false, "standard" or > "XDomainRequest" -- detection code can be found here: > http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/ --). > Using filters and the new s.crossDomain computed option, it should be very > easy to handle all situations (by throwing an exception or whatnot so that > client code could fallback on a proxy or something). > > Feedbacks welcome is you see anything gross in there. > > -- Julian > > 2009/11/15 Julian Aubourg <aubourg.jul...@gmail.com> > > I looked into your code and we basically have the same approach. I'll try & >> get the refactoring done by the middle of next week (like I said, I have >> social life getting in the way right now ;) ). >> >> 2009/11/15 Shade <get...@gmail.com> >> >> I've built two different JavaScript projects which implement a nearly >>> identical interface to the native XHR object, including updating >>> properties, etc, while hiding under the covers how the actual XHR >>> happens. One is flXHR (http://flxhr.flensed.com) which actually has a >>> jQuery plugin that adapts flXHR to be automatically selected and used >>> by jQuery when making $.ajax calls. It relies on the XHR registry >>> plugin of jQuery. Because flXHR exposes the identical interface to >>> native XHR, this makes it able to be used throughout $.ajax without >>> any changes to jquery itself. >>> >>> The other project isn't specifically jQuery related, but it's called >>> jXHR (http://mulletxhr.com). >>> >>> The reason I mention these two projects is that they seem to be doing >>> exactly what is being suggested with this mockXHR object. I use a >>> couple of tricks to make that happen, including emulating updating >>> properties. I'd be willing to collaborate on this solution and share >>> the tricks I used in my two projects. >>> >>> Let me know if this would of assistance. I definitely support trying >>> to revamp the way the $.ajax system works to give it more >>> extensibility. >>> >>> --Kyle >>> >>> >>> >>> >>> On Nov 13, 4:38 pm, Jason Persampieri <papp...@gmail.com> wrote: >>> > On Nov 13, 6:39 am, Scott Sauyet <scott.sau...@gmail.com> wrote: >>> > >>> > >>> > >>> > >>> > >>> > > On Thu, Nov 12, 2009 at 1:15 PM, John Resig <jere...@gmail.com> >>> wrote: >>> > > >> I think the one area that would be troublesome is in the >>> properties >>> > > >> that xhr provides (like readyState, responseXML, etc.). I'm not >>> sure >>> > > >> how you'd build this mock XHR and keep those properties up to >>> date. >>> > >>> > > On Thu, Nov 12, 2009 at 10:14 PM, Julian Aubourg >>> > >>> > > <aubourg.jul...@gmail.com> wrote: >>> > > > As an example of what I'm talking about with an real xhr as a base: >>> > > > - layer 0 is window.ActiveXObject ? new >>> ActiveXObject("Microsoft.XMLHTTP") : >>> > > > new XMLHttpRequest() >>> > > > - layer 1 is a standard compliant xhr implementation that delegates >>> to layer >>> > > > 0 while hiding browser incompatibilities. It listens to layer 0 >>> through its >>> > > > onreadystatechange event handler and propagates the event by >>> calling its own >>> > > > onreadystatechange if available >>> > >>> > > I had briefly mentioned a similar idea in the other thread [1], but >>> > > was rather scared of the actual implementation. I guess the question >>> > > is whether there are possible state changes to the underlying XHR >>> > > object that might affect the properties but that are not exposed >>> > > through the onreadystatechange handler. I don't have nearly the >>> > > knowledge of XHR to answer this. If there aren't any, I think this >>> is >>> > > quite a good idea. >>> > >>> > > -- Scott >>> > >>> > > [1]http://tinyurl.com/yl2lqjz#msg_1fa4cac00dbcedcf >>> > >>> > Well, then. I had started working on something similar, but much >>> > simpler. I had planned to intercept the return value of $.ajax and >>> > extend it with 'success' and 'error' functions. Of course, I hadn't >>> > gotten to the point of actually testing this, so who knows if it would >>> > have worked. Your solution sounds much more robust and forward >>> > thinking. Very nice. >>> > >>> > _jason- Hide quoted text - >>> > >>> > - Show quoted text - >>> >>> -- >>> >>> You received this message because you are subscribed to the Google Groups >>> "jQuery Development" group. >>> To post to this group, send email to jquery-...@googlegroups.com. >>> To unsubscribe from this group, send email to >>> jquery-dev+unsubscr...@googlegroups.com<jquery-dev%2bunsubscr...@googlegroups.com> >>> . >>> For more options, visit this group at >>> http://groups.google.com/group/jquery-dev?hl=. >>> >>> >>> >> > -- > You received this message because you are subscribed to the Google Groups > "jQuery Development" group. > To post to this group, send email to jquery-...@googlegroups.com. > To unsubscribe from this group, send email to > jquery-dev+unsubscr...@googlegroups.com<jquery-dev%2bunsubscr...@googlegroups.com> > . > For more options, visit this group at > http://groups.google.com/group/jquery-dev?hl=. > -- You received this message because you are subscribed to the Google Groups "jQuery Development" group. To post to this group, send email to jquery-...@googlegroups.com. To unsubscribe from this group, send email to jquery-dev+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/jquery-dev?hl=.