#mootools #jsonp
#mootools #jsonp
Вопрос:
Мне действительно трудно заставить это работать. Все, что мне требуется, это записать в консоль возвращаемый объект. Я вообще ничего не вижу в журнале, хотя тег script вводится в head.
JSON:
jsonFeed({
"results":{
"loggedin": "No",
"username": "",
"company": ""
}
});
JS:
function jsonFeed() {
}
window.addEvent('domready', function() {
new Request.JSONP({
url: <correcturl>,
onComplete: function(data){
console.log(data); // Nothing returned
}
}).send();
});
Мы высоко ценим любую помощь.
Обновить
Я удалил функцию jsonFeed вверху и изменил существующий код на:
new Request.JSONP({
log: true,
url: loginstatus,
callbackKey: 'jsonFeed',
onComplete: function(data){
console.log(data); // Nothing returned
}
}).send();
В журнале я получаю:
JSONP retrieving script with url:http://thedomain/LoggedStatus.aspx?jsonFeed=Request.JSONP.request_map.request_0
jsonFeed is not defined
В это вводится:
<script type="text/javascript" async="true" src="http://thedomain/LoggedStatus.aspx?jsonFeed=Request.JSONP.request_map.request_0">
-- if I expand this I see the JSON --
</script>
итак, а) я получаю ошибку jsonFeed not defined и б) onSuccess не запускается : (
Я действительно ценю всю вашу помощь, ребята. И я прошу прощения, если я упускаю суть: (
Обновить
добавлено:
this.jsonFeed = function(data) {
console.log(data);
};
.. и это работает. Спасибо @Dimitar
Я все еще не совсем понимаю это, но теперь это работает, это помогает при разработке.
Комментарии:
1. что firebug должен сказать? вы действительно переходите по правильному URL? каков необработанный возврат в запросе?
2. 100% это правильный URL. вводится тег <script>, и если я разверну его, то увижу JSON.
3. и… JSON начинается с фигурных { скобок, а не [name](), которые, я полагаю, вы улучшаете как вызов функции.
4. На самом деле, кажется, что onComplete вообще не запускается, так как даже если я введу «console.log(‘test’);», я не увижу журнал.
5. посмотрите firebug — видите ли вы запрос?
Ответ №1:
это не работает, потому что имя вашей функции обратного вызова игнорирует ту, которая запрашивает.Вместо этого JSONP отправляет и возвращает jsonFeed.
http://mootools.net/docs/more/Request/Request .JSONP
callbackKey
(строка: по умолчанию используется обратный вызов) ключ в URL, который сервер использует для переноса результатов JSON. Итак, например, если вы использовали callbackKey: ‘обратный вызов’, то сервер ожидает что-то вродеhttp://…./?q=search termamp;callback=myFunction; Это должно быть определено правильно.
вот пример класса, который я написал, который получает информацию от flickr — которые используют пользовательский ключ обратного вызова — это нормально. http://fragged.org/mootools-flickr-api-class-via-request-jsonp_1042.html (p.s. jsfiddle может быть медленным в банкомате, в пятницу, 13-е число!)
другое дело, если удаленный сервер ПРОДОЛЖАЕТ не работать с вами и отказывается отправлять данные в правильно упакованном формате, например:
Request.JSONP.request_map.request_0({data})
затем вам действительно нужно убедиться, что
this.jsonFeed = function(data) {
console.log(data);
};
где это глобальный объект (например, window) — вы не можете охватить это, поэтому будьте осторожны с определением функции.
при выполнении последнего jsonFeed возьмет на себя роль функции обратного вызова по завершении.
это можно сделать другим способом, который сопоставит встроенную функцию обратного вызова, определенную классом, и экспортирует ее на тот, который нравится вашему удаленному хосту:
onRequest: function() {
var lastCallback;
Object.each(Request.JSONP.request_map, function(el) {
lastCallback = el;
});
window.jsonFlickrApi = lastCallback;
},
onComplete: function(data) {
...
}
Ответ №2:
jsonFeed(
return //or anything else that will make this piece of data recognizable on your page
{
"results":{
"loggedin": "No",
"username": "",
"company": ""
}
});
new Request.JSONP({
url: <correcturl>,
callbackKey: 'jsonFeed'
onComplete: function(data){
console.log(data); // Nothing returned
}
}).send();