2008-09-28 27 views
7

我有以下問題:JavaScript事件:在<input>控制值快速變更通知

我有一個HTML文本框(<input type="text">),其內容由腳本我不能碰的修改(這是我的網頁,但我正在使用外部組件)。

我希望在每次該文本框的值發生變化時在我的腳本中收到通知,所以我可以對其做出反應。

我已經試過這樣:

txtStartDate.observe('change', function() { alert('change' + txtStartDate.value) }); 

它(不出所料)不起作用。如果我自己使用鍵盤更改文本框的值,然後將焦點移到其他地方,它只會被執行,但如果腳本更改了值,則它不會被執行。

是否有另一個我可以聽的事件,我不知道?



我使用的原型庫,並在情況下,它相關的外部組件修改文本框的值是基本的日期選擇器(www.basicdatepicker.com)

回答

5

正如你暗示,更改(和其他事件)僅在用戶採取某些行動時纔會觸發。修改事物的腳本不會觸發任何事件。您唯一的解決方案是找到一些可以連接到您的聽衆的控件鉤子。

這裏是我會怎麼做:

basicDatePicker.selectDate = basicDatePicker.selectDate.wrap(function(orig,year,month,day,hide) { 
    myListener(year,month,day); 
    return orig(year,month,day,hide); 
}); 

這是基於粗略的外觀與螢火蟲(我不熟悉的部分)。如果還有其他選擇日期的方法,那麼您還需要包裝這些方法。

+1

有沒有辦法在jQuery中做同樣的事情? – 2009-12-04 15:45:36

1

根據外部JavaScript編寫的方式,您總是可以在腳本中重新編寫外部腳本的相關部分,並使其覆蓋外部定義,以便觸發更改事件。

我不得不這樣做,因爲腳本不在我的控制範圍之內。

您只需要找到外部函數,將其全部複製爲具有相同名稱的新函數,然後重新編寫腳本以完成您想要的操作。

當然,如果腳本正確使用閉包寫的,你就不能太容易改變它的...

+0

我想過這個。我的問題是這是一個大的縮寫腳本。可能需要幾個小時才能找到合適的地方進行更改。我正在尋找一種快速方法來解決這個問題。如果需要我花費2個小時才能完成,那麼我試圖做的小功能就不值得這麼做:-) – 2008-09-28 23:26:07

2

IE有onpropertychange事件可能被用於此目的。

對於真正的網絡瀏覽器(;)),有一個DOMAttrModified mutation event,但在Firefox中進行了幾分鐘的實驗,我無法在編程方式更改該值時觸發文本輸入(或通過普通的鍵盤輸入),但如果我以編程方式更改輸入的名稱,它會觸發。 Curiouser和curiouser ...

如果你不能得到可靠地工作,你總是可以只定期輪詢輸入的值:

var value = someInput.value; 

setInterval(function() 
{ 
    if (someInput.value != value) 
    { 
     alert("Changed from " + value + " to " + someInput.value); 
     value = someInput.value; 
    } 
}, 250); 
+1

表單元素的`value`屬性與其屬性`value =「截然不同。 「價值,只是決定了初始價值。通過腳本或用戶操作設置值不會更新`value`屬性(*),因此不存在DOMAttrModified。 (*:除IE外,由於錯誤,但IE不支持DOMAttrModified。) – bobince 2009-12-04 16:26:11

0

除了周圍像諾亞如何解釋這個問題得到,你也可以只創建一個計時器,每隔幾百毫秒檢查一次數值。

0

我不得不按Dan建議的方式修改YUI可映射分頁控件一次。這是蠻力,但它在解決我的問題。也就是說,找到寫入字段的方法,複製其代碼並添加一條觸發更改事件的語句,並在代碼中處理該更改事件。你只需要用它的新版本覆蓋原來的功能。輪詢,雖然工作正常似乎是一個更多的資源消耗解決方案。

4

的addEventListener(「DOMControlValueChanged‘必火控件的值發生變化時,即使是通過一個腳本。

的addEventListener(’input」是直接用戶啓動DOMControlValueChanged的過濾版本。

不幸,DOMControlValueChanged目前只支持Opera,並且輸入事件支持在webkit中被破壞,輸入事件在Firefox和Opera中也有不同的錯誤

這個東西可能很快會在HTML5中被清除,fwiw。

更新:

截至2012年9月8日,DOMControlValueChanged支持已經從歌劇下降(因爲它是從HTML5刪除)和「輸入」的事件支持在瀏覽器(包括更少的錯誤)現在好多了。