【问题标题】:Javascript onclick unusual behavior [duplicate]Javascript onclick异常行为[重复]
【发布时间】:2014-09-03 00:58:32
【问题描述】:

我正在制作一个日历脚本,它适用于 Opera 浏览器,但不适用于 firefox。问题发生在日期选择中。这个特殊的 sn-p 说明了这个问题。在这种情况下,dayofweek[] 包含 31 个 DIV 标签,每个标签都包含自己的数字,人们可以点击。

<script type="text/javascript">
var maxdays=31;
for (var n=1;n<=maxdays;n++){
dayofweek[n].onclick="selectday("+n+")";
}

function selectday(day){alert(day+" is selected");}
</script>

此脚本(在歌剧中)通过打印选择正确号码的消息来工作。在 Firefox 中,即使我点击了,onclick 事件也不会执行。

我尝试的另一种方法是:

<script type="text/javascript">
var maxdays=31;
for (var n=1;n<=maxdays;n++){
dayofweek[n].onclick=function(){selectday(n);}
}

function selectday(day){alert(day+" is selected");}
</script>

这一次firefox和opera都响应了,但是问题是不管我选哪个数字都会出现“31被选中”。

有谁知道我可以做些什么来让所有启用 javascript 的互联网浏览器与我的代码协作?

【问题讨论】:

    标签: javascript function firefox onclick opera


    【解决方案1】:

    Javascript 不是块作用域。试试这个:

    <script type="text/javascript">
    var maxdays=31;
    for (var n=1;n<=maxdays;n++){
        dayofweek[n].onclick=selectdaywrapper(n);
    }
    
    function selectdaywrapper(day) {
        function selectday(){
            alert(day+" is selected");
        }
        return selectday;
    }
    </script>
    

    您遇到的问题与作用域以及变量在 js 中的绑定方式有关。您在循环中创建的函数绑定到循环变量,但直到循环结束后才会评估,因此所有 onclick 事件都以 n 的最终值执行

    【讨论】:

    • 我不会想到函数中的函数,但这个想法确实有效。我不明白的是,当看起来没有任何东西传递给 selectday 时,day 如何设法在警报函数中保留其值
    • 这实际上是初学者 javascript 开发人员最常犯的错误之一(因此,minitech 已将您的问题标记为重复)。诀窍是理解 javascript 中的作用域和闭包。这是一篇文章,其中包含对问题的解释 robertnyman.com/2008/10/09/… 有一个很棒的谷歌技术讨论,但我再也找不到它了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2014-10-23
    • 2018-03-09
    相关资源
    最近更新 更多