【问题标题】:jQuery hover showing multiple popups?jQuery悬停显示多个弹出窗口?
【发布时间】:2016-03-08 19:09:04
【问题描述】:

我试图在 jquery 中使用悬停来显示一个弹出窗口,但是当我将鼠标悬停在一个元素上时,它会显示多个弹出窗口,当我从元素上移开鼠标时,弹出窗口仍然存在。这是代码-

var channels = ["freecodecamp", "storbeck", "goldglove", "terakilobyte", "beohoff", "habathcx", "RobotCaleb", "thomasballinger", "noobs2ninjas", "syndicate", "riotgames", "comster404", "test_channel", "cretetion", "sheevergaming", "TR7K", "OgamingSC2", "syndicate"];

$(document).ready(function() {
  getChannels();

});

function getChannels() {
  channels.forEach(function(channel) {
    $.getJSON('https://api.twitch.tv/kraken/streams/' + channel + '?callback=?', function(data) {
      if (data.stream === null) {
        html = '<div class="row"><div class="col-md-3"><a href=https://api.twitch.tv/kraken/channels/' + channel + ' class="result" id="' + channel + '">' + channel + '</a></div><div class="col-md-3">Offline</div></div>';
      } else if (data.stream === undefined) {
        html = '<div class="row"><div class="col-md-3"><a href=https://api.twitch.tv/kraken/channels/' + channel + ' class="result" id="' + channel + '">' + channel + '</a></div><div class="col-md-3">Not Available</div></div>';
      } else {
        html = '<div class="row"><div class="col-md-3"><a href=https://api.twitch.tv/kraken/channels/' + channel + ' class="result" id="' + channel + '">' + channel + '</a></div><div class="col-md-3">Online</div></div>';
      }
      $("#list").append(html);
      $(".result").hover(function() {
        var x = $(this).attr('id');
        var y = "#" + x;
        $.getJSON('https://api.twitch.tv/kraken/channels/' + x + '?callback=?', function(info) {
          console.log(x);
          detail = '<div id="detail"><img src="' + info.logo + '" class="logo"><p>Language:' + info.language + '</p><p>Mature Content:' + info.mature + '</p><p>Title:' + info.game + '-' + info.status + '</p></div>';
          $(y).append(detail);
        });
      }, function() {
        $("#detail").remove();
      });
    });
  });
}

我无法在这里找出问题所在。请帮忙。

【问题讨论】:

  • 你有一个循环内的事件处理程序,它被附加了多次
  • 是的,我试着把它放在循环之外,但在那之后它根本不起作用。
  • 我想我必须为你修好它……再给我一秒钟。

标签: javascript jquery html jquery-hover


【解决方案1】:

您只需添加一次事件处理程序,而不是在一个循环中多次添加。
为此,您可以委托。

我还清理了您的代码,摆脱了 HTML 字符串,并使用 jQuery 创建元素等。

var channels = ["freecodecamp", "storbeck", "goldglove", "terakilobyte", "beohoff", "habathcx", "RobotCaleb", "thomasballinger", "noobs2ninjas", "syndicate", "riotgames", "comster404", "test_channel", "cretetion", "sheevergaming", "TR7K", "OgamingSC2", "syndicate"];

$(document).ready(function() {
    $('#list').on({
        mouseenter: function() {
            var self = this;

            $.getJSON('https://api.twitch.tv/kraken/channels/' + x + '?callback=?', function(info) {
                var detail = $('<div />', {
                        id: 'detail'
                    }),
                    image = $('<img />', {
                        src: info.logo,
                        'class': 'logo'
                    }),
                    p1 = $('<p />', {
                        text: 'Language:' + info.language
                    }),
                    p2 = $('<p />', {
                        text: 'Mature Content:' + info.mature
                    }),
                    p3 = $('<p />', {
                        text: 'Title:' + info.game + '-' + info.status
                    });

                $(self).append(detail.append(image, p1, p2, p3))
            });
        },
        mouseleave: function() {
            $("#detail").remove();
        }
    }, '.result');

    channels.forEach(function(channel) {
        $.getJSON('https://api.twitch.tv/kraken/streams/' + channel + '?callback=?', function(data) {
            var text = data.stream === null ? 'Offline' : data.stream === undefined ? 'Not Available' : 'Online';

            var row = $('<div />', {
                    'class': 'row'
                }),
                col = $('<div />', {
                    'class': 'col-md-3'
                }),
                a = $('<a />', {
                    'class': 'result',
                    href: 'https://api.twitch.tv/kraken/channels/' + channel,
                    id: channel,
                    text: channel
                });

            $("#list").append(row.append(col.append(a)));
        });
    });
});

【讨论】:

  • 感谢帮助,之前的问题已经解决,但是如果我快速将鼠标悬停在多个元素上,它仍然会显示多个弹出窗口。
  • 这可能是因为您在事件处理程序中执行 ajax 请求,因此需要一些时间才能显示结果 HTML。如果鼠标在内容出现之前离开,它不会被删除,因为在删除任何内容之前调用了remove()。你应该做的是将内容加载到元素中,然后在 mouseenter 和 mouseleave 上隐藏和显示它们.
  • 好的,我会试试的,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多