onClick没有被点击就关闭了

时间:2011-06-02 01:55:01

标签: javascript javascript-events onclick

我非常擅长用Javascript编写,并且创建了一个基本的标签导航界面作为原型/练习。现在,我正在尝试使用onclick事件处理程序在无序的链接列表上显示警报,就像测试一样,无法弄明白。每次加载页面时,都会发生所有5次onclick事件,而不会点击任何内容。看看代码,如果您有任何建议,请告诉我们:

window.onload = initAll;
var xhr = false;

function initAll () {
    var navDiv = document.getElementById("tab_navigation");
    var navTabs = navDiv.getElementsByTagName("a");

    for (var i = 0; i < navTabs.length; i++) {
        navTabs[i].onclick = tellTab(i);
    }
}


function tellTab (number) {
    number = number + 1;
    alert("You clicked tab number " + number);
}

HTML结构如下:

    <div id="tab_navigation">
        <ul>
            <li><a href="#1">Tab 1</a></li>
            <li><a href="#2">Tab 2</a></li>
            <li><a href="#3">Tab 3</a></li>
            <li><a href="#4">Tab 4</a></li>
            <li><a href="#5">Tab 5</a></li>
        </ul>
    </div>   

2 个答案:

答案 0 :(得分:7)

for循环中,您有这一行:

navTabs[i].onclick = tellTab(i);

立即拨打tellTab。你可以做的是让tellTab返回一个闭包,就像这样:

function tellTab (number) {
    return function() {
        // I commented out the following line
        // because I don't think it's necessary.
        //number = number + 1; 
        alert("You clicked tab number " + number);
    };
}

另一个选择是在for循环中创建一个闭包:

for (var i = 0; i < navTabs.length; i++) {
    (function(i) {
        navTabs[i].onclick = function() {
            tellTab(i);
        };
    })(i);
}

答案 1 :(得分:0)

傻瓜的封闭:

function initAll () {
    var navDiv = document.getElementById("tab_navigation");
    var navTabs = navDiv.getElementsByTagName("a");

    for (var i = 0; i < navTabs.length; i++) {
        setTabOnclick(navTabs[i], i);
    }
}

function setTabOnclick(tab, i) {
   tab.onclick = function () { tellTab(i); };
}

function tellTab(i) {
  alert('clicked tab ' + i);
}

我刚刚意识到这与icktoofay的第二个解决方案相同,但具有命名的外部功能。