1

我是 jQuery 的新手,所以如果我走错了方向,请告诉我。

我有一个将“jQuery对象”作为参数的函数,如下所示:

function protectImageFromRightClick(image_object) {
 // yeah ok i know this is only a dumb protection!!

    image_object.bind('contextmenu', function(e) {
        return false;
    }); 

    image_object.mousedown(function(){
        return false; // for prevent drag
    });
}

我想在选择时调用它。我试图用以下方式调用它each()

$( ".photo" ).each(function (i) {
    protect(this);
});

this似乎指的是一个没有任何.bind()方法的 DOM 对象。我不太明白如何解决这个问题。有什么想法吗?

面对的是我在代码的其他地方使用了该功能,因此解决方案如下:

$('some selection').bind()

不是一个好的解决方案,因为这样我只会编写代码重复..

4

5 回答 5

6

使用 JQuery,您必须使用$(this)而不是this关键字。

于 2013-02-17T23:52:35.720 回答
2

当您使用选择器调用 jQuery 函数时,它会执行几个任务。首先,它构造 jQuery 对象。然后,它将 jQuery API 附加到新构造的对象上。然后,它构造一个匹配选择器的 DOM 元素数组。

当您each在 jQuery 对象上使用时,或者当您在回调闭包中时,this关键字将引用 jQuery 正在处理的当前 DOM 元素。

简而言之,

$( ".photo" ).each(function (i) {
    //this == the current element with class="photo"
    //$(this) == a jquery object instanced with an 
    //           array of elements containing only the 
    //           current element with class="photo" that 
    //           each is working with
});
于 2013-02-17T23:59:08.040 回答
1

如果您每次迭代,那么每次迭代都会调用回调,参数 (i) 是您的元素。

爪哇:

Vector<Integer> photo = new Vector<>();
photo.add(2); //ok very constructed..
for(int v:photo){
 // here v is your iteration variable
}

JS:

$( ".photo" ).each(function (k,v) {
    protect(v);
});

但是, v 现在是纯 js,而不是 jQuery,因此您可以使用:

$( ".photo" ).each(function (k,v) {
    protect($(v));
});

如果你想知道这里的 k 是什么:k 代表 key,v 代表 value。在一个数组中,这可能很简单,k 是 0,1,2,... 但这也适用于像这样的对象{"k1":"v1","k2":"v2"}

于 2013-02-17T23:56:14.597 回答
0

您可以随时检查函数中的 jQuery 对象并在必要时进行转换,例如

if (!image_object instanceof $) {
    image_object = $(image_object);
}
于 2013-02-17T23:55:33.007 回答
0

.each方法设置this为实际的 DOM 对象,您可以将该 DOM 对象包装成另一个 jQuery 对象$()

$(".photo").each(function () {
    protect($(this));
});
于 2013-02-17T23:57:22.923 回答