【问题标题】:jQuery, JSON-P and Google Translation : Various errorsjQuery、JSON-P 和谷歌翻译:各种错误
【发布时间】:2014-09-13 01:03:53
【问题描述】:

我目前正在开发一个 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,因为这是一个跨域请求。为此,我在 URL 的末尾添加了 &callback=? 字符串。 getJSON 回调未触发(但响应数据正确),我在 Firebug 控制台中收到此错误:

jsonp1298988446807 未定义

  • 如果我改用&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 桥,完整的演练here(来自this post),但这显示了完全相同的错误比 Scoobler 的剧本

【问题讨论】:

    标签: jquery jsonp google-translate


    【解决方案1】:

    也许试试这个 - 这是.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);
        }
    });
    

    DEMO

    【讨论】:

      【解决方案2】:

      我会尝试使用完全限定的 .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()success/failure/complete 回调钩子。

      查看示例here

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

      【讨论】:

      • 我认为您的想法是正确的,但请求不会启动。我会检查我的代码是否有错误
      • @Squ36 如果您从上面复制并粘贴了代码,则在成功回调结束时缺少} - 抱歉!我还包括了错误回调,如果它不起作用,它可能有助于阐明一些问题。 .ajaxStart().ajaxStop() 这两个附加组件应该会在任何 .ajax() 函数启动和停止时提醒您。
      • 我试过你的代码,它应该可以工作,但它没有......我会更新我的 OP 以显示错误。
      【解决方案3】:

      其实GreaseMonkey API中有一个函数,允许跨域请求without any special parameters[mirror]

      使用它使脚本立即运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 2018-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-26
        相关资源
        最近更新 更多