【问题标题】:Creating several dynamic onclick events in Javascript / Jquery [duplicate]在Javascript / Jquery中创建几个动态onclick事件[重复]
【发布时间】:2014-12-17 01:14:43
【问题描述】:

我有一个未排序的 HTML 图像列表。每个 Line (li) 元素都有自己的 id:

<ul id="Demo3">
    <li id="li1"><img src="images/FT/HopkinsPrairie.jpg" /></li>
    <li id="li2"><img src="images/FT/PineForest.jpg" /></li>
    <li id="li3"><img src="images/FT/2011GroupThumb.jpg" /></li>
    <li id="li4"><img src="images/FT/JuniperSpringsSwimming.jpg" /></li>
    <li id="li5"><img src="images/FT/HappyHourThumb.jpg" /></li>
    <li id="li6"><img src="images/FT/HappyHourThumb.jpg" /></li>
</ul>

当我点击每张图片时,我希望显示更大版本的图片,有点像这样:

<li id="li2"><a href="images/FT/PineForestBig.jpg" target="_blank"><img src="images/FT/PineForest.jpg" /></a></li>

不幸的是,与#Demo3 关联的 CSS 类对与所有 #li 元素关联的类进行了大量操作,因此我必须以编程方式添加锚点。

我尝试这样做:

i = 1;
while ($("#li" + i).length > 0) {  // If the li id exists
    myLink = "images/FT/Page" + i + ".jpg";  // create a link 
    var element = document.getElementById("li" + i);  // get the element
    element.onclick = function () {          // create an onclick for this element
        var win = window.open(myLink, '_blank');
        win.focus();
    }
    i++;
}

这不起作用!无论出于何种原因,每个图像都会与列表中的最后一个图像获得相同的点击。

有谁知道我做错了什么或如何解决这个问题,以便每个 li 元素中包含的每个图像都有自己的点击?

还有其他建议吗?

【问题讨论】:

  • 将您的 while 参数更改为 while ($("#Demo3 li").length &gt; 0) 有什么改变吗?对我来说,您似乎只是在循环浏览#li1
  • @Amadan 不,这个 jquery 问题有另一种方法。
  • 此问题已关闭,如in this meta post解释的错误重复项@

标签: javascript jquery css events


【解决方案1】:

另一种方法,使用Wildcard selectors

$("[id^=li").each(function(index, value) {
    value.click(function () {
       var id = parseInt(value.id.substring(2)); // strip "li", convert to int.
       var win = window.open("images/FT/Page" + id + ".jpg", '_blank');
       win.focus();
    });
});

或者干脆

$("[id^=li").click(function (event) {
    var id = parseInt(this.id.substring(2)); // strip "li", convert to int.
    var win = window.open("images/FT/Page" + id + ".jpg", '_blank');
    win.focus();
});

【讨论】:

    【解决方案2】:

    这不起作用!无论出于何种原因,每张图片都会获得与列表中最后一张图片相同的点击次数。

    你的直接解决方案是这样的:

    while ($("#li" + i).length > 0) {  // If the li id exists
        (function(i) { // <---- THIS LINE
            var myLink = "images/FT/Page" + i + ".jpg";  // create a link 
            var element = document.getElementById("li" + i);  // get the element
            element.onclick = function () {          // create an onclick for this element
                var win = window.open(myLink, '_blank');
                win.focus();
            }
            i++;
        })(i); // <---- and THIS LINE
    }
    

    原因是,myLink 被您的 onclick 闭包捕获。您的循环进行了多次,每次更改 myLink 并在 myLink 上创建一个闭包。当onclick 触发时,myLink 值是它在循环结束时的最后一个值 - 不是在创建闭包时。

    上述方法使用 IIFE“修复”i 的值,并在每次迭代中创建一个单独的变量 myLink 以供 onclick 处理程序结束。

    OneWay 的替代方法是直接使用另一个闭包作为each 的回调来实现这一点。我会在你的代码中使用他的解决方案,这个答案可以帮助你理解为什么你的原始行为会这样。

    【讨论】:

    • 抱歉重复的问题,但我以前从未听说过关闭。
    • 这是 JavaScript 中一个非常重要的概念,我建议你彻底研究它。不需要道歉:)
    猜你喜欢
    • 2016-10-04
    • 1970-01-01
    • 2019-01-25
    • 2019-05-15
    • 1970-01-01
    • 2012-04-16
    • 2016-06-29
    • 1970-01-01
    • 2017-01-03
    相关资源
    最近更新 更多