【问题标题】:Code simplification代码简化
【发布时间】:2011-08-09 19:54:15
【问题描述】:

我正在使用带有美国地图的 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(); });

    });

有办法简化吗?

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

谢谢。

【问题讨论】:

  • 你能把这背后的一些 HTML 也贴出来吗?

标签: jquery map highlight


【解决方案1】:

无需更改您的 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(); });
    });
});

【讨论】:

  • Raynos,您的解决方案也很有效。我实际上采用了您的解决方案,因为它为我节省了一步。我需要做的就是将相应的 id 添加到链接和应该触发的元素中,您的脚本会处理这些功能。非常感谢。
【解决方案2】:

添加一个共享类,如“mapItem”,并将内容附加到this 对象。

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

【讨论】:

  • 这个应该是最好和最简单的解决方案,但不幸的是它没有用。不过还是谢谢 Zirak。
  • 好吧,我假设我应该将类“mapItem”添加到触发状态效果的侧链接,例如“#ma-link”。我这样做了,但没有用。因此,我从这些链接中删除了该类并将其添加到实际状态中,例如“#ma”,但它也不起作用。
  • 你是对的 Zirak,它确实有效。但是,我的 HTML 结构与您的不同,因此我必须对其进行更改才能使其正常工作。尽管如此,对于类似于您的示例的未来结构,这是一个非常好的解决方案。会记住的。非常感谢您的帮助。
【解决方案3】:

您可以提取到一个 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..

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

【讨论】:

  • 在尝试了所有解决方案之后,您的解决方案最适合 Eli。非常感谢您的帮助。
  • 我决定使用 Raynos 解决方案,因为它省去了添加状态列表的步骤。再次感谢您。
【解决方案4】:

只需制作一个函数并传递状态ID,很简单:

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

【讨论】:

  • Jakub,我的代码检查员说第 2 行有语法错误。谢谢。
【解决方案5】:

如果你在太小的州设置一个类,你可以这样做:

$('.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') 等元素上

【讨论】:

  • locrizak,你的意思是像 $('#ri') 这样的元素上的 .abbr?我试过了,但也没有用。不过还是谢谢。
【解决方案6】:

一般来说,更简单的方法是将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(); 
});

【讨论】:

  • 没有真正关注这个。不过还是谢谢。
猜你喜欢
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多