2012-04-11 10 views
1

Ich bin mit dem Microsoft Translation api (AJAX Version) von http://www.microsofttranslator.com/dev/JSONP Rückrufe und Schließungen/Scope

ich mit Schließungen und Rückrufe einige Probleme habe, die ich diesen Code hoffentlich zeigen:

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"); 

Nun, meine Antwort kommt zurück als

Hola es 
Hola fr 

die original Variable überschrieben wird, bevor der Rückruf eine Chance hatte zu exe niedlich.

Wie kann ich dies vermeiden, so dass es so etwas wie zeigt:

Hola es 
Au revoir fr 

Ich versuche, dies zu tun, ohne die Verwendung von jQuery und wenn()

Dank

+0

Haben Sie versucht, zuerst die URL in einer Variablen zu komponieren, und nur dann seinen Wert zuweisen el.src? –

Antwort

3

Nun, Sie verwenden für jede Antwort die gleiche Callback-Funktion, da sich window. translateComplete nur auf eine Funktion beziehen kann. Jeder Aufruf an translate überschreibt mit einer neuen Funktion, die eine Schließung ist.

Sie könnten für jeden Anruf einen neuen Rückruf mit einem anderen Namen erstellen. Das macht jQuery.

In seiner einfachsten Form:

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

Perfekt, eine vollständige Antwort, die leicht zu verstehen ist - Danke –

0

Es ist, weil du bist Erneutes Zuweisen der globalen Funktion "translateComplete" beim Aufruf von "translate". Es kann nur eine Funktion an diese einzelne Eigenschaft von "window" gebunden sein, oder?

(Die „original“ Variable ist nicht geändert werden, es ist nur, dass die erste Funktion, mit „Au Revoir“, abgeworfen wird völlig ziellos umher zu schweben während des Wartens Müll gesammelt zu werden.)