0

我是一个菜鸟,我看到其他用户也遇到过类似的问题,但是经过数小时的挫折后,我无法让 JSONP 回调函数工作。

我正在尝试从 Yahoo geo.places 中提取“woeid”信息,以便我可以使用它来指定获取天气数据的位置。我从表单中的“位置”ID 接收输入(例如邮政编码)并将其提交给雅虎。

代码返回一个 XMLHttpRequest 对象,我可以通过查看控制台中的 xhr.responseText 来读取它,但我无法提取服务器传递给回调函数的 JSON 对象。

我知道我一定犯了一个简单的错误,但是我不知道它是什么。在学习如何使用 jQuery 中的 $.ajax 方法检索数据之前,我试图通过 Javascript 来做到这一点。

你能告诉我错误在哪里吗?这是我的代码:

// an XMLTHttpRequest
var xhr = null;

/*
* void
* getWoeid()
* gets WOEID from Yahoo geo.places to use in request
* for weather data
*
*/



function getWoeid() {
// instantiate XMLHttpRequest object
try {
    xhr = new XMLHttpRequest();
}
catch (e) {
    xhr = new ActiveXObject("Microsoft.XMLHTTP");
}

// handle old browsers
if (xhr == null) {
    alert("Ajax not supported by your browser!");
    return;
}

// construct URL
var userinput = document.getElementById("location").value;

var data = encodeURIComponent("select * from" +
            " geo.places where text =" + userinput);

var url = "http://query.yahooapis.com/v1/public/yql?q=" + data + "&format=json&    callback=callback";


// get data
xhr.onreadystatechange = handler;
xhr.open("GET", url, true);
xhr.send(null);
}


// callback function
function callback(response) {
    woeid = response;
}


/*
* void
* handler()
*
* Handles the Ajax response
*/

function handler() {

// only handle loaded requests
if (xhr.readyState == 4) {

    // display response if possible
    if (xhr.status == 200) {
          var location = woeid;
    }

    else    
       alert("Error with Ajax call");
}

}

4

1 回答 1

1

您不能使用 XHR 对象来请求 JSONP 结果,因为相同的来源策略。此外,即使您在本地发出请求,使用 XHR 对象发出请求也意味着callback不会调用该函数,您只会在响应中获得调用它的代码。

要发出 JSONP 请求,请使用脚本标签:

var script = document.createElement('script');
script.src = url;
document.head.appendChild(script);
于 2013-06-05T07:14:11.963 回答