![](/img/trans.png)
[英]Adjusting button style with JavaScript is rendering the CSS :active event useless
[英]CSS - js rendering links useless
好的,好了,感谢这里的人们,我想出了我的js代码中使我的链接变得无用的部分是下面粘贴的内容...仍然试图弄清楚为什么,但是如果有人有任何见识,那就太好了。 ..
function initJumpMenus() {
// Turns all <select> elements with the 'jumpmenu' class into jump menus
var selectElements = document.getElementsByTagName("select");
for( i = 0; i < selectElements.length; i++ ) {
// Check for the class and make sure the element has an ID
if( selectElements[i].className == "jumpmenu" &&
document.getElementById(selectElements[i].id) != ""
) {
jumpmenu = document.getElementById(selectElements[i].id);
jumpmenu.onchange = function() {
if( this.options[this.selectedIndex].value != '' ) {
// Redirect
location.href=this.options[this.selectedIndex].value;
}
}
}
}
}
window.onload = function() {
initJumpMenus();
}
这个:
document.getElementById(selectElements[i].id) != ""
是错的。 您要检查元素是否具有ID,只需执行以下操作:
selectElements[i].id != ""
我想指出的是,您可以在这里和那里改进代码:
for
获取每次迭代的length
属性的循环, 而是:
for( i = 0, num = selectElements.length; i < num; i++ ) {
...
}
仅当您希望selectElements
增大或缩小时,才可以重新查询属性值,但是在那种情况下,您可能无论如何都不应该编写for
循环。
nodelist[index]
对于节点列表,例如getElementsByTagName()
返回的节点,您不应编写nodelist[index]
(即使大多数浏览器都支持该列表)。 标准的DOM方法是item
,所以改写nodelist.item(index)
。
如果您需要多次从列表中选择一项,请将其存储在局部变量中。 您的循环将变为:
for( i = 0, selectElement; i < selectElements.length; i++ ) {
selectElement = selectElements.item(i);
...more code using selectElement...
}
请注意for循环中selectElement
变量的声明。 由于不在循环之外使用它,因此在其中声明它可以避免混乱,并确保如果移动循环,则可以移动声明。
你写了:
selectElement.className == "jumpmenu" &&
selectElement.id != ""
如果您将双腿倒转,可以稍微改善一下:
selectElement.id != "" &&
selectElement.className == "jumpmenu"
这样会更快,因为检查字符串是否为空的工作量较小,对于那些字符串为空的情况,我们甚至不会检查className
document.getElementById()
在循环内部,您有以下内容:
jumpmenu = document.getElementById(selectElements[i].id);
您基本上是从selectElement
获取ID的,并使用该ID来查询文档以查找.... id
等于当前selectElement
。 因为id
在文档中是唯一的(或应该是),所以您基本上在写一个完全不必要的句子。 jumpmenu
和selectElement
引用一个相同的对象。
在循环内,您分配了一个onchange处理程序。 为此,您需要为每个循环迭代创建一个新函数。 这是处理程序代码:
function() {
if( this.options[this.selectedIndex].value != '' ) {
// Redirect
location.href=this.options[this.selectedIndex].value;
}
}
这里要注意三件事:首先,onchange处理程序代码包含此location.href = ...
可能应该是document.location.href = ...
其次,您两次引用this.options[this.selectedIndex].value
。 同样,将其放在局部变量中。
第三, this
是指在执行此功能时经历过onchange事件的元素。 除了this
和this
属性之外, this
处理程序中没有任何源自循环或外部initJumpMenus
函数的变量。 您只需在循环外部创建一次,并在每次迭代中分配它:
var onchange_handler = function() {
if( this.options[this.selectedIndex].value != "" ) {
// Redirect
location.href=this.options[this.selectedIndex].value;
}
}
for (...) {
if (...) {
selectElement.onchange = onchange_handler;
}
}
综上所述,这就是我的写法:
function initJumpMenus() {
var handler = function() {
var value = this.options.item(this.selectedIndex).value;
if( value != "" ) {
// Redirect
document.location.href = value;
}
}
var selectElements = document.getElementsByTagName("select");
for(var i = 0, num = selectElements.length, selectElement; i < num; i++ ) {
selectElement = selectElements.item(i);
// Check for the class and make sure the element has an ID
if( selectElement.id != "" &&
selectElement.className == "jumpmenu"
) {
selectElement.onchange = handler;
}
}
}
检查错误控制台; JS中的任何异常都会停止链接表单对点击的反应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.