2013-11-01 47 views
0

说我有两个图像和两个div。

<html> 
    <body> 
     <img id="div0image" class='divImages' alt="" src="../images/div0image.png" /> 
     <img id="div1image" class='divImages' alt="" src="../images/div1image.png" /> 

     <div id="div0" class='divs'></div> 
     <div id="div1" class='divs'></div> 
    </body> 
</html> 

假设CSS是这样的

#div0, #div1, #div0image, #div1image { 
    width: 200px; 
    width: 200px; 
} 

现在,说我有这样的

function somethingIsClicked(thisParameter) { //thisParameter needs to be a $(this) object 
    var thisID = $(this).attr('id'); //$(this) should refer to the object passed in the parameter (thisParameter) 

    $(this).addClass('checkIfThisClassIsAdded'); 
    alert('works!'); 
} 

然后一个JavaScript函数假设我有这两个功能

$('.divs').click(function() { 
    somethingIsClicked($(this)); 
}); 

$('.divImages').click(function() { 
    thisID = $(this).attr('id'); //div0image 
    thisDivsID = thisID.slice(0,4); //div0 
    $('#' + thisDivsID).each(function() { 
     somethingIsClicked($(this)); 
    }); 

是否有正确的方法来传递,然后接收$(this)作为参数,然后引用$(this)作为参数的函数中的$(this)对象?

+1

P.S. '#div0,div1,div0image,div1image'应该是'#div0,#div1,#div0image,#div1image'。 –

回答

1

你有两个选择:

使用参数

$('.divImages').click(function() { 
    thisID = $(this).attr('id'); //div0image 
    thisDivsID = thisID.slice(0,4); //div0 
    $('#' + thisDivsID).each(function() { 
     somethingIsClicked($(this)); 
    }); 

$('.divs').click(function() { 
    somethingIsClicked($(this)); 
}); 

function somethingIsClicked(element) { 
    var thisID = element.attr('id); 
    element.addClass('checkIfThisClassIsAdded'); 
    alert('works!'); 
} 

或者使用call改变功能的情况下:

$('.divImages').click(function() { 
    thisID = $(this).attr('id'); //div0image 
    thisDivsID = thisID.slice(0,4); //div0 
    $('#' + thisDivsID).each(function() { 
     somethingIsClicked.call(this); 
    }); 

$('.divs').click(function() { 
    somethingIsClicked.call(this); 
}); 

function somethingIsClicked() { 
    var thisID = $(this).attr('id); 
    $(this).addClass('checkIfThisClassIsAdded'); 
    alert('works!'); 
} 
4

是的,请使用.call

somethingIsClicked.call(this) 

您可以选择其他参数传递给它,如事件对象:

$('.divs').click(function(event) { 
    somethingIsClicked.call(this,event); 
}); 

或者,如果你有一组参数,。适用的工作方式相同。

$('.divs').click(function(event) { 
    somethingIsClicked.apply(this,[event,{foo:"Hello World!"}]); 
}); 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

不过请注意,在这种简化的情况下,它会更有意义做

$('.divs').click(somethingIsClicked); 
+1

好吧,不要做“somethingIsClicked($(this));”,我应该做“somethingIsClicked()。call(this);”然后我的'somethingIsClicked'函数只是“function somethingIsClicked(){var thisID = $(this).attr('id');}”没有参数,这将工作?好吧,有道理。谢谢。 – user2719875

+2

这是正确的。 –

+2

您输入错误@ user2719875。正如凯文上面所示,“somethingIsClicked.call(this);'not'sysIsClicked()。call(this)',否则是! –

1

您可以使用.call(thisParamter, arg1, arg2, arg3 ...).apply(thisParamter, [arg1, arg2, ... ])

$('.divs').click(function() { 
    somethingIsClicked.call(this); 
}); 

如果你没有其他的参数传递就可以直接使用:

$('.divs').click(somethingIsClicked) 
1

你可以使用$.proxy

$('#' + thisDivsID).each(function() { 
    $.proxy(somethingIsClicked, this)(); 
}); 

你接收功能就那么不需要任何参数,因为this将在与each()区块相同的范围内:

function somethingIsClicked() { 
    var thisID = $(this).attr('id');  
    $(this).addClass('checkIfThisClassIsAdded'); 
    alert('works!'); 
} 

Example fiddle