将$(this)选择器传递给嵌套函数

时间:2010-12-21 16:39:18

标签: javascript jquery

所以我有一个脚本,需要通过类P的父DIV内的每个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()回复NULL并且我无法更改当前元素html以便将其更改为新的翻译文本。

所以我想我的问题是: 如何将当前选定的元素传递给嵌套函数?

由于

4 个答案:

答案 0 :(得分: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
            }
          });
        });
      });
}

答案 1 :(得分: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);
        }
      });
    });
  });
}

答案 2 :(得分:1)

在适当的上下文中保存'this'的记录 - 否则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); 
            }
          });
        });
      });
}

答案 3 :(得分: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); 
            }
          });
        });
      });
}