如何重现:
使用 Chrome访问http://ivaynberg.github.com/select2/select2-latest.html 。
打开 Web 开发控制台,输入:
$("#e1").select2()
“类型错误:对象 -1 没有方法‘显示’”
第一个选择消失了,为什么?
如何重现:
使用 Chrome访问http://ivaynberg.github.com/select2/select2-latest.html 。
打开 Web 开发控制台,输入:
$("#e1").select2()
“类型错误:对象 -1 没有方法‘显示’”
第一个选择消失了,为什么?
问题在于,在第二次调用中,代码想要在创建新下拉列表之前销毁旧生成的下拉列表。它在正确初始化自身之前这样做。
相关代码在第 645 行附近的“删除”函数中:
if (select2 !== undefined) {
select2.container.remove();
select2.dropdown.remove();
select2.opts.element
.removeData("select2")
.unbind(".select2")
.attr("tabIndex", this.elementTabIndex) <--- fail here
.show();
麻烦的是它调用.attr("tabIndex", this.elementTabIndex)while this.elementTabIndexisundefined并且.attr(name, undefined)等价于.attr(name),从而返回属性本身(而不是 jquery 元素。所以你得到了属性 value '-1','-1'.show()那么当然没有任何意义。
作为一个kludge,使用.attr("tabIndex", this.elementTabIndex || -1). 更好的解决方法可能是destroy仅在this.elementTabIndex初始化后调用。我不确定是否attr真的需要调用 to destroy,但是我不能声称我理解代码。