2012-05-02 5 views
-1

Есть ли способ сократить код. Мне нужно добавить еще 15 функций, которые все делают одно и то же.Функции соединения вместе - код чистки

$(document).ready(function() { 
    $('.map-highligh').maphilight({ 

    }); 

    //north roll over 
    $('#hilightlink').mouseover(function(e) { 
     $('#north').mouseover(); 
    }).mouseout(function(e) { 
     $('#north').mouseout(); 
    }).click(function(e) { e.preventDefault(); }); 

    //Wellington roll over 
    $('#hilightlink-wel').mouseover(function(e) { 
     $('#wellington').mouseover(); 
    }).mouseout(function(e) { 
     $('#wellington').mouseout(); 
    }).click(function(e) { e.preventDefault(); }); 

}); 
+0

Для того, чтобы сделать код чистым, нам нужно увидеть ваш HTML, чтобы мы могли видеть, есть ли отношения DOM или имена классов, которые мы можем предложить или использовать. – jfriend00

ответ

0

Вы можете пересмотреть свой пользовательский интерфейс для этого, но вы могли бы сделать что-то вроде этого:

function mouseBind(bound, affected) { 
    $('#' + bound) 
     .mouseover(function() { 
     $('#' + affected).mouseover(); 
     }) 
     .mouseout(function() { 
     $('#' + affected).mouseout(); 
     }) 
     .click(function (e) { e.preventDefault(); }) 
    ; 
} 

mouseBind('hilightlink', 'north'); 
mouseBind('hilightlink-wel', 'wellington'); 
0

Вы можете использовать эту функцию без изменений в HTML-коде:

function bind_block(button, element) { 
    button.mouseover(function(e) { 
    element.mouseover(); 
    }).mouseout(function(e) { 
    element.mouseout(); 
    }).click(function(e) { e.preventDefault(); }); 
} 

bind_block($('#hilightlink'), $('#north')); 
bind_block($('#hilightlink-wel'), $('#wellington')); 

Если вам нужно связать эти события для 15 разных элементов, для этого лучше использовать классы CSS. Пожалуйста, предоставьте свой HTML-код, чтобы получить дополнительную помощь.

2

Вы можете использовать немного композиции для очистки кода.

function makeTrigger(id, eventName) { 
    return function(e) { 
     $('#' + id).trigger(eventName); 
    }; 
} 

function prevent(e) { 
    e.preventDefault(); 
} 

$('#hilightlink') 
.mouseover(makeTrigger("north", "mouseover")) 
.mouseout(makeTrigger("north", "mouseout")) 
.click(prevent); 
0
$.fn.rollOver = function(selector) { 
    this.on('mouseover mouseout', function(e) { $(selector).trigger(e.type); }); 
    this.on('click', function(e) { e.preventDefault(); }); 
    return this; 
} 
$('#hilightlink').rollOver('#north'); 
$('#hilightlink-wel').rollOver('#wellington'); 
0

Не видя, что DOM отношения, которые мы могли бы использовать, чтобы использовать это на пользу, я бы поместить данные в таблицу и итерацию над столом, так что есть только одна копия кода, и вы можете добавить/удалять/изменять идентификаторы без изменения исполняемого кода:

var hoverItems = [ 
    "highlightlink", "north", 
    "highlightlink-wel", "wellington" 
]; 

for (var i = 0; i < hoverItems.length; i+= 2) { 
    (function(item$) { 
     $("#" + hoverItems[i]).hover(function() { 
      item$.mouseover(); 
     }, function() { 
      item$.mouseout(); 
     }).click(function(e) {e.preventDefault();}); 
    })($(hoverItems[i+1])); 
} 

Или, немного другой способ, с помощью таблицы поиска:

var hoverItems = { 
    "highlightlink": "north", 
    "highlightlink-wel": "wellington" 
}; 

$("#" + Object.keys(hoverItems).join(", #")).hover(function() { 
    $("#" + hoverItems[this.id]).mouseover(); 
}, function() { 
    $("#" + hoverItems[this.id]).mouseout(); 
}).click(function(e) {e.preventDefault();}); 

Этот второй метод требует ES5 или ES5 shim для метода Object.keys().

Чтобы добавить дополнительные элементы с помощью одного из этих методов, просто добавьте больше элементов в таблицу данных - вы не будете писать одну новую строку исполняемого кода.

Смежные вопросы