【问题标题】:javascript not working on dynamically added tabsjavascript不适用于动态添加的标签
【发布时间】:2013-02-14 15:41:23
【问题描述】:

我目前正面临一个奇怪的错误,涉及 javascript。我已经使用 jquery ui 选项卡在我的网站中动态添加和删除选项卡,选项卡的内容包含两个按钮,鼠标悬停时它们会消失并在底部相关链接的鼠标离开时可见。此鼠标悬停适用于第一个默认选项卡,但不适用于动态添加的选项卡。当我将鼠标悬停在新标签的内容上时,效果不会发生。这是一个小提琴

http://jsfiddle.net/Hunain/E2nJa/ 这个小提琴与我的结果不完全一样,也不包含我的问题,所以请正确阅读我的上述声明,因为我已经解释了这个问题 我使用以下代码进行鼠标悬停

$("#butt").mouseenter(function () {
            $("#butt").css("visibility","hidden");
          })
          $("#info").mouseleave(function () {
            $("#butt").css("visibility","visible");
          });

【问题讨论】:

  • 使用 jquery.on(.... 动态添加内容

标签: javascript jquery html css jquery-ui


【解决方案1】:

使用on委托事件...

$(document).on("mouseenter", "#butt", function () {
  $(this).css("visibility","hidden");
});

$(document).on("mouseleave", "#butt", function () {
  $(this).css("visibility","visible");
});

如果您想了解更多关于on 直接和委托事件的信息,可以阅读此post

最好将其委托给文档中最近的静态元素,而不是委托给documentbody,以获得更好的性能

【讨论】:

  • 我明白你的意思,但是如果你看一下小提琴,mouseleave 事件在另一个 div #info 上,可见性在 #butt 上切换,但只有在 #info 上完成 mouseleave 时才可见,这怎么可能与 on/delegate
  • 这是因为如果查看新创建的选项卡.. <b id="butt".. > 不存在....所以选择器将无法找到它
  • 它存在,我已经使用开发者工具检查了它,它是普通的旧 jquery 选项卡在工作,当我点击新添加的动态选项卡时,前一个选项卡不再活动,新选项卡内容处于活动状态,并且那里也有相同的 id='butt' ,仍然没有...
  • 抱歉迟到了...但是您将有两个无效的同名 id...我猜 mouseenter 和 mouseleave 事件正在触发第一个不可见的 .. . 所以使用类而不是 id...应该可以工作
【解决方案2】:

参考你的小提琴...

$("#butt").mouseenter(function () {
     $("#butt").css("visibility", "hidden");
 })

应该是这样的

$jQuery.on("mouseenter","#butt",function () {
     $("#butt").css("visibility", "hidden");
 });

对于您知道将在运行时添加的其他元素也是如此。

【讨论】:

    【解决方案3】:

    您在文档加载时绑定事件并在绑定事件后添加按钮。所以事件不会与后来添加的元素绑定。
    添加按钮后应该绑定事件。

    【讨论】:

    • -1 正如许多其他人所指出的,处理动态添加的内容的正确方法是将侦听器委托给持久的父元素,而不是在每次添加动态内容后附加新的侦听器。跨度>
    【解决方案4】:

    这是因为mouseentermouseleave 仅适用于页面加载时存在于 DOM 中的项目

    您需要使用委托事件:on 用于 jQuery 1.7+,delegate 用于早期版本。

    试试这个(on):

    $("body").on("mouseenter", "#butt", function () {
        $(this).css("visibility","hidden");
    });
    
    $("body").on("mouseleave", "#butt", function () {
        $(this).css("visibility","visible");
    });
    

    或者对于 pre-1.7 (delegate):

    $("body").delegate("#butt", "mouseenter", function () {
        $(this).css("visibility","hidden");
    });
    
    $("body").delegate("#butt", "mouseleave", function () {
        $(this).css("visibility","visible");
    });
    

    【讨论】:

    • 我明白你的意思,但是如果你看一下小提琴,mouseleave 事件在另一个 div #info 上,可见性在 #butt 上切换,但只有在 #info 上完成 mouseleave 时才可见,这怎么可能与 on/delegate
    • 我已经完成了 on/delegate 事件,但是,当新创建的选项卡处于活动状态并且我将鼠标悬停在其相同的内容上时,没有任何反应,它应该做同样的事情并切换可见性,但它没有。如果我单击上一个 [original] 选项卡,并将鼠标悬停在其内容上,效果仍然存在...
    • @Hunain 嗯,您的 HTML 中是否有重复的 ID?可以发一下吗?
    • 是的,新创建的标签有重复的 id,是这个问题吗?但是当内容处于非活动状态(即未使用或单击动态选项卡时)是否无法访问内容?
    • 我现在也用过class,还是什么都没有,但是当我现在在开发者工具中查看时,可见性是切换的,但只有当新创建的动态选项卡处于非活动状态时,所以效果不可见,激活后效果不会发生:p
    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多