【问题标题】:my "click" addEventListener does not work well我的“点击”addEventListener 不能正常工作
【发布时间】:2013-08-04 20:02:24
【问题描述】:

我正在使用以下代码将侦听器添加到(我附加到表中的 TBODY),因此当我将鼠标放在 TR 上时,我可以看到很好的高亮效果。 我还有一个“点击”事件,它使整行“可点击”,因此用户可以轻松点击整行并转到该特定页面。

我正在使用 JS,因为我使用 AJAX 调用来填充 TR(以及它们的少数 TD)。

我列表中的前 12 个元素用 PHP 很好地完成了,但之后我通过 Ajax 调用加载了下一个 10、10、10...

当我使用 PHP 并将 javascript: 添加到带有“onClick”的 TR 时,它可以完美运行, 但在下面的这段代码(javascript)中,只有 mouseover 和 mouseout 可以正常工作, “click”事件侦听器将 i 的最后一个值添加到所有 window.location.href 中,当前值 (13、14、15)...它仅添加到所有 15(所以总是,i 的最后一个值 - my计数器...它不会像计数器那样递增)。

我认为事件侦听器的功能、它的初始化方式有问题,我不知道。

             for(i=0; i<10; i++){

                    myTr.addEventListener("mouseover",function(){
                        this.style.backgroundColor = "#083636"
                        this.style.cursor = "pointer"
                    });

                    myTr.addEventListener("mouseout",function(){
                        this.style.backgroundColor = "transparent"
                    });

                    myTr.addEventListener("click",function(){
                        window.location.href = '/clubbers/' + clubber_url + '/' + i + '#threads'
                    });

             }

*在输入/复制代码时忘记开始我的for括号,现在看起来不错

【问题讨论】:

  • 你能检查一下你的代码吗,你没有关闭括号...
  • 您重复循环十次,它会相应地设置 window.location.href 值,因此您最终只发送了最后一个值。
  • 你也不需要 mouseover 和 mouseout 来改变颜色,你可以添加 tr:hover{background-color:#083636; cursor:pointer} 指向你的 CSS

标签: javascript ajax


【解决方案1】:

这是一个范围问题。基本上,您将 i 传递给您的 eventListener,它与循环递增的变量相同。请参阅How do JavaScript closures work? 以获得更好的解释

你可以这样做:

myTr.addEventListener("click",(function(j){
  return function(e) {
    window.location.href = '/clubbers/' + clubber_url + '/' + j + '#threads'
  }
})(i));

【讨论】:

  • 你的函数使我的代码立即跳转到我用 AJAX 加载的第一个帖子,这意味着我通常用 PHP 加载第 12 行,然后当我开始使用 Javascript 函数时,AJAX 会触发代码我放置了我的事件监听器,一旦我触发了 AJAX 代码,它就会在加载的第一行“点击”......以某种方式自动
  • 哎呀你是对的,我的代码不正确,现在应该是
  • 就像一个魅力!感谢您在星期六晚上为我们服务:))
【解决方案2】:

您的问题是事件未正确捕获外部 for 循环中的变量 i,因为在评估事件时,循环已经完成,并且变量处于其最后一个值。

查看这篇文章以获得一些解决方案:

Caputured variables in Javascript

【讨论】:

    【解决方案3】:
    function clickTr(i){
        return function(){
            window.location.href = '/clubbers/' + clubber_url + '/' + i + '#threads';
        }
    }
    for(i=0; i<10; i++){
    
                    myTr.addEventListener("mouseover",function(){
                        this.style.backgroundColor = "#083636"
                        this.style.cursor = "pointer"
                    });
    
                    myTr.addEventListener("mouseout",function(){
                        this.style.backgroundColor = "transparent"
                    });
    
                    myTr.addEventListener("click",clickTr(i));
    
             }
    

    【讨论】:

    • 我认为你的解决方案太有用了,刚刚从上面的答案中得到了它,但你的答案似乎更像是我做的代码:) 阅读轻松简单:) 谢谢!
    猜你喜欢
    • 2014-01-28
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    相关资源
    最近更新 更多