СУХОЕ программирование с помощью jquery
Размещение как JQuery новичок. Я уверен, что должен быть способ сжать приведенный ниже код в СУХОЙ манере. По сути, это просто отображение / скрытие, которое применяется к нескольким элементам на странице, причем все они используют один и тот же шаблон и соглашения об именах:
$("#homelink1").hover(
function() { $("#poptext1").show(); },
function() { $("#poptext1").hide(); }
);
$("#homelink2").hover(
function() { $("#poptext2").show(); },
function() { $("#poptext2").hide(); }
);
...
Я застрял в том, как преобразовать это в функцию с переданными параметрами, чтобы я мог просто передать целое число (1 или 2) и сделать так, чтобы функция оценивала остальное, например
$("#homelink" + param).hover
5 ответов
Как насчет этого:
function setHover( param ){
$("#homelink" + param).hover(
function() { $("#poptext" + param).show(); },
function() { $("#poptext" + param).hide(); }
);
}
Являются ли элементы #poptext дочерними по отношению к их #homelink? Если это так, вы можете создать класс "homelink" и класс "poptext", а затем сделать что-то вроде следующего:
$(".homelink .poptext").hover(
function() { $(this).show(); },
function() { $(this).hide(); }
});
В качестве примечания, большинство функций в jQuery работают так же хорошо с коллекциями объектов, как и с одним. В этом случае, хотя $(". Homelink .poptext") возвращает коллекцию объектов, каждый из них по отдельности ассоциируется с обработчиком mouseover и mouseout с помощью hover().
Вы можете использовать регулярное выражение, чтобы получить число из homelink
что зависло, затем переключите связанный poptext
,
Попробуйте это: http://jsfiddle.net/xFR3s/
$("#homelink1,#homelink2").hover( function() {
$("#poptext" + this.id.match(/\d+$/)[0]).toggle();
});
Вы можете сделать его короче с помощью селектора "начинается с" для homelink
элементы. Менее эффективно, но работает только один раз при загрузке DOM, так что, возможно, все в порядке.
Попробуйте это: http://jsfiddle.net/xFR3s/1/
$("[id^=homelink]").hover( function() {
$("#poptext" + this.id.match(/\d+$/)[0]).toggle();
});
РЕДАКТИРОВАТЬ: Если вы не хотите, чтобы это интерпретировалось на лету, я думаю, я бы сделал что-то вроде этого:
Попробуйте это: http://jsfiddle.net/xFR3s/2/
$("[id^=homelink]").each(function() {
var num = this.id.match(/\d+$/)[0];
$(this).hover( function() {
$("#poptext" + num).toggle();
});
});
или это:
Попробуйте это: http://jsfiddle.net/xFR3s/3/
$("[id^=homelink]").each( function() {
$(this).hover( setUpHover(this.id.match(/\d+$/)[0]) );
});
function setUpHover(num) {
return function() {
$("#poptext" + num).toggle();
};
}
Я, вероятно, попробую что-то вроде следующего:
$('.homelink').bind('hover', function(){
$('.poptext', this).toggleClass('hide');
});
# and some CSS
.hide {
display: none
}
Свяжите событие hover с общим именем класса, а не пытайтесь выяснить, как хакерски связать его с #homelink{somenumber} и #poptext{somenumber}. Держите свои идентификаторы на месте, если необходимо (например, для оформления хуков), но упростите вещи и используйте классы.
Почему бы вам не создать элемент с классом, чтобы вы могли сделать это так:
jQuery('.homelink').each(function() {
var me = jQuery(this);
var target = me.find('.poptext'); //if the target is 'poptext' class
me.hover(
function() {
target.show();
},
function() {
target.hide();
}
);
});