2016-11-15 65 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