我需要jQuery中$(this)上下文的帮助

时间:2009-04-26 05:06:14

标签: jquery

我需要在此代码块中提供一些帮助:

options.imgs.click(function() {
            var allImgs = $("#big img");
            $("#big img").each(function(n) {
                this.index = n;
            })
            animateImage(allImgs);
        })

    };

    function animateImage(images) {
        for(var i = 0; i < images.length; i++) {
            if (images[i].index == 0) {
                alert($(this).index)
            }
        }
    }

我的问题是:

$(this).effect('scale', { percent: 200 }, 1000)

不工作。我希望该语句引用索引为0的图像,并将其缩放200%。但是$(this)并不是指第一张图像。

3 个答案:

答案 0 :(得分:2)

只要您调用您的函数,您的“”变量就会更改:

function test() {
  alert(this); // this will be the window object
}
$('p b').click(function() {
   alert(this); // this will be the bold element object
   test();
});

例如,在这个页面上运行(使用firebug),我可以点击顶部右侧的“询问”和“已查看”项目(它们是粗体)...你得到的是一个来自测试函数的警报,其中是窗口对象,粗体元素,因为它在事件处理程序中。

要解决此问题,只需通过以下函数传递您想要处理的对象:

options.imgs.click(function() {
            var allImgs = $("#big img");
            $("#big img").each(function(n) {
                    this.index = n;
            })
            animateImage(allImgs, this);
    })

};

function animateImage(images, img) {
    for(var i = 0; i < images.length; i++) {
            if (images[i].index == 0) {
                    alert($(img).index)
            }
    }
}

答案 1 :(得分:0)

请参阅Call function with “this”

基本上你想要的是替换

animateImage(allImgs);

animateImage.call(this, allImgs);

您可以将代码重构为此(或类似的东西):

options.imgs.click(function() {
    var allImgs = $("#big img");
    allImgs.each(function(n) {
        this.index = n;
    });

    allImgs.get(0).effect('scale', { percent: 200 }, 1000);
});

您也可以在each参数n == 0内开始效果。 (我在我的示例中没有这样做,因为它与您拥有的代码不完全相同(忽略丑陋的并发问题))。

答案 2 :(得分:0)

当您在单击调用内部时,第一个参数(“this”)是您单击的DOM元素。您的DOM元素是否具有“索引”属性?

我还建议你使用“对象转储”功能(例如:http://weblogs.asp.net/skillet/archive/2006/03/23/440940.aspx)。用法类似于:

$("a").click( function(){ 
   alert( object_dump( this ) ) 
});

(注意object_dump()函数返回一个字符串,你需要“alert()”它或用它做其他事情。)