Это может быть улучшено в дальнейшем, но что-то вроде этого будет работать:
$("#Table1 tr").each(function(i) {
$(this).find("img").each(function(j) {
this.id = "row" + i + "Seat" + j;
$(this).hover(function() { this.src = "images/taken.gif"; },
function() { this.src = "images/available.gif"; })
.click(function() {
var img = this;
this.src = "images/mine.gif";
$(this).unbind("mouseenter mouseleave");
$("#myTickets").html(function(i, h) { return h + img.id; });
});
});
});
Использование .each()
и индекс, который он передает в качестве первого параметра для обратного вызова, сокращает егобит (вам не нужны ваши собственные i
и j
, они уже есть), остальное - просто преобразование jQuery, например .hover()
для входа / выхода мыши и .unbind()
, чтобы удалить эти обработчики позже.
Вот немного более многословно, но намного более эффективная версия с использованием .delegate()
:
$("#Table1 tr").each(function(i) {
$(this).find("img").each(function(j) {
this.id = "row" + i + "Seat" + j;
});
});
$("#Table1").delegate("tr img", "click", function() {
var img = $(this).addClass("mine").add("src", "images/mine.gif");
$("#myTickets").html(function(i, h) { return h + img.attr("id"); });
}).delegate("tr img:not(.mine)", "mouseenter", function() {
this.src = "images/taken.gif";
}).delegate("tr img:not(.mine)", "mouseleave", function() {
this.src = "images/available.gif";
});
Это прикрепляет только 3 обработчика к <table>
и прослушивает всплывающие события, а не подключает 3 обработчика на изображение , так что это намного дешевле со стороны загрузки страницы,и и бесконечно малая разница на стороне времени выполнения.