2011-11-22 25 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