2016-11-15 71 views
1

让我告诉我的意思与引导,选择一个例子:分配事件元素被破坏并重新初始化后重新

HTML

<a href="#" id="link">Show Select options</a> 
<div id="gap"></div> 
<a href="#" id="link2">Destroy Select</a> 

<div id="searchSelect"> 
    <select name="searchName" id="idSelect" data-live-search="true" data-size="10"> 
    <option value="John">John</option> 
    <option value="Janet">Janet</option> 
    </select> 
</div> 

JS:

$("#idSelect").selectpicker(); 

$("#link").click(function(e) { 
    e.preventDefault(); 
    $("#searchSelect").show(); 
    setTimeout(function() { 
    $('#idSelect').selectpicker('toggle'); 
    }); 
}); 

$("#link2").click(function(e) { 
    e.preventDefault(); 
    $('#idSelect').selectpicker('destroy'); 
    $("#searchSelect").hide(); 
    alert("Select destroyed"); 
}); 

$("#idSelect").on("hide.bs.select", function() { 
    alert("onHide fired"); 
}); 

当您第一次运行时,此事件正常工作:

$("#idSelect").on("hide.bs.select", function() { 

但是在你销毁元素并重新初始化之后,事件不会再发生,有没有办法再次将事件分配给元素?

,看看我的意思是,最好的办法是要经过: 采取看JSFIDDLE

  1. 单击“查看选择选项”
  2. 点击下拉菜单之外,它会关闭,它会显示警报消息。
  3. 单击按钮“销毁选择”
  4. 重复步骤1,2,它将关闭,但不会显示警报消息。

回答

1

更改为使用委派事件处理程序:

$(document).on("hide.bs.select", "#idSelect", function() { 
    alert("onHide fired"); 
    }); 

的jsfiddle:https://jsfiddle.net/n1zz8kkw/17/

这是通过在活动列表上非改变的祖先,然后将过滤器(#idSelect)至气泡链中的项目,然后将该函数应用于导致事件的匹配元素。结果是该元素除了在事件时间之外不需要存在。

document是最好的默认值,如果没有其他更接近。 body有一个bug,所以最好避免和document总是存在,所以在文件委派处理程序甚至不需要是一个文档准备好处理程序:)

+0

谢谢你的解释里面。 – felixRo