JavaScript JSONP回调函数未定义。

3
(
function restoreURL() {
    function turnLongURL(data) {
        window.location = data.url;
    }

    var shortUrl = window.location.href;

    var url = "http://json-longurl.appspot.com/?url=" + shortUrl + "&callback=turnLongURL";

    var script = document.createElement('script');
    script.setAttribute('src', url);

    document.getElementsByTagName('head')[0].appendChild(script); 
})();

上面有代码,但Firebug告诉我,turnLongURL未定义。

为什么会这样?

1个回答

8

使用 script 元素向文档添加 JSON-P,因此其中的函数调用必须引用全局范围内存在的函数。

turnLongURL 只限于 restoreURL 范围内,因为它是在其中定义的。

将函数声明移动到全局范围,或将其更改为函数语句:

window.turnLongURL = function (data) {

…应该能使其工作。

请记得考虑到可能发生的竞争条件,当第一个请求返回之前,多个JSON-P请求被发送出去。


它仍然无法工作,并且一直显示“turnLongURL未定义”... 如果我正在编辑Greasemonkey脚本,是否会有任何区别? - Ya Zhuang
@Quentin,如何最好地解决 JSONP 竞态条件问题? - David d C e Freitas
相关的吗?https://dev59.com/2Woy5IYBdhLWcg3wg-Ym - James Hibbard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接