让我们从代码开始:
function PopupDrop(n) { // function to trigger on click
for (var i=0; i<Popups.length; i++) {
if (($(Popups[i]['w']).css('display') != 'none') && (n != Popups[i]['w'])) {
$(Popups[i]['w']).stop(true,true).slideUp(150);
}
// Poping actual popup
if ($(n).css('display') == 'none') $(n).slideDown(150);
else $(n).slideUp(150);
}
var Popups = [ // Array of ID which we click, and ID's which we send to click trigger function
{c:'#Payment-Selection',w:'#Cards-Popup'},
{c:'#Drop-SY',w:'#Start-Years'},
{c:'#Drop-SM',w:'#Start-Months'}];
function ActivatePopups() { // Defining click events function
for (var i=0; i<Popups.length; i++) {
var Wt = Popups[i]['w'];
$(Popups[i]['c']).click(function() {
PopupDrop(Wt); console.log(Wt);
});
console.log('On click here: '+Popups[i]['c']+' do this:'+Popups[i]['w']); }
}
ActivatePopups();
Basicaly我正在做自定义选择框,当其他人滑下时必须滑动。这里的问题是Fuinction ActivatePopups控制台会记录它应该是什么样的,但是当我点击不同的定义元素(例如#Payment-Selection,#Drop-Sy ......)时,点击不会触发下拉列表和控制台。日志在所有点击中显示相同的ID ...如果我定义没有for循环的点击,例如。 $('#Payment-Selection')。点击(function(){PopupDrop('#Cards-Popup');}); 它作为魅力......但是因为我有很多differend ID我想用for循环缩短代码。
任何想法为什么会发生?
答案 0 :(得分:1)
我使用回调函数修复它:
function PopupCallBack(x) {
return function (e) {
PopupDrop(x);
};
}
function ActivatePopups() {
for (var i=0; i<Popups.length; i++) { var Wt = Popups[i]['w']; $(Popups[i]['c']).click(PopupCallBack(Wt));
console.log('On click here: '+Popups[i]['c']+' do this:'+Popups[i]['w']); }
}
有关问题的更多信息:Closures: Line by Line explanation of "Javascript: Good Parts" example?
感谢Tomasz Kowalczyk的回答
答案 1 :(得分:0)
可以通过多种方式解决此问题。您可以使用闭包,或将Popups
变量设为对象(具有键值对,如var Popups = {'Payment-Selection':'Cards-Popup',...
),但需要对代码进行最少修改的解决方案是使用自定义属性,像这样:
$(Popups[i]['c']).attr('Wt', Popups[i]['w']).click(function () {
var Wt = this.getAttribute('Wt');
PopupDrop(Wt);
console.log(Wt);
});
答案 2 :(得分:0)
也许这对您有用:http://jsfiddle.net/5vWA4/
我以不同的方式实现它,但imho更简单。
function ActivatePopups() {
$('.popup-activator').click(function(){
console.log($(this).data('w'));
});
}