如何在bing api回调中添加自定义回调javascript参数?

时间:2011-11-22 15:25:27

标签: javascript callback bing-api

bing V2 javascript api需要回调才能工作。使用jQuery动态添加脚本块(忽略全局命名空间的污染):

function translate(text) {
    var txt = "text=" + text;
    var lang = "&to=fr";
    var appId = "&appid=apikey"; // Add your AppId here
    var func = "&oncomplete=window.translated";

    $("<script><\/script>")
                .attr("src", "http://api.microsofttranslator.com/V2/ajax.svc/Translate?" + txt + lang + appId + func)
                .appendTo("HEAD");
}

然后在多个元素上使用click事件来触发翻译:

$(document).ready(function () {

    $('a').click(function () {
        var tr = $(this).parent().parent();
        var txtin = tr.find('.in').text();
        var out = tr.find('.out'); // would like translation inserted here
        translate(txtin);
        return false;
    });

});

最后是api所需的回调:

function translated(text) {
    $("#translation").text(text);
}

我想指定接收翻译文本的不同元素,具体取决于点击了什么元素来翻译 - 但是使用上面的方法我不能将任何额外的参数传递给bing,然后在回调中返回

如何重写此选项以允许在第1行中单击el以将转换放入row1并单击第2行中的el以将转换放入第2行?即在我的点击事件中使用分配给'out'的元素。

1 个答案:

答案 0 :(得分:1)

回调方法不支持状态对象,因此您需要在某个全局位置跟踪对象。我已经实现了一个队列模型来帮助你实现它

  1. 在全局变量

    中添加队列定义
    var queue = new Array();
    
  2. 在调用服务

    之前将'out'对象添加到它
    $('a').click(function () { 
        var tr = $(this).parent().parent(); 
        var txtin = tr.find('.in').text(); 
        var out = tr.find('.out'); // would like translation inserted here 
        //Here it goes
        queue.push(out);
        ////////////////
        translate(txtin); 
        return false; 
    });    
    
  3. 将对象的索引附加到文本中,它将返回给您,因为该服务不会转换数字。如果您不是一次进行多个转换,则可以跳过添加索引,这只是为了在一些服务调用比其他服务调用慢的情况下授予您获得正确的对象。

    function translate(text) {
    
        //Here it goes             
        var txt = "text=" + text + " ___" + (queue.length - 1);     
        ////////////////    
        var lang = "&to=fr";             
        //...no more changes here   
    }
    
  4. 最后在回调方法中提取对象,并从已翻译的文本中删除附加的索引和拆分器。

    function translated(text) {
    
        if (queue.length > 0) {
            var splts = text.split(' ___')
            var indx = splts[splts.length - 1];
            var out = queue[indx];
            //remove the out object from the queue
            queue.slice(indx, indx + 1);
            //remove the index number from the end of the word
            text = text.substr(0, text.lastIndexOf(indx) - 4);
            out.text(text);
        }
    }