Javascript onClick在未单击的情况下关闭

Javascript onClick在未单击的情况下关闭,javascript,javascript-events,onclick,Javascript,Javascript Events,Onclick,我对使用Javascript编写非常陌生,正在创建一个基本的选项卡导航界面作为原型/实践。现在,我正试图使用onclick事件处理程序在无序的链接列表上显示一个警报,只是作为一个测试,但我无法理解它。每次我加载页面时,所有5个onclick事件都会在没有单击任何内容的情况下发生。查看代码,如果您有任何建议,请告诉我: window.onload = initAll; var xhr = false; function initAll () { var navDiv = document

我对使用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);
}
window.onload=initAll;
var xhr=false;
函数initAll(){
var navDiv=document.getElementById(“选项卡导航”);
var navTabs=navDiv.getElementsByTagName(“a”);
对于(变量i=0;i
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>   


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);
}
for(变量i=0;i
假人的封口:

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);
}
函数initAll(){
var navDiv=document.getElementById(“选项卡导航”);
var navTabs=navDiv.getElementsByTagName(“a”);
对于(变量i=0;i

我刚刚意识到,这与icktoofay的第二个解决方案相同,但有一个命名的外部函数

只是一句俏皮话:
tellTab
返回一个函数,该函数对创建它的
tellTab
实例具有闭包。行
number=number+1
很重要,因为OP已将LIs从1编入索引,但
i
从零编入索引。要添加到RobG的注释中,数字(不带+1)是选项卡的索引。所以“表1”的索引为0,“表2”的索引为1等等。