JQuery, JSON-P и Google Translation: различные ошибки - PullRequest
1 голос
/ 01 марта 2011

В настоящее время я разрабатываю пользовательский скрипт GreaseMonkey, чтобы обеспечить прямой перевод некоторых полей формы внутри приложения для интрасети.

Все идет нормально, пока я не вызову Google Translation API, используя этот код:

var apiurl = 'https://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=fr%7Cen&q=';
$.getJSON(apiurl+encodeURIComponent(text)+"&callback=?",function(data){
    alert('Translation Complete');
    //Change text
});

Вот мои проблемы:

  • Я вынужден использовать JSONP, так как это междоменный запрос. Для этого я добавил строку &callback=? в конце моего URL. Обратный вызов getJSON не сработал (но данные ответа верны), и я получаю эту ошибку в консоли Firebug:

jsonp1298988446807 не определено

  • Если я вместо этого использую &callback=foo, FF, похоже, не понравится, так как мой запрос больше не POST, он не завершается, но показывает (на панели «Сеть»)

    OPTIONS request_url 405 Method Not Allowed

  • Если я создаю пользовательскую функцию, которая указывается как обратный вызов, она также не работает, так как функция не вызывается (она содержит только предупреждение, чтобы проверить, работает ли она).

Если у кого-то есть хоть малейшее представление о том, почему это не работает, пожалуйста, помогите мне, потому что я близок к тому, чтобы ударить головой о стену (возможно, это поможет ^^).

Спасибо.

<ч /> РЕДАКТИРОВАТЬ : Благодаря Скублеру я поверил, что пошел немного дальше. Используя его код, мне удалось получить что-то большее, чем /ignore из моего сценария ^^

Запрос не отображается на вкладке сети Firebug, и ответы, полученные с помощью предупреждений:

Текст ответа: не определено

Статус возвращен: ошибка

Ошибка выдана: Ошибка выдана: [Исключение ... "Компонент недоступен" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" местоположение: "JS frame :: file: /// C: / Documents% 20 и% 20Settings / username /Application%20Data/Mozilla/Firefox/Profiles/jmbr7ut9.default/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D/components/greasemonkey.js :: anonymous :: line 396 "данные: нет] * 10

В то же время я продолжал исследовать самостоятельно и наткнулся на мост jQuery / GreaseMonkey для междоменных запросов с полным прохождением здесь этого поста ), но это показывает ту же ошибку, что и сценарий Скублера

Ответы [ 3 ]

2 голосов
/ 01 марта 2011

Возможно, попробуйте это - это более подробный синтаксис для .ajax(), но вам не нужно кодировать параметры самостоятельно:

var apiurl = 'https://ajax.googleapis.com/ajax/services/language/translate';

var text = 'il fonctionne parfaitement';

$.ajax({
    url: apiurl,
    dataType: 'jsonp',
    data: {
        v: "1.0",
        langpair: "fr|en",
        q: text
    },
    success: function(data) {
        var translated = data.responseData.translatedText;
        alert('Translation Complete: ' + translated);
    }
});

См. ДЕМО .

0 голосов
/ 04 марта 2011

Фактически, в API GreaseMonkey есть функция, которая разрешает междоменный запрос без каких-либо специальных параметров [зеркало] .

Использование этого заставило скрипт работать мгновенно.

0 голосов
/ 01 марта 2011

Я бы попробовал использовать полный номер .ajax() вместо короткого кода .getJSON()

var apiurl = 'https://ajax.googleapis.com/ajax/services/language/translate?v=1.0&langpair=fr%7Cen&q=';
$.ajax({
    url: apiurl+encodeURIComponent(text),
    dataType: 'jsonp',
    success: function(data) {
        alert('Translation Complete');
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert("Response text: "+XMLHttpRequest.responseText);
        alert("Status returned: "+textStatus);
        alert("Error thrown: "+errorThrown);
    }
});

$.ajaxStart(function() {
    alert("Ajax Started");
});

$.ajaxStop(function() {
    alert("Ajax Finished");
});

jQuery даст уникальное имя обратного вызова, подобное тому, что вы видели jsonp1298988446807 , оно также определит функцию, чтобы вы могли использовать обычные .ajax() успехи / неудачи / полные обратные вызовы.

См. Пример здесь

Есть еще один немного более динамичный пример: здесь (перевод с английского на французский вместо кода выше, который делает французский на английский)

...