1 <html><head><title>Roo/data/ScriptTagProxy.js</title><link rel="stylesheet" type="text/css" href="../../css/highlight-js.css"/></head><body class="highlightpage"><code class="jsdoc-pretty"><span class="jsdoc-comment">/*
4 * Copyright(c) 2006-2007, Ext JS, LLC.
6 * Originally Released Under LGPL - original licence link has changed is not relivant.
9 * <script type="text/javascript">
13 * @class Roo.data.ScriptTagProxy
14 * An implementation of Roo.data.DataProxy that reads a data object from a URL which may be in a domain
15 * other than the originating domain of the running page.<br><br>
17 * <em>Note that if you are retrieving data from a page that is in a domain that is NOT the same as the originating domain
18 * of the running page, you must use this class, rather than DataProxy.</em><br><br>
20 * The content passed back from a server resource requested by a ScriptTagProxy is executable JavaScript
21 * source code that is used as the source inside a &lt;script> tag.<br><br>
23 * In order for the browser to process the returned data, the server must wrap the data object
24 * with a call to a callback function, the name of which is passed as a parameter by the ScriptTagProxy.
25 * Below is a Java example for a servlet which returns data for either a ScriptTagProxy, or an HttpProxy
26 * depending on whether the callback name was passed:
28 * <pre><code>
29 boolean scriptTag = false;
30 String cb = request.getParameter("callback");
33 response.setContentType("text/javascript");
35 response.setContentType("application/x-json");
37 Writer out = response.getWriter();
39 out.write(cb + "(");
41 out.print(dataBlock.toJsonString());
43 out.write(");");
45 </pre></code>
48 * @param {Object} config A configuration object.
50 </span><span class="jsdoc-var">Roo.data.ScriptTagProxy </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">config</span><span class="jsdoc-syntax">){
51 </span><span class="jsdoc-var">Roo.data.ScriptTagProxy.superclass.constructor.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
52 </span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">config</span><span class="jsdoc-syntax">);
53 </span><span class="jsdoc-var">this.head </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">document.getElementsByTagName</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"head"</span><span class="jsdoc-syntax">)[0];
56 </span><span class="jsdoc-var">Roo.data.ScriptTagProxy.TRANS_ID </span><span class="jsdoc-syntax">= 1000;
58 </span><span class="jsdoc-var">Roo.extend</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.data.ScriptTagProxy</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.data.DataProxy</span><span class="jsdoc-syntax">, {
59 </span><span class="jsdoc-comment">/**
60 * @cfg {String} url The URL from which to request the data object.
63 * @cfg {Number} timeout (Optional) The number of milliseconds to wait for a response. Defaults to 30 seconds.
65 </span><span class="jsdoc-var">timeout </span><span class="jsdoc-syntax">: 30000,
66 </span><span class="jsdoc-comment">/**
67 * @cfg {String} callbackParam (Optional) The name of the parameter to pass to the server which tells
68 * the server the name of the callback function set up by the load call to process the returned data object.
69 * Defaults to "callback".<p>The server-side processing must read this parameter value, and generate
70 * javascript output which calls this named function passing the data object as its only parameter.
72 </span><span class="jsdoc-var">callbackParam </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">"callback"</span><span class="jsdoc-syntax">,
73 </span><span class="jsdoc-comment">/**
74 * @cfg {Boolean} nocache (Optional) Defaults to true. Disable cacheing by adding a unique parameter
75 * name to the request.
77 </span><span class="jsdoc-var">nocache </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">,
79 </span><span class="jsdoc-comment">/**
80 * Load data from the configured URL, read the data object into
81 * a block of Roo.data.Records using the passed Roo.data.DataReader implementation, and
82 * process that block using the passed callback.
83 * @param {Object} params An object containing properties which are to be used as HTTP parameters
84 * for the request to the remote server.
85 * @param {Roo.data.DataReader} reader The Reader object which converts the data
86 * object into a block of Roo.data.Records.
87 * @param {Function} callback The function into which to pass the block of Roo.data.Records.
88 * The function must be passed <ul>
89 * <li>The Record block object</li>
90 * <li>The "arg" argument from the load function</li>
91 * <li>A boolean success indicator</li>
93 * @param {Object} scope The scope in which to call the callback
94 * @param {Object} arg An optional argument which is passed to the callback as its second parameter.
96 </span><span class="jsdoc-var">load </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">params</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">reader</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">callback</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">arg</span><span class="jsdoc-syntax">){
97 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"beforeload"</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">params</span><span class="jsdoc-syntax">) !== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
99 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">p </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.urlEncode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">Roo.apply</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">params</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.extraParams</span><span class="jsdoc-syntax">));
101 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">url </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.url</span><span class="jsdoc-syntax">;
102 </span><span class="jsdoc-var">url </span><span class="jsdoc-syntax">+= (</span><span class="jsdoc-var">url.indexOf</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"?"</span><span class="jsdoc-syntax">) != -1 ? </span><span class="jsdoc-string">"&" </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">"?"</span><span class="jsdoc-syntax">) + </span><span class="jsdoc-var">p</span><span class="jsdoc-syntax">;
103 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.nocache</span><span class="jsdoc-syntax">){
104 </span><span class="jsdoc-var">url </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-string">"&_dc=" </span><span class="jsdoc-syntax">+ (</span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Date</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.getTime</span><span class="jsdoc-syntax">());
106 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">transId </span><span class="jsdoc-syntax">= ++</span><span class="jsdoc-var">Roo.data.ScriptTagProxy.TRANS_ID</span><span class="jsdoc-syntax">;
107 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">trans </span><span class="jsdoc-syntax">= {
108 </span><span class="jsdoc-var">id </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">transId</span><span class="jsdoc-syntax">,
109 </span><span class="jsdoc-var">cb </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">"stcCallback"</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">transId</span><span class="jsdoc-syntax">,
110 </span><span class="jsdoc-var">scriptId </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">"stcScript"</span><span class="jsdoc-syntax">+</span><span class="jsdoc-var">transId</span><span class="jsdoc-syntax">,
111 </span><span class="jsdoc-var">params </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">params</span><span class="jsdoc-syntax">,
112 </span><span class="jsdoc-var">arg </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">arg</span><span class="jsdoc-syntax">,
113 </span><span class="jsdoc-var">url </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">url</span><span class="jsdoc-syntax">,
114 </span><span class="jsdoc-var">callback </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">callback</span><span class="jsdoc-syntax">,
115 </span><span class="jsdoc-var">scope </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">,
116 </span><span class="jsdoc-var">reader </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">reader
117 </span><span class="jsdoc-syntax">};
118 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">conn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">;
120 </span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">trans.cb</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">){
121 </span><span class="jsdoc-var">conn.handleResponse</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">trans</span><span class="jsdoc-syntax">);
124 </span><span class="jsdoc-var">url </span><span class="jsdoc-syntax">+= </span><span class="jsdoc-var">String.format</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"&{0}={1}"</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.callbackParam</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">trans.cb</span><span class="jsdoc-syntax">);
126 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.autoAbort </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">){
127 </span><span class="jsdoc-var">this.abort</span><span class="jsdoc-syntax">();
130 </span><span class="jsdoc-var">trans.timeoutId </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.handleFailure.defer</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.timeout</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, [</span><span class="jsdoc-var">trans</span><span class="jsdoc-syntax">]);
132 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">script </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">document.createElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"script"</span><span class="jsdoc-syntax">);
133 </span><span class="jsdoc-var">script.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"src"</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">url</span><span class="jsdoc-syntax">);
134 </span><span class="jsdoc-var">script.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"type"</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">"text/javascript"</span><span class="jsdoc-syntax">);
135 </span><span class="jsdoc-var">script.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"id"</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">trans.scriptId</span><span class="jsdoc-syntax">);
136 </span><span class="jsdoc-var">this.head.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">script</span><span class="jsdoc-syntax">);
138 </span><span class="jsdoc-var">this.trans </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">trans</span><span class="jsdoc-syntax">;
139 }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
140 </span><span class="jsdoc-var">callback.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">scope</span><span class="jsdoc-syntax">||</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">arg</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">);
144 </span><span class="jsdoc-comment">// private
145 </span><span class="jsdoc-var">isLoading </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
146 </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">this.trans </span><span class="jsdoc-syntax">? </span><span class="jsdoc-keyword">true </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
149 </span><span class="jsdoc-comment">/**
150 * Abort the current server request.
152 </span><span class="jsdoc-var">abort </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
153 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.isLoading</span><span class="jsdoc-syntax">()){
154 </span><span class="jsdoc-var">this.destroyTrans</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.trans</span><span class="jsdoc-syntax">);
158 </span><span class="jsdoc-comment">// private
159 </span><span class="jsdoc-var">destroyTrans </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">trans</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">isLoaded</span><span class="jsdoc-syntax">){
160 </span><span class="jsdoc-var">this.head.removeChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">document.getElementById</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">trans.scriptId</span><span class="jsdoc-syntax">));
161 </span><span class="jsdoc-var">clearTimeout</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">trans.timeoutId</span><span class="jsdoc-syntax">);
162 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">isLoaded</span><span class="jsdoc-syntax">){
163 </span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">trans.cb</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">undefined</span><span class="jsdoc-syntax">;
164 </span><span class="jsdoc-keyword">try</span><span class="jsdoc-syntax">{
165 </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">trans.cb</span><span class="jsdoc-syntax">];
166 }</span><span class="jsdoc-keyword">catch</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">){}
167 }</span><span class="jsdoc-keyword">else</span><span class="jsdoc-syntax">{
168 </span><span class="jsdoc-comment">// if hasn't been loaded, wait for load to remove it to prevent script error
169 </span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">trans.cb</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
170 </span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">trans.cb</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-var">undefined</span><span class="jsdoc-syntax">;
171 </span><span class="jsdoc-keyword">try</span><span class="jsdoc-syntax">{
172 </span><span class="jsdoc-keyword">delete </span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">trans.cb</span><span class="jsdoc-syntax">];
173 }</span><span class="jsdoc-keyword">catch</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">){}
178 </span><span class="jsdoc-comment">// private
179 </span><span class="jsdoc-var">handleResponse </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">trans</span><span class="jsdoc-syntax">){
180 </span><span class="jsdoc-var">this.trans </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
181 </span><span class="jsdoc-var">this.destroyTrans</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">trans</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">);
182 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">result</span><span class="jsdoc-syntax">;
183 </span><span class="jsdoc-keyword">try </span><span class="jsdoc-syntax">{
184 </span><span class="jsdoc-var">result </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">trans.reader.readRecords</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">);
185 }</span><span class="jsdoc-keyword">catch</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">){
186 </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"loadexception"</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">trans.arg</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">);
187 </span><span class="jsdoc-var">trans.callback.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">trans.scope</span><span class="jsdoc-syntax">||</span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">trans.arg</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">);
188 </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
190 </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"load"</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">o</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">trans.arg</span><span class="jsdoc-syntax">);
191 </span><span class="jsdoc-var">trans.callback.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">trans.scope</span><span class="jsdoc-syntax">||</span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">result</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">trans.arg</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">);
194 </span><span class="jsdoc-comment">// private
195 </span><span class="jsdoc-var">handleFailure </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">trans</span><span class="jsdoc-syntax">){
196 </span><span class="jsdoc-var">this.trans </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
197 </span><span class="jsdoc-var">this.destroyTrans</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">trans</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">);
198 </span><span class="jsdoc-var">this.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">"loadexception"</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">trans.arg</span><span class="jsdoc-syntax">);
199 </span><span class="jsdoc-var">trans.callback.call</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">trans.scope</span><span class="jsdoc-syntax">||</span><span class="jsdoc-var">window</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">trans.arg</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">);
201 });</span></code></body></html>