diff options
| author | bjorn <bjorn@bringert.net> | 2008-10-17 11:14:46 +0000 |
|---|---|---|
| committer | bjorn <bjorn@bringert.net> | 2008-10-17 11:14:46 +0000 |
| commit | 0eaef4a5b576aad05a0e52690f0cc02e87c82168 (patch) | |
| tree | b68f9dd3c3e92974d37f03f2976fc13ddaefc3a5 /src | |
| parent | 3df821efd7fd0efaf6cf9b1163b6542aa29f5cc7 (diff) | |
Use JSON-P in gf-server-jsapi.js
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/gf-server-jsapi.js | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/server/gf-server-jsapi.js b/src/server/gf-server-jsapi.js index 6cf6afbc3..5c02395e8 100644 --- a/src/server/gf-server-jsapi.js +++ b/src/server/gf-server-jsapi.js @@ -26,11 +26,41 @@ gf.callFunction = function (fun, args, callback) { var query = ""; for (var i in args) { query += (query == "") ? "?" : "&"; - query += i + "=" + escape(args[i]); + query += i + "=" + encodeURIComponent(args[i]); } - gf.httpGetText(pgf_base_url + "/" + fun + query, function (output) { callback(gf.readJSON(output)); }); + var url = pgf_base_url + "/" + fun + query; + + // FIXME: if same domain, use gf.httpGetText + gf.httpGetJSONP(url, callback); } +gf.httpGetJSONP = function (url, callback) { + var script = document.createElement("script"); + + if (!window.jsonCallbacks) { + window.jsonCallbacks = new Array(); + } + var callbackIndex = window.jsonCallbacks.length; + window.jsonCallbacks.push(function (output) { + document.getElementsByTagName("head")[0].removeChild(script); + callback(output); + window.jsonCallbacks[callbackIndex] = null; // let the function be garbage-collected + // FIXME: there will be lots of nulls in that array, we should purge it + }); + var callbackName = "jsonCallbacks[" + callbackIndex + "]"; + + var questionMarkPos = url.indexOf("?"); + if (questionMarkPos > -1) { + url += (questionMarkPos < url.length-1) ? "&" : ""; + } else { + url += "?"; + } + url += "jsonp=" + callbackName; + script.setAttribute("src", url); + script.setAttribute("type", "text/javascript"); + document.getElementsByTagName("head")[0].appendChild(script); +}; + gf.httpGetText = function (url, callback) { var XMLHttpRequestObject = false; |
