2012-04-11 13 views
1

私は、私はこのコードが示すことを願っています閉鎖やコールバック、いくつかの問題を抱えていhttp://www.microsofttranslator.com/dev/JSONPコールバックとクロージャ/範囲

からマイクロソフトの翻訳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"); 

さて、私の応答は、コールバックがexeファイルにする機会があった前original変数は、上書きされ

Hola es 
Hola fr 

として戻ってきます可愛い。あなたがしているので、それはだ、私はjQueryとときを(使用せずにこれを行うにしようとしています

Hola es 
Au revoir fr 

おかげ

+0

は、あなたが最初の変数にURLを構成し、だけにしてel.srcにその値を代入しようとしたことがありますか? –

答えて

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

パーフェクト、理解しやすい完全な答え - ありがとう –

0

:それはのようなものが表示されるように、私はこの問題を回避するにはどうすればよい

"translate"を呼び出すときにグローバルな "translateComplete"関数を再割り当てします。 "window"の単一のプロパティにバインドされた関数は1つしかないでしょう。

(「元の」変数が変更されないである。それはちょうど最初の関数ことは、「金Revoir」と、ごみを収集するために待っている間にあてもなく周りに浮いているように完全にオフにキャストされる)