1

http://www.microsofttranslator.com/dev/から Microsoft Translation API (AJAX バージョン) を使用しています。

クロージャーとコールバックにいくつか問題がありますが、このコードが示すことを願っています:

function translate(original){

    window.translateComplete = function(language) {

        if (language!="en"){
        alert(original +" "+language);
        }   
    }


    var windowsliveid = 'API_KEY_REMOVED';
    var el = document.createElement("script"); 
    el.src = 'http://api.microsofttranslator.com/V2/Ajax.svc/Detect'; 
    el.src += '?oncomplete=translateComplete'; 
    el.src += '&appId=' + windowsliveid; 
    el.src += '&text=' + escape (original); 
    document.getElementsByTagName('head')[0].appendChild (el);

}

translate("Au Revoir"); 
translate("Hola"); 

今、私の応答は次のように返されます

Hola es
Hola fr

コールバックが実行される前に、original変数が上書きされています。

これを回避して、次のように表示するにはどうすればよいですか。

Hola es
Au revoir fr

jQuery と when() を使用せずにこれを実行しようとしています

ありがとう

4

2 に答える 2

3

window. translateComplete参照できる関数は 1 つだけなので、応答ごとに同じコールバック関数を使用しています。したがって、 を呼び出すたびに、クロージャである新しい関数でtranslate上書きされます。window.translateComplete

呼び出しごとに異なる名前で新しいコールバックを作成できます。それがjQueryが行っていることです。

最も単純な形式では:

var i = 0; // some running variable
function translate(original){

    var cb_name = 'cb' + (i++); // create a new name
    window[cb_name]= function(language) {
        delete window[cb_name]; // remove function to not pollute the global scope
        if (language!="en"){
            alert(original +" "+language);
        }   
    }

    var windowsliveid = 'API_KEY_REMOVED';
    var el = document.createElement("script"); 
    el.src = 'http://api.microsofttranslator.com/V2/Ajax.svc/Detect'; 
    el.src += '?oncomplete=' + cb_name; // use the dynamic name instead
    el.src += '&appId=' + windowsliveid; 
    el.src += '&text=' + escape (original); 
    document.getElementsByTagName('head')[0].appendChild (el);
}
于 2012-04-11T14:21:40.030 に答える
0

これは、「translate」を呼び出すときに、グローバルな「translateComplete」関数を再割り当てしているためです。「window」という単一のプロパティにバインドできる関数は 1 つだけですよね?

(「元の」変数は変更されていません。「Au Revoir」を使用した最初の関数が完全にキャストオフされ、ガベージ コレクションが行われるのを待っている間、あてもなく浮かんでいるだけです。)

于 2012-04-11T14:21:04.860 に答える