123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- /**
- * jQuery Server Plugin
- *
- * Server-side Ajax requests supporting jQuery manipulations
- * before sending content to the browser.
- *
- * Example:
- * $.server({url: ${URL})
- * .find('.my-class')
- * .client(${CALLBACK});
- *
- * @version 0.5.1
- * @author Tobiasz Cudnik <tobiasz.cudnik/gmail.com>
- * @link http://code.google.com/p/phpquery/wiki/jQueryServer
- * @link http://code.google.com/p/phpquery/
- */
- jQuery.extend({
- serverConfig: function() {
- if (typeof jQueryServerConfig != 'undefined')
- return jQueryServerConfig;
- return {};
- }(),
- server: function(options){
- // set default url
- if (! jQuery.serverConfig.url)
- jQuery.serverConfig.url = jQuery('script[src$=jquery.js]')
- .attr('src').replace(/jquery\.js$/, '')
- +'jQueryServer.php';
- // this is cache object
- var objectCache = {};
- // dump all jQuery methods, but only once
- // $.each doesn't work ?
- for( var i in jQuery.fn) {
- // closure to preserve loop iterator in scope
- (function(){
- var name = i;
- // create dummy method
- objectCache[name] = function(){
- // create method data object
- var data = {
- method: name,
- arguments: []
- };
- // collect arguments
- $.each(arguments, function(k, v){
- data.arguments.push(v);
- });
- // push data into stack
- this.stack.push(data);
- // preserve chain
- return this;
- }
- })();
- }
- /**
- * Fetches results from phpQuery.
- *
- * @param {Function} callback Optional. Turns on async request.
- * First parameter for callback is usually an JSON array of mathed elements. Use $(result) to append it to DOM.
- * It can also be a boolean value or string, depending on last method called.
- */
- objectCache.client = function(success, error){
- // console.log(this.stack.toSource());
- // success = success || function(){
- // return $result;
- // };
- $.ajax({
- type: 'POST',
- data: {data: $.toJSON(this.stack)},
- async: false,
- // jQuery.server.config ???
- url: jQuery.serverConfig.url,
- // success: function(response){
- // var $result = jQuery();
- // $.each(response, function(v) {
- // $result.add(v);
- // })
- // success.call(null, $result);
- // },
- // success: success,
- success: function(response){
- if (options['dataType'] == 'json')
- response = $.parseJSON(response);
- success(response);
- },
- error: error
- })
- }
- // replace orginal method with generated method using cache (lazy-load)
- jQuery.server = function(options){
- // clone cache object
- var myCache = jQuery.extend({}, objectCache);
- myCache.stack = [options];
- return myCache;
- }
- // returen result from new method (only done for first call)
- return jQuery.server(options);
- }
- });
- // toJSON by Mark Gibson
- if (typeof $.toJSON == 'undefined') {
- (function ($) {
- var m = {
- '\b': '\\b',
- '\t': '\\t',
- '\n': '\\n',
- '\f': '\\f',
- '\r': '\\r',
- '"' : '\\"',
- '\\': '\\\\'
- },
- s = {
- 'array': function (x) {
- var a = ['['], b, f, i, l = x.length, v;
- for (i = 0; i < l; i += 1) {
- v = x[i];
- f = s[typeof v];
- if (f) {
- v = f(v);
- if (typeof v == 'string') {
- if (b) {
- a[a.length] = ',';
- }
- a[a.length] = v;
- b = true;
- }
- }
- }
- a[a.length] = ']';
- return a.join('');
- },
- 'boolean': function (x) {
- return String(x);
- },
- 'null': function (x) {
- return "null";
- },
- 'number': function (x) {
- return isFinite(x) ? String(x) : 'null';
- },
- 'object': function (x) {
- if (x) {
- if (x instanceof Array) {
- return s.array(x);
- }
- var a = ['{'], b, f, i, v;
- for (i in x) {
- v = x[i];
- f = s[typeof v];
- if (f) {
- v = f(v);
- if (typeof v == 'string') {
- if (b) {
- a[a.length] = ',';
- }
- a.push(s.string(i), ':', v);
- b = true;
- }
- }
- }
- a[a.length] = '}';
- return a.join('');
- }
- return 'null';
- },
- 'string': function (x) {
- if (/["\\\x00-\x1f]/.test(x)) {
- x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) {
- var c = m[b];
- if (c) {
- return c;
- }
- c = b.charCodeAt();
- return '\\u00' +
- Math.floor(c / 16).toString(16) +
- (c % 16).toString(16);
- });
- }
- return '"' + x + '"';
- }
- };
-
- $.toJSON = function(v) {
- var f = isNaN(v) ? s[typeof v] : s['number'];
- if (f) return f(v);
- };
-
- $.parseJSON = function(v, safe) {
- if (JSON)
- return JSON.parse(v);
- if (safe === undefined)
- safe = $.parseJSON.safe;
- if (safe && !/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(v))
- return undefined;
- return eval('('+v+')');
- };
-
- $.parseJSON.safe = false;
-
- })(jQuery);
- }
|