以下哪个更好?
1)在每个循环上创建元素
$(obj).children('option').each(function(){
var item = $('<div />')
.html($(this).text())
.append(plus)
.addClass('ui-widget-content ui-state-default')
.hover(
function(){$(this).addClass('ui-state-hover')},
function(){$(this).removeClass('ui-state-hover');}
);
$(list).append(item);
});
<小时/>
2)创建元素,仅在每次循环时更改其html注意:这不起作用,它需要
.clone()
如下。
var item = $('<div />')
.addClass('ui-widget-content ui-state-default')
.hover(
function(){$(this).addClass('ui-state-hover')},
function(){$(this).removeClass('ui-state-hover');});
$(obj).children('option').each(function(){
$(item).html($(this).text()).append(plus);
$(list).append(item);
});
更新:
因此,在审查了所有答案/评论之后,这是最终的功能。 还有更多改进吗?
function create_list(obj) {
var list = $('<div />')
.attr('id','keyword_unselect').addClass('ui-widget')
.delegate("div", "mouseenter mouseleave", function() {
$(this).toggleClass('ui-state-hover');
});
var plus = $('<div />').addClass('ui-icon-plus');
var item = $('<div />')
.append(plus)
.addClass('ui-widget-content ui-state-default');
$(obj).children('option').each(function(){
item.clone(true)
.prepend(this.text)
.appendTo(list);
});
return list;
};
最佳答案
在本例中,第一个会更好,但它目前具有不同的效果(元素每次都会移动)。
创建一次即可 .clone()
用于附加,如下所示:
var item = $('<div />', { 'class': 'ui-widget-content ui-state-default' })
.hover(function(){$(this).addClass('ui-state-hover')},
function(){$(this).removeClass('ui-state-hover');});
$(obj).children('option').each(function(){
$(list).append(item.clone(true).html(this.text).append(plus));
});
我正在使用.text
<option>
的属性(property)直接也可以节省一些 CPU 周期,如果您出于某种原因需要对内容进行编码,只需相反即可。
或者使用 .delegate()
的更高效版本仅绑定(bind)那些 mouseneter
和mouseleave
事件一次:
$(list).delegate("div", "mouseenter mouseleave", function() {
$(this).toggleClass('ui-state-hover');
});
var item = $('<div />', { 'class': 'ui-widget-content ui-state-default' });
$(obj).children('option').each(function(){
$(list).append(item.clone().html(this.text).append(plus));
});
关于jquery重复元素创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3708638/