jQuery 找不到动态添加的 DOM 对象?

发布于 2024-07-26 10:54:41 字数 846 浏览 9 评论 0原文

我对 jQuery 很陌生……我已经多次使用过 Javascript,并且非常熟悉 DOM 操作,但对 jQuery 的 API 或齿轮不太熟悉。

我通过 JSON 调用动态添加 DOM 元素,如下所示:

$(document).ready(function() {
        var url = "jsonMenuItems.js";
        $.getJSON(url, null, function(data) {
            var html = "";
            //alert(data.items);
            data = data.items;
            for (var key in data) {      
                html += "<td class=\"menuItem\"><span>" + data[key].name + "</span></td>";
            };
            $("#menuTR").html(html);
        });

        var lZeroArray = $("#menu td");
        lZeroArray.click(function() {
            $("#submenu").slideDown("fast");
        });
    });

如果 TD 项目手动位于页面上,则单击函数 SlideDown 可以正常工作...如果我使用上面的代码动态添加 TD 项目,则单击函数 SlideDown 不会火。

jQuery 找不到它自己添加的项目,或者我做错了什么?

I am very new at jQuery ... I've used Javascript many times and am quite familiar with DOM manipulation but simply not the API or gears of jQuery.

I am dynamically adding DOM elements via a JSON call like so:

$(document).ready(function() {
        var url = "jsonMenuItems.js";
        $.getJSON(url, null, function(data) {
            var html = "";
            //alert(data.items);
            data = data.items;
            for (var key in data) {      
                html += "<td class=\"menuItem\"><span>" + data[key].name + "</span></td>";
            };
            $("#menuTR").html(html);
        });

        var lZeroArray = $("#menu td");
        lZeroArray.click(function() {
            $("#submenu").slideDown("fast");
        });
    });

If the TD items are on the page manually the click function slideDown works perfectly ... if I use the above code to dynamically add the TD items then the click function slideDown does not fire.

jQuery cannot find it's own added items or am I doing something wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

瀟灑尐姊 2024-08-02 10:54:41

问题是:您的事件处理程序绑定到 $('#menu td'),但在完成此操作时,$('#menu td') 中没有 td代码>#菜单!

使用 live() 确保 jquery 将事件处理程序添加到稍后添加到 DOM 的对象。

或者,旧版 jquery 中使用的解决方案是:

var url = "jsonMenuItems.js";
$.getJSON(url, null, function(data) {
  var html = "";
  //alert(data.items);
  data = data.items;
  for (var key in data) {
    html += "<td class=\"menuItem\"><span>" + data[key].name + "</span></td>";
  };
  $("#menuTR").html(html);
  $("#menu td").click(function() {
    $("#submenu").slideDown("fast");
  });
});
var lZeroArray = $("#menu td");
lZeroArray.click(function() {
  $("#submenu").slideDown("fast");
});

the problem is: your event handler is bound to $('#menu td'), but at the time that this is done, there are no tds in the #menu!

using live() makes sure that jquery adds event handlers to objects added later on to the DOM.

Alternatively, a solution used in older jquery versions would be:

var url = "jsonMenuItems.js";
$.getJSON(url, null, function(data) {
  var html = "";
  //alert(data.items);
  data = data.items;
  for (var key in data) {
    html += "<td class=\"menuItem\"><span>" + data[key].name + "</span></td>";
  };
  $("#menuTR").html(html);
  $("#menu td").click(function() {
    $("#submenu").slideDown("fast");
  });
});
var lZeroArray = $("#menu td");
lZeroArray.click(function() {
  $("#submenu").slideDown("fast");
});
西瑶 2024-08-02 10:54:41

看一下 jQuery live。 这将允许您将事件绑定到动态添加的项目。

$("#menu td").live("click", function(){
    $("#submenu").slideDown("fast");
});

Take a look at jQuery live. This will let you bind events to dynamically added items.

$("#menu td").live("click", function(){
    $("#submenu").slideDown("fast");
});
耶耶耶 2024-08-02 10:54:41

您似乎将点击事件添加到了错误的元素。 您将动态添加的 TD 添加到 id="menuTR" 的元素,但您正在为 id="menu" 的后代的 TD 元素设置点击事件。

要进行测试,请尝试更改 $("#menu td" ) 到 $("#menuTR td"),反之亦然。 或者,您可以尝试使用 $("td.menuItem") 选择元素,这会选择具有 menuItem 类的所有 TD 元素。

It looks like you're adding the click event to the wrong elements. You're adding the dynamically added TDs to an element with id="menuTR", but you're setting the click event on TD elements that are descendants of id="menu"

To test, try changing $("#menu td") to $("#menuTR td"), or vice versa. Alternately, you could try selecting the elements with $("td.menuItem"), which selects all TD elements with a class of menuItem.

魂ガ小子 2024-08-02 10:54:41

这是因为您必须在创建它们后重新应用单击功能:

$.getJSON(url, null, function(data) {
        var html = "";
        //alert(data.items);
        data = data.items;
        for (var key in data) {      
            html += "<td class=\"menuItem\"><span>" + data[key].name + "</span></td>";
        };
        $("#menuTR").html(html);

        $("#menu td").click(function() {
            $("#submenu").slideDown("fast");
        });

    });

That is because you have to reapply the click functionality to them after they are created:

$.getJSON(url, null, function(data) {
        var html = "";
        //alert(data.items);
        data = data.items;
        for (var key in data) {      
            html += "<td class=\"menuItem\"><span>" + data[key].name + "</span></td>";
        };
        $("#menuTR").html(html);

        $("#menu td").click(function() {
            $("#submenu").slideDown("fast");
        });

    });
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文