当鼠标在链接上快速移动时,jquery悬停()mouseOut事件不会触发
我有一个简单的链接列表,当您将鼠标悬停在它上面时,它会附加一个 div(从 XML 加载该 div 中的数据),并且在悬停时它会删除该 div,但只有当鼠标在链接上缓慢移动时,一旦鼠标移动得更多,就会发生这种情况在链接上速度比平时快,然后它不会删除 div,这意味着 mouseout 事件没有被触发
在前两个链接上积极移动鼠标,然后你可以看到 div 有时不会隐藏
这是我的演示的链接 http://ukcatonline.com/template/
这是我的代码:
$(document).ready(function () {
//vertical navigation js
$(".mainnav_v a").hover(
function (e) {
$this = $(this)
$this.stop().animate({ paddingLeft : '16px'}, 300);
var brand ="";
var category="designer_frames";
$this.each(function()
{
var title = this.title;
if ($this.is('a') && $this.attr('title') != '' && $this.attr('id')==category)
{
brand= this.title;
$.ajax({
type: "GET",
url: "xml/peek_menu.xml",
//ie bug : it send wrong datatype on localmachine
dataType: ($.browser.msie) ? "text" : "xml",
success: function(data) {
var xml;
if (typeof data == "string") {
xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.loadXML(data);
} else {
xml = data;
}
//could have used $(xml).find(category).each(function() but jquery is intelligent enough to know wat element is currently selected
$(category, xml).each(
function(){
$(brand,this).each(
function(){
var title = $(this).attr('title');
var imgurl = $(this).attr('imgurl');
var description = $(this).find('description').text();
var feature1 = $(this).find('feature1').text();
var feature2 = $(this).find('feature2').text();
var feature3 = $(this).find('feature3').text();
var feature4 = $(this).find('feature4').text();
var html = '<div id="peek_container"><img src="' + imgurl + '" alt="" /><br /><br /><h1>'+title+'</h1><br />';
html += '<p>' + description + '</p><br />';
html += '<ul><li>'+feature1+'</li><li>'+feature2+'</li><li>'+feature3+'</li><li>'+feature4+'</li></ul><br /></div>';
$this.parent().append(html);
}
);
}
);
}
}
);
}
});
},
function (e) {
$this = $(this);
$this.stop().animate({ paddingLeft : '6px' }, 300);
$this.siblings().remove();
}
);});
这是我的 HTML:
<ul class="mainnav_v">
<li><a href="#url" class="peek" title="Boss" id="designer_frames">Boss</a></li>
<li><a href="#url" title="Burberry" id="designer_frames">Burberry</a></li>
<li><a href="#url" title="Bvlgari" id="designer_frames">Bvlgari</a></li>
<li><a href="#url">Chanel</a></li>
<li><a href="#url">Diesel</a></li>
<li><a href="#url">Dior</a></li>
I have simple link list and when you hover over it it appends a div (loading data in this div from XML) and on hover out it removes the div, but it only happens when mouse moves slowly over the links as soon as mouse moves more fast then usual over the links then it doesn't remove the div which means mouseout event was not fired
Move your mouse aggressively on first two links then you can see that div some times doesn't hide
Here is link to my demo http://ukcatonline.com/template/
Here is my code:
$(document).ready(function () {
//vertical navigation js
$(".mainnav_v a").hover(
function (e) {
$this = $(this)
$this.stop().animate({ paddingLeft : '16px'}, 300);
var brand ="";
var category="designer_frames";
$this.each(function()
{
var title = this.title;
if ($this.is('a') && $this.attr('title') != '' && $this.attr('id')==category)
{
brand= this.title;
$.ajax({
type: "GET",
url: "xml/peek_menu.xml",
//ie bug : it send wrong datatype on localmachine
dataType: ($.browser.msie) ? "text" : "xml",
success: function(data) {
var xml;
if (typeof data == "string") {
xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.loadXML(data);
} else {
xml = data;
}
//could have used $(xml).find(category).each(function() but jquery is intelligent enough to know wat element is currently selected
$(category, xml).each(
function(){
$(brand,this).each(
function(){
var title = $(this).attr('title');
var imgurl = $(this).attr('imgurl');
var description = $(this).find('description').text();
var feature1 = $(this).find('feature1').text();
var feature2 = $(this).find('feature2').text();
var feature3 = $(this).find('feature3').text();
var feature4 = $(this).find('feature4').text();
var html = '<div id="peek_container"><img src="' + imgurl + '" alt="" /><br /><br /><h1>'+title+'</h1><br />';
html += '<p>' + description + '</p><br />';
html += '<ul><li>'+feature1+'</li><li>'+feature2+'</li><li>'+feature3+'</li><li>'+feature4+'</li></ul><br /></div>';
$this.parent().append(html);
}
);
}
);
}
}
);
}
});
},
function (e) {
$this = $(this);
$this.stop().animate({ paddingLeft : '6px' }, 300);
$this.siblings().remove();
}
);});
Here is my HTML:
<ul class="mainnav_v">
<li><a href="#url" class="peek" title="Boss" id="designer_frames">Boss</a></li>
<li><a href="#url" title="Burberry" id="designer_frames">Burberry</a></li>
<li><a href="#url" title="Bvlgari" id="designer_frames">Bvlgari</a></li>
<li><a href="#url">Chanel</a></li>
<li><a href="#url">Diesel</a></li>
<li><a href="#url">Dior</a></li>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我不是 100% 确定,但我的直觉是,通过 ajax 获取面板的函数调用应该是悬停动画函数的回调。
现在的情况是,悬停动画“独立”于 ajax 调用。
我没有尝试过这个,所以我可能是错的。 :P
I am not 100% sure but my gut feeling is, the function call to get the panel via ajax should be a callback of the hover animate function.
The way it is now, the hover animate is 'independent' of the ajax call.
I've not tried this so I might be wrong. :P
让我们检查一下有问题的操作顺序:
添加一个事实,即您没有使用
var $this
来声明$this
- 因此它是全局的,即 ajax 中的$this
调用可能会被覆盖。您可能应该更改您的函数以在 ajax 调用之前创建并附加
,然后稍后附加到它(添加注释):
Let us examine an offending order of operations:
Add in the fact that you aren't using
var $this
to declare$this
- therefore it is global, the$this
in the ajax call could be getting overwritten.You should probably change your function to create and append the
<div>
before the ajax call, and then append to it later (added comments):使用console.log()或其他一些日志记录方法,您应该能够确定在mouseover完成添加内容之前mouseout是否正在触发,或者如果还有其他问题。
Using
console.log()
or some other logging method you should be able to determine if themouseout
is firing before themouseover
is finished adding content, or if there is another problem.