1

我目前正在开发一个 GreaseMonkey 用户脚本,以提供对 Intranet 应用程序中某些表单字段的直接翻译。

一切正常,直到我使用以下代码调用 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 未定义

  • 如果我改用 a &callback=foo,FF 似乎不喜欢它,因为我的请求不再是 POST 请求,它没有完成但它显示(在网络面板中)

    OPTIONS request_url 405 Method Not Allowed

  • 如果我创建一个自定义函数以指定为回调,它也不起作用,因为该函数没有被调用(它只包含一个警报以检查它是否有效)。

如果有人知道为什么这不起作用,请帮助我,因为我差点把头撞到墙上(也许会有所帮助^^)。

谢谢。


编辑:感谢 Scoobler,我相信我已经走得更远了。/ignore使用他的代码,我已经设法从我的脚本中得到了更多的东西

该请求未出现在 Firebug 的网络选项卡中,并且警报给出的响应是:

响应文本:未定义

返回状态:错误

抛出的错误:抛出的错误:[异常...“组件不可用”nsresult:“0x80040111(NS_ERROR_NOT_AVAILABLE)”位置:“JS 框架 :: file:///C:/Documents%20and%20Settings/username/Application% 20Data/Mozilla/Firefox/Profiles/jmbr7ut9.default/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee​​082ba24781%7D/components/greasemonkey.js :: 匿名 :: line 396" data: no]

与此同时,我一直在自己研究,遇到了一个跨域请求的 jQuery/GreaseMonkey 桥,这里有一个完整的演练(来自这篇文章),但这显示的错误与 Scoobler 的脚本完全相同

4

3 回答 3

2

也许试试这个 - 这是一个更冗长的语法,.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);
    }
});

演示

于 2011-03-01T15:18:02.317 回答
0

我会尝试使用完全限定的.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()成功/失败/完成回调挂钩。

在此处查看示例

还有另一个稍微动态的例子:here (从英语翻译成法语,而不是上面将法语翻译成英语的代码)

于 2011-03-01T15:05:20.027 回答
0

实际上,GreaseMonkey API 中有一个功能,允许跨域请求,无需任何特殊参数 [mirror]

使用它使脚本立即工作。

于 2011-03-04T08:58:13.410 回答