2011-08-14 70 views
9

我有一個輸入文本,從javascript函數(計時器倒計時)獲取他的值。onchange事件不會觸發當更改來自另一個函數

我想在輸入文本爲0時引發事件,所以我使用change eventListener。

不幸的是,當改變來自javascript函數時,它似乎不會引發事件。

即使更改來自JavaScript而不是來自用戶,我如何強制更改事件正常工作?

感謝所有幫助

回答

13

fine manual

變化
當控制失去輸入焦點並且由於獲得焦點其值已被修改時發生變化的事件。此事件對INPUT,SELECT和TEXTAREA有效。元件。

當您通過代碼修改文本輸入的值時,更改事件不會因爲沒有焦點更改而被觸發。你可以用createEventdispatchEvent雖然觸發自己的事件,例如:

el = document.getElementById('x'); 
ev = document.createEvent('Event'); 
ev.initEvent('change', true, false); 
el.dispatchEvent(ev); 

和現場版本:http://jsfiddle.net/ambiguous/nH8CH/

+2

如果您使用任何現代事件偵聽方法,這將不起作用;它只會在你使用舊的'onchange'屬性時才起作用。您應該使用DOM事件API來觸發事件。 –

+0

@Delan:你能否告訴我很久沒有做過原始的JavaScript了?我會修補它。 –

+0

非常感謝!這很簡單,工作出色! :) – marverix

3

在改變的價值功能,手動觸發一個事件change

var e = document.createEvent('HTMLEvents'); 
e.initEvent('change', false, false); 
some_input_element.dispatchEvent(e); 
+0

是否需要是'HTMLEvents '? jQuery版本顯然使用'Event',我可以看到的唯一區別是DOM級別2與級別3. –

+0

據我所知,'HTMLEvents','Event'和'Events'是同義詞。 –

+0

['Event'](http://www.w3.org/TR/DOM-Level-3-Events/#events-Event)似乎是官方的,'Events'可能在某些瀏覽器中相匹配'hasFeature'多元化。 –

1

更可重複使用的選項:

function simulate_event(eventName, element) { 
    // You could set this into the prototype as a method. 
    var event; 

    if (document.createEvent) { 
     event = document.createEvent("HTMLEvents"); 
     event.initEvent(eventName, true, true); 
    } else { 
     event = document.createEventObject(); 
     event.eventType = eventName; 
    }; 

    event.eventName = eventName; 

    if (document.createEvent) { 
     element.dispatchEvent(event); 
    } else { 
     element.fireEvent("on" + event.eventName, event); 
    } 
}; 
相關問題