jQuery não encontrar objetos DOM adicionados dinamicamente?
Pergunta
Eu sou muito novo para jQuery ... Eu usei Javascript muitas vezes e estou bastante familiarizado com a manipulação DOM, mas simplesmente não a API ou engrenagens do jQuery.
Estou dinamicamente adicionando elementos DOM através de uma chamada JSON assim:
$(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");
});
});
Se os itens TD está na página manualmente a função de clique slideDown funciona perfeitamente ... se eu usar o código acima para adicionar dinamicamente os itens TD, em seguida, a função de clique slideDown não dispara.
jQuery não consegue encontrar o seu próprio itens adicionados ou estou fazendo algo errado?
Outras dicas
O problema é: o manipulador de eventos é obrigado a $('#menu td')
, mas no momento em que isso é feito, não há td
s na #menu
usando live()
garante que jQuery adiciona manipuladores de eventos para objetos adicionados mais tarde para o DOM.
Como alternativa, uma solução usado em versões mais antigas do jQuery seria:
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");
});
Parece que você está adicionando o evento clique aos elementos errados. Você está adicionando os TDs adicionados dinamicamente para um elemento com id = "menuTR", mas você está definindo o evento clique em elementos TD que são descendentes de id = "menu"
Para testar, tente mudar $ ( "# menu de td") para US $ ( "# menuTR td"), ou vice-versa. Como alternativa, você pode tentar selecionar os elementos com $ ( "td.menuItem"), que seleciona todos os elementos TD com uma classe de menuItem.
Isso é porque você tem que reaplicar a funcionalidade clique para eles depois que eles são criados:
$.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");
});
});