- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个使用一些 jQuery 的导航菜单。我希望键盘用户能够获得与鼠标用户相同的体验,因此我在 focus()
中复制了 hover()
事件处理程序中的功能和 blur()
事件处理程序。由于某种原因,当用户单击链接时,这会导致 Firefox 和 IE 出现明显的延迟,而当使用 focus()
和 blur()
代码时,不会发生这种情况。带走。我怎样才能加快速度?我已经在有限的 JavaScript 知识允许的范围内进行了尽可能多的优化,但我没有看到任何“加速”,所以我认为这可能与这些浏览器处理事件的方式有关。
有什么我忽略的重大事情吗?或者是否有其他方法可以在不使用这些事件的情况下保留键盘用户的可访问性?
var statePad=0;
function stateChanger(ourStatePad) {
//the purpose of this function is to translate the current state of the menu into a different graphical representation of the menu state.
var tempVar=ouStatePad;
var tempArray = new Array;
tempArray[5]=0;
for (var x=0;x < 5;x++) {
tempArray[x]=tempVar % 10;
tempVar=(tempVar-tempArray[x])/10;
}
for (var arrayIndex=4;arrayIndex>=0;arrayIndex--) {
//Calculate the proper position in our CSS sprite, based on the each link's state, as well as it's neighbors'.
$(".block").eq(4 - arrayIndex)
.css(
"background-position",
//x-position
((4 - arrayIndex) * -100) + "px " +
//y-position
(tempArray[arrayIndex] + ((3 * tempArray[(arrayIndex) + 1]) * -30))) + "px";
}
}
function hoverState(index,sign) {
var placeholder=Math.pow(10,4-index);
if (statePad != placeholder*2)
statePad += (placeholder * sign);
stateChanger(statePad);
}
.click(function() {
var index=$("#navbar a").index(this);
statePad=Math.pow(10,(4-index))*2;
stateChanger(statePad);
$(".active").removeClass("active");
$(this).addClass("active");
})
.hover(
function () {
hoverState($("#navbar a").index(this),1);
},
function () {
hoverState($("#navbar a").index(this),-1);
});
$("#navbar a").focus(
function() {
hoverState($("#navbar a").index(this),1);
}
);
$("#navbar a").blur(
function() {
hoverState($("#navbar a").index(this),-1);
}
);
});
您可以查看here
最佳答案
有很多不必要的lengthening of the scope chain在您的代码中,较长的作用域链将需要更长的时间来解析。它可以缩短为以下内容
$("navbar a").click(blah)
.hover(foo,bar)
.focus(foo)
.blur(bar);
希望这能减少明显的延迟。如果进行此更改后仍然看到明显的滞后,请发布事件处理函数的代码,因为也可以对该代码进行改进。
编辑:
为了回应您的评论,您可以使用传入的 event
获取函数中的索引。对象的target
属性,这将是引发事件的元素。因此,要获取 <a>
的索引所有 <a>
中的元素<ul>
中的元素通过 id navbar,我们可以使用每个 <a>
包含在 <li>
中,因此每种情况下的索引都是相同的。有了这个心,event.target
将是<a>
引发单击事件的元素,event.target.parentNode
将是 <a>
的父元素这是 <li>
要获取索引,您可以使用
function hoverState(e) {
// get the index of the <a> element, which will be the same
// as the index of the <li> that contains it in the <ul>
//
var index = $(e.target.parentNode).prevAll().length;
//
// get the sign
var sign = (e.type === 'mouseenter' || e.type === 'focus')? 1 : -1;
}
这将消除对包装hoverState的匿名函数事件处理程序的需要。
这是一些修改后的代码
var statePad=0;
// the purpose of this function is to translate
// the current state of the menu into a different
// graphical representation of the menu state.
//
function stateChanger(ourStatePad) {
var tempVar=ourStatePad;
var tempArray = [0,0,0,0,0];
for (var x=0;x < 5;x++) {
tempArray[x]=tempVar % 10;
tempVar=(tempVar-tempArray[x])/10;
}
// Calculate the proper position in our CSS sprite,
// based on the each link's state, as well as it's neighbors'
//
var arrayIndex=4;
while (arrayIndex--) {
$("#rightpostheader div.block").eq(4 - arrayIndex)
.css(
"backgroundPosition",
//x-position
((4 - arrayIndex) * -100) + "px " +
//y-position
(tempArray[arrayIndex] + ((3 * tempArray[(arrayIndex) + 1]) * -30))) + "px";
}
}
function hoverState(e) {
var index = $(e.target.parentNode).prevAll().length;
var sign = (e.type === 'mouseenter' ||
e.type === 'focus')? 1 : -1;
var placeholder=Math.pow(10,4-index);
if (statePad != placeholder*2)
statePad += (placeholder * sign);
stateChanger(statePad);
}
$("#navbar a")
.click(function(e) {
// might be able to rework this into using hoverState too
var $this = $(e.target);
// get the index of the parent <li>
var index= $this.parent().prevAll().length;
statePad=Math.pow(10,(4-index))*2;
stateChanger(statePad);
$("#navbar a").removeClass('active');
$this.addClass('active');
})
.bind("mouseenter mouseleave focus blur", hoverState);
关于jquery - jQuery focus() 和 Blur() 事件的滞后问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1640277/
我想对我网站的一部分进行模糊处理,通过单击链接可以使其变得不模糊。为了使这个平滑,我需要应用 blur(0px) 并在元素上进行过渡。但问题是即使使用 blur(0px),文本也会变得不清晰。 .pa
我有一些在元素上的“模糊”事件上运行的代码。此代码需要实际使用 activeElement,因此无法实际从“blur”事件运行。 我希望我能创建一个这样的事件。目的是“willblur”事件在“blu
我认为这个问题很简单。代码如下。 Show Menu let parent = document.getElementById('parent');
所以,我有一个简单的问题,实际上我已经把它写在标题中了。 :) 但我会再重复一次,只是为了完全清楚。问题是: 有没有办法知道“blur”是由“element.blur()”调用的还是“实际的”模糊?我
请看一下这个 jsfiddle:https://jsfiddle.net/heLwx9bz/ 我正在尝试通过过渡“取消模糊”悬停时的一些文本。请注意在转换为 blur(0px) 时文本如何轻微抖动,它
I have written this pen 编辑 see this pen of Alexander Omara for a shorter version of my pen 基本上,我们将 b
TL;DR 我怎样才能得到这个 self-explanatory JSFiddle上类? 来自 the W3C : The blur event occurs when an element lose
我想检测我的浏览器窗口是否有焦点(被选中)。我使用以下代码来执行此操作: $(window).focus(function() { window.focusFlag = true; }).bl
我有两个文本框,其值为"is"和“否”。当我在第一个文本框中输入"is"时,它会发出蜂鸣声,其余文本框也会发生同样的情况。当我在相应的文本框中输入正确的值时,声音应该仅播放一次。 就我而言,声音一次又
所以我遇到的问题似乎有点奇怪。因此,我有一个隐藏的表单,直到单击按钮为止,单击按钮后,表格就可见,并且在输入上有一个 .blur 函数来检查它们是否为空。我尝试在整个 pcontroller 中添加
我正在尝试创建一个可以使用所有可能的填充选项的模糊函数。但是对于BORDER_CONSTANT,您还需要提供颜色,即您要用来填充图片的数字。在opencv的模糊文档中,我看不到需要填充和颜色值的函数模
我有 2 个元素。第一个元素有一个 blur 事件,第二个元素有一个 mousedown 事件。第二个元素上的 mousedown 事件将焦点返回到第一个元素,但由于某种原因会触发第一个元素上的 bl
我试图使用 jQuery 创建一个可编辑的表格。 作为它的一部分,我显示了一个 td 的文本区域 onClick 并且在该文本区域的模糊处我隐藏了它。 问题是当我继续点击其他 td 时,文本区域模糊会
这里 Sample DEMO 我想在类 .drow1 .subval 失去焦点时触发事件,可能缺少某些内容, JS: $(".drow1 .sub_val").on('blur',funtion(){
这是我的代码: 我将以下几行放入脚本中 $('#m').on('blur', alert('blurred');); $('#m').on('focus', alert('focused'););
我有这段代码: window.addEventListener( "focus" , function(){ window.console.log("focus"); } , false );
我为我正在开发的网络应用程序编写了一个自定义下拉列表,并且我想用它来完成一组特定的功能。首先,如果您将鼠标移离菜单,我希望下拉菜单保持打开状态。我希望当您重新单击下拉列表标题、单击下拉列表中的元素之一
我有 3 个 .blur,但出于某种原因只有第一个有效。这是 jquery 代码: $(document).ready(function() { $("#user_name"
我正在尝试使用 HTML5 来验证数字输入。我正在使用 jQuery 来创建元素。如何让浏览器在不单击提交按钮的情况下显示 onBlur 错误消息? jQuery(document.createEle
我一直在试验 backdrop-filter最近,通常使用它来模糊元素后面的任何内容(这是动态的,所以 我不能只使用像 this 这样的东西)。但是,我还需要为所述元素应用阴影,所以我简单地添加了 b
我是一名优秀的程序员,十分优秀!