【问题标题】:Unresponsive OnMouseOver event in a dynamically-generated nested DIV动态生成的嵌套 DIV 中的无响应 OnMouseOver 事件
【发布时间】:2010-11-27 01:34:58
【问题描述】:

我正在使用 JavaScript 为游戏生成地图,每个图块都是一个单独的 div。为了能够在我的网站上定位地图,我将它们全部放在另一个 div 中。

例如,
<div id="mapBox">
<div id="tile" ... ></div>
<div id="tile" ... ></div>
</div>

#tile div 是从 XML 文件中的数据生成的,因此它们是动态生成的。在每个#tile 上,我都有一个触发函数的 onmouseevent(alert(1) 现在只是为了让它工作),但它似乎从未被触发。

如果我在#mapBox 上放置一个onmouseevent,它会触发它,但我无法让它为#tile div 工作。

对此的任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: javascript javascript-events html


    【解决方案1】:

    不确定您是如何选择#tile div,但具有相同 ID 的多个元素是无效的。

    使用重复 ID 进行选择通常只会为您提供第一个匹配项(或其他一些不可预测的行为)。

    当需要重复标识符时,您应该使用类而不是 ID。

    <div id="mapBox">
        <div class="tile" ... ></div>
        <div class="tile" ... ></div>
    </div>
    

    【讨论】:

    • 类已经用于其他用途,但谢谢。然而,这仍然不能解决问题。 ://
    • @TheJF - 每个元素可以有多个类。只需使用一个空格来分隔它们。 &lt;div class="someClass tile" ... &gt;&lt;/div&gt;您如何选择元素以分配处理程序?
    • 哦,我知道 id 但无论如何都测试了它。但我不知道你可以为一个元素分配多个类,谢谢!
    • 处理程序是内联分配的,如
    • @TheJF - 如果处理程序是内联分配的,不确定为什么它不会触发。正如@Gaby 所指出的,您可以为此使用事件委托。无需为此使用 jQuery。请稍等片刻,我将举几个例子。
    【解决方案2】:

    如前所述,第一个问题是您对许多元素使用相同的 id,因此事件只会在第一个元素上触发。

    其次,在像这样在磁贴上进行类之后,您应该在 #mapBox 上使用 .delegate() 方法

    $('#mapBox').delegate('.tile', 'mouseover', function(e){
        //do whatever here
    })
    

    http://jsfiddle.net/nXa27/1/的示例


    更新

    对不起,没看到你不是在谈论 jquery..

    这是一个纯 javascript http://www.jsfiddle.net/AvJf7/ 的示例

    您仍然需要将tile 类添加到您的磁贴中,以便轻松有效地选择。

    【讨论】:

    • 啊,谢谢,但这是使用 jQuery 对吗?我还没有花时间去学习。是否有任何不使用 jQuery 的解决方案,或者我应该停止一切并在继续我的项目之前学习它?
    • @theJF,哎呀。以为你在问jquery。添加了一个纯 JS 示例。如果您需要,jQuery 非常方便。阅读并查看它是否符合您的需求;)
    • 啊,谢谢你的帮助! patrick dw 的回答起到了作用,虽然我需要使用它与我希望的有所不同,但我真的很感激答案。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多