Javascript 如何检测对生成元素的点击?
我正在从JSON数据生成一组元素: 例如: 我对这个json所做的是使用“elements”中描述的元素创建一个表单,代码如下:Javascript 如何检测对生成元素的点击?,javascript,jquery,json,Javascript,Jquery,Json,我正在从JSON数据生成一组元素: 例如: 我对这个json所做的是使用“elements”中描述的元素创建一个表单,代码如下: var $input = $('<input type="submit" value="'+element.value + ... etc') .focus(...).blur(...).etc.; $('#container').append($input); 我已经有了这个草案的mumbo-jumbo+jquery代码
var $input = $('<input type="submit" value="'+element.value + ... etc')
.focus(...).blur(...).etc.;
$('#container').append($input);
我已经有了这个草案的mumbo-jumbo+jquery代码
$('#container').html();//clears the container
for each element in elements do
switch element.type
case 'button':
$('#container').append('<input type="submit" value="'+element.value + ... etc');
end case
case 'image':
insert image bla bla bla
end switch
end for each
我想检测一个元素是否被点击或其他类型的动作,如鼠标悬停等。如何将其绑定到元素?
另外,如何在不破坏元素的情况下更新元素
编辑:我暗示了一些重要的事情,我的坏消息:
我需要将elements javascript对象中的数据与生成的html元素链接起来。触发操作时检索的数据字段。这就是所有这些的原因。你有两个选择。创建元素后,可以绑定侦听器,如下所示:
var $input = $('<input type="submit" value="'+element.value + ... etc')
.focus(...).blur(...).etc.;
$('#container').append($input);
这将覆盖容器中当前或以后动态添加的所有输入元素。您可以在中阅读有关事件委派的更多信息。您有两个选项。创建元素后,可以绑定侦听器,如下所示:
var $input = $('<input type="submit" value="'+element.value + ... etc')
.focus(...).blur(...).etc.;
$('#container').append($input);
这将覆盖容器中当前或以后动态添加的所有输入元素。您可以在中阅读有关事件委派的更多信息。如果您的js代码很短,只需在append函数中添加js代码即可。
append'如果js代码很短,只需在append函数中添加js代码即可。
追加“要检测动态添加元素上的事件,您应该在jQuery 1.7+和以前的版本中使用
编辑:是的,正如James在评论中指出的,总是建议在live上使用。要检测动态添加元素上的事件,您应该在jQuery 1.7+和以前的版本中使用
编辑:是的,正如James在评论中指出的,总是建议在live上使用它。或者直接绑定元素
$input = $('<input type="submit" value="'+element.value + ... etc');
$input.on('click', function() {
// do something
}
$('#container').append($input);
或者直接绑定元素
$input = $('<input type="submit" value="'+element.value + ... etc');
$input.on('click', function() {
// do something
}
$('#container').append($input);
构建表单非常简单,因为基本上已经映射了对象sytanx中元素的所有属性。因此,我们只需选择一个标记并将属性对象作为jQuery函数的第二个参数传入即可创建这些元素:
/* Container reference, counting variable */
var container = $("#container"), i = 0;
/* Clear out the container */
container.html("");
/* Cycle through each element */
while ( current = data.elements[i++] ) {
/* Evaluate the value of the current type */
switch ( current.type ) {
/* Since <input type='button|image'> are so similar, we fall-through */
case "button":
case "image" :
/* Choose a base element, pass in object of properties, and append */
$("<input>", current).appendTo(container);
break;
}
}
在线演示:构建表单非常简单,因为您已经基本上映射了对象sytanx中元素的所有属性。因此,我们只需选择一个标记并将属性对象作为jQuery函数的第二个参数传入即可创建这些元素:
/* Container reference, counting variable */
var container = $("#container"), i = 0;
/* Clear out the container */
container.html("");
/* Cycle through each element */
while ( current = data.elements[i++] ) {
/* Evaluate the value of the current type */
switch ( current.type ) {
/* Since <input type='button|image'> are so similar, we fall-through */
case "button":
case "image" :
/* Choose a base element, pass in object of properties, and append */
$("<input>", current).appendTo(container);
break;
}
}
在线演示:在创建元素时将onclick/onmouseover/etc添加到元素中,或者使用jQuery with.click/.mouseover/etc绑定元素。不过,前者更可取。请注意,.html不清除内容,只返回它。您应该使用.html来清除内容。在创建元素时,将onclick/onmouseover/etc添加到元素中,或者使用jQuery with.click/.mouseover/etc绑定元素。但是,前者更可取。请注意,.html不清除内容,只返回它。您应该使用.html来清除内容。最后使用live,最好使用delegate。最后使用live,最好使用delegate。我看不出任何一种情况下第一个选项更合适。@Purmou这与说没有理由不委托一些人声称的事件基本相同。如果加载到容器中的内容很大,并且99%的用户从未触发创建给定输入的代码,那么为什么要绑定侦听器呢?大多数情况下,授权可能更干净,但我有时能看到不授权的理由。我看不到任何一种情况下第一种选择更合适。@Purmou这基本上与说没有理由不授权一些人声称的事件是一样的。如果加载到容器中的内容很大,并且99%的用户从未触发创建给定输入的代码,那么为什么要绑定侦听器呢?大多数情况下,委派可能更干净,但我可以看到不委派的理由。回答不错,但一件事,更新创建的html元素怎么样?通过jquery更新它们不会将它们从容器中解除绑定。on或其他什么?@alfa64更新是什么意思?如果愿意,您可以更新这些元素,只要您监听事件,您就可以响应。我的意思是相同JSON的更新版本,迭代并更新每个元素而不创建新的元素,因为我认为销毁和生成相同的元素会导致绑定丢失,如果我错了,请纠正我。@alfa64我理解。在上面的代码中,$.on语句将以处理旧元素的方式处理新元素。在这里你没有什么好担心的,除非你的项目中有一些细节没有包括进去,这会影响你的工作。答案不错,但是一件事,更新创建的html元素怎么样?通过jquery更新它们不会将它们从容器中解除绑定。on或其他什么?@alfa64更新是什么意思?如果需要,可以更新这些元素
你喜欢,只要你倾听事件,你就可以响应。我的意思是相同JSON的更新版本,迭代和更新每个元素而不创建新的,因为我认为销毁和生成相同的元素会导致绑定丢失,如果我错了,请纠正我。@alfa64我理解。在上面的代码中,$.on语句将以处理旧元素的方式处理新元素。在这里你没有什么好担心的,除非你的项目中有一些细节没有包括进去,这会影响你的工作。
/* Listen for all clicks on input elements within the container */
container.on("click", "input", function(){
/* We have a button, and an image. Alert either the value or src */
alert( this.value || this.src );
});