Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jquery单击而不附加到DOM var html=''; $(html)。查找(“#测试”)。单击(函数(){ 控制台日志(“单击”); }); //后来 $(htmlNode).html(html);_Jquery - Fatal编程技术网

jquery单击而不附加到DOM var html=''; $(html)。查找(“#测试”)。单击(函数(){ 控制台日志(“单击”); }); //后来 $(htmlNode).html(html);

jquery单击而不附加到DOM var html=''; $(html)。查找(“#测试”)。单击(函数(){ 控制台日志(“单击”); }); //后来 $(htmlNode).html(html);,jquery,Jquery,为什么我没有收到“单击”日志?您需要附加jQuery对象,而不仅仅是设置内部HTML: var html = '<div><a href="#" id="test">Btn</a></div>'; $(html).find("#test").click(function(){ console.log("clicked"); }); //later $(htmlNode).html(html); var html=$(''); html.fin

为什么我没有收到“单击”日志?

您需要附加jQuery对象,而不仅仅是设置内部HTML:

var html = '<div><a href="#" id="test">Btn</a></div>';
$(html).find("#test").click(function(){
  console.log("clicked");
});
//later
$(htmlNode).html(html);
var html=$('');
html.find(“#test”)。单击(函数(){
控制台日志(“单击”);
});
//后来
$(htmlNode).append(html);

EDIT:使用
append
而不是
html
更清晰,即使
html
在功能上似乎等同于
.empty().append(val)
传入jQuery对象时。

问题在于,您正在将一个单击事件绑定到DOM中尚未包含且不是jQuery对象的对象。你可以采取两种方法

1) 使用实时:

var html = $('<div><a href="#" id="test">Btn</a></div>');
html.find("#test").click(function(){
  console.log("clicked");
});
//later
$(htmlNode).append(html);
$(“#测试”).live('click',function(){
控制台日志(“单击”);
});
//后来
var html='';
$(htmlNode).html(html);
2) 构造一个适当的jQuery DOM对象,并绑定到该对象

$("#test").live('click', function(){
  console.log("clicked");
});
//later
var html = '<div><a href="#" id="test">Btn</a></div>';
$(htmlNode).html(html);
var a=$('').attr('href','#')。单击(函数(){
控制台日志(“单击”);
});
//后来
$(htmlNode.html(a.wrap(“”).html())//这也可以使用append或appendTo。

最好的方法取决于你的情况。一定要考虑到DOM在JavaScript中的附加值非常昂贵!p> 您只是将单击事件附加到html。您实际上并没有触发单击事件

尝试调用
。在附加事件后单击()

它应该是:

var a = $('<a></a>').attr('href', '#').click(function() {
  console.log("clicked");
});
//later
$(htmlNode).html(a.wrap('<div></div>').html()); //This could also use append or appendTo.
或者你可以:

$(htmlNode).html(html).filter("#test").click(function(){
  console.log("clicked");
});

稍后创建html

如上文所述,您试图向尚不存在的dom元素添加单击事件

$.live是一个不错的选择,但不幸的是,在大型应用程序中维护起来很麻烦,而且速度相当慢

您可以将事件绑定包装在一个超时中,该超时将事件绑定推送到队列的末尾,这意味着事件绑定将在您将新元素推送到dom后执行。像这样:

$("#test").live('click',function(){
    console.log("clicked");
});
var html='';
setTimeout(function(){$(“#test”)。单击(function(){
控制台日志(“单击”);
});},0);
//后来
$(htmlNode).html(html);

我认为这与他已经拥有的相当。您只是将html定义为jQuery对象,而不是html。他用
$(html)
将您的第一行放在第二行。此外,您将html值设置为
html
,这与您将
html
定义为jQuery对象时不起作用。@Adam@jimy-Huh?它起作用了。试试看。将
html
设置为一个jQuery对象而不是一个字符串会产生很大的不同。从未见过有人使用
html()
有效地完成
append()
所做的事情。这样做与
empty()
append()
之间有什么功能上的区别吗?如果您查看
html()
文档(),甚至没有一个函数定义(我看到的)接受jQuery对象!它是:
.html(htmlString)
。您发现了一个未记录的功能!:)@Adam使用
html
而不是
append
是无意的:)(只是一个粘贴工件)。但是在查看时,如果
html
arg不是一个字符串或函数,它会返回到
this.empty().append(value)(第5263行)。我认为可以安全地假设他正在尝试单击添加到页面的锚。他试图1)创建一个DOM元素,然后2)将一个事件附加到它(按该顺序),因此
live
是不必要的。据你所知,他的示例只是说明性的,就像我的示例一样
Live
是将事件绑定到不存在但稍后会出现的DOM元素的完美解决方案。他所需要做的就是重新排列他的代码。即使订单有多重要,我也提供了选项2。但是一般来说是的,如果你像他那样控制HTML,那么就没有必要进行
Live
。但是,再一次,您知道他所拥有的html字符串来自一个服务,在这种情况下,使用
Live
不仅仅是“调用”的。
var html = '<div><a href="#" id="test">Btn</a></div>';
setTimeout(function(){$("#test").click(function(){
  console.log("clicked");
});},0);
//later
$(htmlNode).html(html);