代码简化

时间:2011-04-20 20:38:03

标签: jquery map highlight

我正在使用jQuery maphighlight插件和美国地图。

我有几个状态太小而无法将缩写放在它们上面,所以我必须将它们放在一边。

我已经做过的是当用户在缩位上悬停时,相应的状态会突出显示。这很好。

我遇到的“问题”是,尽管代码有效,但它看起来过于重复,我试图简化/优化它,但我得到的错误是所有缩写突出显示一个单独的状态而不是相应的一个。

这是我到目前为止的代码:

$(function() {
    $('.map').maphilight();

    $('#ma-link').mouseover(function(e) {
        $('#ma').mouseover();       
        }).mouseout(function(e) {
            $('#ma').mouseout();
        }).click(function(e) { e.preventDefault(); });

    $('#ri-link').mouseover(function(e) {
        $('#ri').mouseover();       
        }).mouseout(function(e) {
            $('#ri').mouseout();
        }).click(function(e) { e.preventDefault(); });
    $('#ct-link').mouseover(function(e) {
        $('#ct').mouseover();       
        }).mouseout(function(e) {
            $('#ct').mouseout();
        }).click(function(e) { e.preventDefault(); });

    $('#nj-link').mouseover(function(e) {
        $('#nj').mouseover();       
        }).mouseout(function(e) {
            $('#nj').mouseout();
        }).click(function(e) { e.preventDefault(); });

    $('#de-link').mouseover(function(e) {
        $('#de').mouseover();       
        }).mouseout(function(e) {
            $('#de').mouseout();
        }).click(function(e) { e.preventDefault(); });

    $('#md-link').mouseover(function(e) {
        $('#md').mouseover();       
        }).mouseout(function(e) {
            $('#md').mouseout();
        }).click(function(e) { e.preventDefault(); });

    });

有没有办法简化这个?

对此的任何帮助将不胜感激。

感谢。

6 个答案:

答案 0 :(得分:2)

不需要更改您的HTML。只需用这个替换你的块。

$(function() {
    $('.map').maphilight();

    $('[id$="-link"]').each(function() {
        var child = $("#" + this.id.substr(0,2));
        $(this).mouseover(function() {
             child.mouseover();
        }).mouseout(function() {
             child.mouseout();
        }).click(function(e) { e.preventDefault(); });
    });
});

答案 1 :(得分:1)

添加共享类,例如'mapItem',并将内容附加到this对象。

$('.mapItem').mouseover(function(e) {
        $(this).find(selector).mouseover();       
    }).mouseout(function(e) {
        $(this).find(selector).mouseout();
    }).click(function(e) { e.preventDefault(); });

答案 2 :(得分:1)

你可以提取到jQuery插件:

(function($) {

    $.fn.bindMice = function(relevantSelector) {
        return this
            .mouseover(function(e) {
                $(relevantSelector).mouseover();       
            })
            .mouseout(function(e) {
                $(relevantSelector).mouseout();
            })
            .click(function(e) { e.preventDefault(); });
    });

})(jQuery);

然后您可以这样使用:

$('#ma-link').bindMice('#ma');
$('#ri-link').bindMice('#ri'); // and so on..

这只是一种方式,有很多种。

答案 3 :(得分:0)

只需创建一个函数并传递状态id,简单:

function hoverState(state)
    $('#'+state+'-link').mouseover(function(e) {
        $('#'+state).mouseover();       
        }).mouseout(function(e) {
            $('#'+state).mouseout();
        }).click(function(e) { e.preventDefault(); });
}

答案 4 :(得分:0)

如果你把课程放在太小的状态上,你可以这样做:

$('.too_small').mouseover(function(e) {
        $(this).find('.abbr').mouseover();       
        }).mouseout(function(e) {
           $(this).find('.abbr').mouseout();
        }).click(function(e) { e.preventDefault(); });

其中.too_small与$('#ri-link')位于同一元素上,.abbr位于$('#ri-link')等元素上

答案 5 :(得分:0)

一般来说,更简单的方法是将rel属性分配给相关代码,然后只使用一个覆盖分配:

$('.link').mouseover(function(e)
{
    id = $(this).attr('rel');

    $('#' + id).mouseover();
}).mouseout(function(e) 
{
    id = $(this).attr('rel');

    $('#' + id).mouseout();
}).click(function(e) 
{ 
    e.preventDefault(); 
});