2012-09-04 70 views
3

我有一個現有的事件重頁,我試圖添加提前支持。打字頭功能按照需要工作,除了它似乎只能附加到輸入項目一次。jQuery Bootstrap - 從輸入中刪除事件後更新提前

問題是,爲了簡單起見,在某些操作之後,現有頁面通過$('input').off()刪除附加到特定輸入的所有事件,然後根據新的上下文重新附加新的事件處理程序。

這會引起一個問題,即重新附加的typeahead函數似乎從未觸發。 (這裏有一個類似但不同的問題在這裏討論:Trouble updating Bootstrap's typeahead data-source with post response但這是不相關的,因爲我可以更新源罰款 - 我只是無法得到輸入提示觸發,無論我嘗試)

編輯:澄清 - 更改源(如在鏈接的問題中)是而不是問題 - 實際頁面上的源是向服務器發出請求的js函數。問題是調用.off()似乎永遠打破了前進方向,我無法刪除對.off()的調用,而不必重寫大部分頁面....下面的代碼和jsfiddle只是我可以設計的最短代碼問題

這裏有一個工作的jsfiddle記錄的問題: http://jsfiddle.net/hz5P3/8/

以供將來參考,完整的代碼如下。要簡要記錄:input.works text_field只有一個typeahead聲明並且正常工作。 input.no_works具有調用的typehead功能,然後調用$('.no_works').off()來移除此輸入上的所有事件。重新連接到此功能的類型根本無法工作。

是否有任何方法可以使第二次調用按預期進行預先工作?

感謝

的Html

<div class="container"> 
    <div class="hero-unit"> 
        <h1>Bootstrap jsFiddle Skeleton</h1> 
         
         <p>this is a test typeahead that will work</p>          
        <input type="text" class="works" style="margin: 0 auto;"> 
         
        <p>this is a test typeahead that is updated and will not work</p> 
        <input type="text" class="no_works" style="margin: 0 auto;"> 
    </div> 
</diV>​ 

的Javascript

$('.no_works').typeahead({ 
    source: ["cat", "dog", "mouse"] 
}); 
$('.no_works').off(); 

$('.no_works').typeahead({ 
    source: ["cat", "dog", "mouse"] 
}); 

$('.works').typeahead({ 
    source: ["cat", "dog", "mouse"] 
}); 

回答

7

編輯:好吧,我現在明白了。

因此,您需要清除該元素的jQuery對象的'typeahead'數據。 它可能不是做的100%正確的方式,但它很容易和它的作品:

http://jsfiddle.net/feXM3/

$('.no_works').typeahead({ 
    source: ["cat", "dog", "mouse"] 
}); 

$('.no_works').off(); 

//amir75 added a line here: 
$('.no_works').data('typeahead', (data = null)) 

$('.no_works').typeahead({ 
    source: ["frog", "cow", "horse"] 
}); 

我原來的答覆: 我不認爲'關閉「方法就是按照您的期望去除舊的預先輸入功能。

你可以這樣做,而不是:

//1. store the typeahead object in a variable 
var tah= $('.no_works').typeahead({ 
    source: ["cat", "dog", "mouse"] 
}); 

//2. update the data source 
tah.data('typeahead').source = ["frog", "cow", "horse"]; 

更新的jsfiddle:http://jsfiddle.net/Skp5R/

+0

對不起 - 我應該讓這個問題更加清晰。源代碼實際上是一個讓js請求發生變化的函數,這不是問題。 .off()作爲現有頁面的一部分存在 - 我無法刪除對.off()的調用,而無需重新編寫現有頁面的大塊。這裏描述的源代碼更改方法來自鏈接問題 - 在這種情況下無法提供幫助,因爲更改源代碼與此問題無關。 –

+0

請參閱我的編輯。值得看看源代碼來了解發生了什麼:https://github.com/twitter/bootstrap/blob/master/js/bootstrap-typeahead.js – laher

+1

很酷。這正是它需要的工作。謝謝!閱讀你的解決方案,我現在可以在源代碼中看到它爲什麼會崩潰=) –