我在静态文件服务器 - GitHub Pages 上提供 JSONP JavaScript 文件。
这意味着我无法动态在服务器上设置 JSONP 回调函数名称...
动态示例 - PHP
header('Content-Type: text/javascript; charset=utf8');
$data = '{ "foo":"bar" }'; // json string
echo $_GET['callback'] .'('.$data.');'; // function name set via ?callback=xyz
jQuery.ajax() 有一个 jsonpCallback
param 定义静态回调函数名称。因此,我可以提供一个 javascript 文件,例如 test-jsonp.js
,其中包含以下内容:
静态示例 - JavaScript 文件
jsonpCallbackABC({ "foo":"bar" });
但是 jQuery 文档建议 <强>静态不太理想。
http://api.jquery.com/jQuery.ajax/
jsonpCallback
指定回调函数名称
JSONP 请求。该值将是
使用而不是随机名称
由 jQuery 自动生成。它
最好让 jQuery 生成一个
独特的名称,因为它会更容易
管理请求并提供
回调和错误处理。您可以
想要指定回调时
想要启用更好的浏览器缓存
GET 请求。
有人可以更详细地介绍静态 JSONP 函数名称的陷阱吗?
I'm serving my JSONP JavaScript file on a static file server - GitHub Pages.
This means I can't dynamically set the JSONP callback function name on the server...
Dynamic example - PHP
header('Content-Type: text/javascript; charset=utf8');
$data = '{ "foo":"bar" }'; // json string
echo $_GET['callback'] .'('.$data.');'; // function name set via ?callback=xyz
jQuery.ajax() has a jsonpCallback
param to define a static callback function name. So I can server a javascript file e.g. test-jsonp.js
with the following content:
Static example - JavaScript file
jsonpCallbackABC({ "foo":"bar" });
However the jQuery documentation suggests static is less desirable.
http://api.jquery.com/jQuery.ajax/
jsonpCallback
Specify the callback function name for
a JSONP request. This value will be
used instead of the random name
automatically generated by jQuery. It
is preferable to let jQuery generate a
unique name as it'll make it easier to
manage the requests and provide
callbacks and error handling. You may
want to specify the callback when you
want to enable better browser caching
of GET requests.
Can someone please go into more detail on the pitfalls of static JSONP function names?
发布评论
评论(2)
很简单:您的页面是否使用 jsonp 执行同时请求(大多数页面都是这样做的,因为请求是从页面事件异步启动的)?
如果是这样,如果您有单个入口点(单个 jsonp 回调),则响应将更难以分离和处理。
我在最近的一个项目中使用了静态回调函数名称,但它是在同步模式下使用的,并且在页面生命周期内仅使用一次,因此将回调名称设为静态并不是问题。
It's simple: Does your page do simultaneous requests using jsonp (mostly pages do as the requests are asynchronously started from page events) ?
If so, the responses will be harder to separate and process if you have a single point of entry (single jsonp callback).
I used a static callback function name on a recent project, but it was used in synchronous mode, and only once over the page lifetime, so it wasn't a problem to make the callback name static.
如果代码中的其他位置定义了同名函数,它将与 jsonp 中的函数发生冲突。
如果您尝试在页面的不同部分调用相同的服务,您也可能会遇到问题,所有 ajax 调用都将收到相同的响应,这可能会导致难以调试行为。
If there's an other place in your code where a function with the same name is defined, it will collide with the function in the jsonp.
You could also have problems if you try to call the same service in different parts of the page, all the ajax call will receive the same reponse, it could cause difficult to debug behaviors.