Как добавить пользовательский параметр JavaScript обратного вызова в обратный вызов Bing API? - PullRequest
0 голосов
/ 22 ноября 2011

API bing V2 javascript требует обратного вызова для работы.Использование 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, которые затем будут возвращены в обратном вызове.

Как мне переписать это, чтобы разрешить щелчок на el в строке1, чтобы поместить перевод в row1, и щелчок на el в строке2, чтобы поместитьперевод в row2?то есть, используя элемент, присвоенный 'out' в моем событии click.

1 Ответ

1 голос
/ 23 ноября 2011

Метод обратного вызова не поддерживает объект состояния, поэтому вам нужно отслеживать ваши объекты в каком-то глобальном месте. Я реализовал модель очереди, чтобы помочь вам сделать это

  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);
        }
    }
    
...