2010-12-21 43 views
4

因此,我有一個腳本,需要通過父類DIV中的每個P標記,類名稱爲entry-content,並使用google翻譯API翻譯每個標記。

所以,當用戶點擊一個鏈接頁面從英語翻譯成西班牙語此功能運行:

function spanish() { 
$(".entry-content p").each(function(){ 
     var text = $(this).html(); 
     google.language.detect(text, function(result) { 
      google.language.translate(text, "en", "es", function(result) { 
      if (result.translation) { 
       alert($(this).html()); //outputs NULL 
       $(this).html(result.translation); //doesn't work 
      } 
      }); 
     }); 
     }); 
} 

問題是,當iIget到內部功能$(this).html() comesback NULL,我不能夠改變當前元素html以便將其更改爲新的翻譯文本。

所以我想我的問題是: 如何將當前選定元素傳遞到嵌套函數?

感謝

回答

6

你可以將它保存在一個局部變量

this值總是涉及到該函數被調用的上下文。在你的例子中,你將一個函數傳遞給google.language.translate,所以推測它是google.language.translate,它調用了該函數。

但是,如果您存儲$(this)的值爲p時,您將能夠使用回調函數中的該變量。

function spanish() { 
    $(".entry-content p").each(function(){ 
     var $this = $(this); 
     var text = $this.html(); 
     google.language.detect(text, function(result) { 
      google.language.translate(text, "en", "es", function(result) { 
      if (result.translation) { 
       alert($this.html()); //outputs NULL 
       $this.html(result.translation); //doesn't work 
      } 
      }); 
     }); 
     }); 
} 
+0

現在似乎很明顯,謝謝。作爲一個子問題,我可以問爲什麼使用$?什麼是var $ this = $(this)之間的區別?和var this = $(this); – Jamie 2010-12-21 16:52:16

1

這是因爲this在回調的變化情況下,只要保持引用到你想要的元素/對象,像這樣的:在合適的

function spanish() { 
    $(".entry-content p").each(function(){ 
    var text = $(this).html(), self = this; 
    google.language.detect(text, function(result) { 
     google.language.translate(text, "en", "es", function(result) { 
     if (result.translation) { 
      $(self).html(result.translation); 
     } 
     }); 
    }); 
    }); 
} 
1

保存記錄的「本」上下文 - 否則this引用內部函數,而不是父函數。

function spanish() { 
$(".entry-content p").each(function(){ 

     // Save a record of 'this' in the proper context. 
     var me = this; 

     var text = $(this).html(); 
     google.language.detect(text, function(result) { 
      google.language.translate(text, "en", "es", function(result) { 
      if (result.translation) { 
       alert($(me).html()); 
       $(me).html(result.translation); 
      } 
      }); 
     }); 
     }); 
} 
1

我會做這樣的事情。然後研究閉包,瞭解它在做什麼。

function spanish() { 
$(".entry-content p").each(function(){ 
var $this = this; // new 
     var text = $(this).html(); 
     google.language.detect(text, function(result) { 
      google.language.translate(text, "en", "es", function(result) { 
      if (result.translation) { 
       alert($(this).html()); //outputs NULL 
       $this.html(result.translation); 
      } 
      }); 
     }); 
     }); 
}