2011-11-22 26 views
0

bing V2 javascript api需要回调才能工作。使用jQuery添加脚本块动态(忽略全局命名空间的污染):你如何添加一个自定义回调javascript param到bing api回调?

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将翻译放入第1行并点击第2行中的第el将翻译放入第2行?即在我的点击事件中使用分配给'out'的元素。

回答

1

该回调方法不支持状态对象,因此您需要在某个全局位置跟踪对象。我只是调用服务

之前已经实现了一个排队模型来帮助你把它

  1. 加入队列定义的全局变量

    var queue = new Array(); 
    
  2. 你的“出”对象添加到它

    $('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); 
        } 
    } 
    
+0

感谢,这为我工作 – SeanR