2010-12-21 42 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); 
      } 
      }); 
     }); 
     }); 
}