157 lines
3.5 KiB
JavaScript
157 lines
3.5 KiB
JavaScript
/* jQuery ajax stream plugin
|
|
* Version 0.1
|
|
* Copyright (C) 2009 Chris Tarquini
|
|
* Licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License (http://creativecommons.org/licenses/by-sa/3.0/)
|
|
* Permissions beyond the scope of this license may be available by contacting petros000[at]hotmail.com.
|
|
*/
|
|
|
|
(function($) {
|
|
|
|
// Save the original AJAX function
|
|
var ajax_old = $.ajax;
|
|
var get_old = $.get;
|
|
var post_old = $.post;
|
|
var active = true;
|
|
// Add our settings
|
|
$.ajaxSetup({stream: false,pollInterval: 500/*, onDataRecieved: function(){}*/ });
|
|
$.enableAjaxStream = function(enable)
|
|
{
|
|
if(typeof enable == 'undefined') enable = !active;
|
|
if(!enable)
|
|
{
|
|
$.ajax = ajax_old;
|
|
$.get = get_old;
|
|
$.post = post_old;
|
|
active = false;
|
|
}
|
|
else
|
|
{
|
|
$.ajax = ajax_stream;
|
|
$.get = ajax_get_stream;
|
|
$.post = ajax_post_stream;
|
|
active = true;
|
|
}
|
|
|
|
}
|
|
var ajax_stream = $.ajax = function(options)
|
|
{
|
|
//copied from original ajax function
|
|
options = jQuery.extend(true, options, jQuery.extend(true, {}, jQuery.ajaxSettings, options));
|
|
if(options.stream)
|
|
{
|
|
var timer = 0;
|
|
var offset = 0;
|
|
var xmlhttp = null;
|
|
var lastlen = 0;
|
|
var done = false;
|
|
var hook = function(xhr)
|
|
{
|
|
xmlhttp = xhr;
|
|
checkagain();
|
|
}
|
|
var fix = function(){ check('stream'); };// fixes weird bug with random numbers as arg
|
|
var checkagain = function(){if(!done) timer = setTimeout(fix,options.pollInterval);}
|
|
var check = function(status)
|
|
{
|
|
if(typeof status == 'undefined') status = "stream";
|
|
if(xmlhttp.status < 3) return; //only get the latest packet if data has been sent
|
|
var text = xmlhttp.responseText;
|
|
if(status == 'stream') //if we arent streaming then just flush the buffer
|
|
{
|
|
if(text.length <= lastlen) { checkagain(); return;}
|
|
lastlength = text.length;
|
|
if(offset == text.length) { checkagain(); return;}
|
|
}
|
|
var pkt = text.substr(offset);
|
|
offset = text.length;
|
|
if($.isFunction(options.OnDataRecieved))
|
|
{
|
|
options.OnDataRecieved(pkt, status, xmlhttp.responseText, xmlhttp);
|
|
}
|
|
if(xmlhttp.status != 4)
|
|
checkagain();
|
|
}
|
|
var complete = function(xhr,s)
|
|
{
|
|
clearTimeout(timer);//done..stop polling
|
|
done = true;
|
|
// send final call
|
|
check(s);
|
|
}
|
|
// If the complete callback is set create a new callback that calls the users and outs
|
|
if($.isFunction(options.success))
|
|
{
|
|
var oc = options.success;
|
|
options.success = function(xhr,s){ complete(xhr,s); oc(xhr,s);};
|
|
|
|
}
|
|
else options.success = complete;
|
|
// Set up our hook on the beforeSend
|
|
if($.isFunction(options.beforeSend))
|
|
{
|
|
var obs = options.beforeSend;
|
|
options.beforeSend = function(xhr){ obs(xhr); hook(xhr);};
|
|
}
|
|
else options.beforeSend = hook;
|
|
|
|
}
|
|
ajax_old(options);
|
|
}
|
|
|
|
var ajax_get_stream = $.get = function(url,data,callback,type,stream)
|
|
{
|
|
if($.isFunction(data))
|
|
{
|
|
var orgcb = callback;
|
|
callback = data;
|
|
if($.isFunction(orgcb))
|
|
{
|
|
stream = orgcb;
|
|
}
|
|
data = null;
|
|
}
|
|
if($.isFunction(type))
|
|
{
|
|
stream = type;
|
|
type = undefined;
|
|
}
|
|
var dostream = $.isFunction(stream);
|
|
return jQuery.ajax({
|
|
type: "GET",
|
|
url: url,
|
|
data: data,
|
|
success: callback,
|
|
dataType: type,
|
|
stream: dostream,
|
|
OnDataRecieved: stream
|
|
});
|
|
|
|
}
|
|
|
|
var ajax_post_stream = $.post = function(url,data,callback,type,stream)
|
|
{
|
|
if($.isFunction(data))
|
|
{
|
|
var orgcb = callback;
|
|
callback = data;
|
|
}
|
|
if($.isFunction(type))
|
|
{
|
|
stream = type;
|
|
type = undefined;
|
|
}
|
|
var dostream = $.isFunction(stream);
|
|
return jQuery.ajax({
|
|
type: "POST",
|
|
url: url,
|
|
data: data,
|
|
success: callback,
|
|
dataType: type,
|
|
stream: dostream,
|
|
OnDataRecieved: stream
|
|
});
|
|
|
|
}
|
|
|
|
})(jQuery);
|
|
|