我的表單上的文本框可能會根據各種下拉列表中選擇的內容而變化。Javascript事件在沒有用戶交互的情況下觸發?
當文本框的值發生變化時,有沒有辦法調用javascript函數?
嘗試onchange事件,但這似乎只有在用戶手動更改文本框值時才起作用。
乾杯,
Breandán
我的表單上的文本框可能會根據各種下拉列表中選擇的內容而變化。Javascript事件在沒有用戶交互的情況下觸發?
當文本框的值發生變化時,有沒有辦法調用javascript函數?
嘗試onchange事件,但這似乎只有在用戶手動更改文本框值時才起作用。
乾杯,
Breandán
不,javascript觸發的對錶單元素的更改不會觸發事件。如果他們這樣做,這會導致各種遞歸無限循環。
簡單的解決方案是每當您更改文本框的值時手動調用您的onchange函數,但是您也可以使用某種包裝函數。作爲一個非常基本的例子:
function updateTextField(new_text) {
text_field.value = new_text;
text_field.onchange();
}
假設前端是HTML:
你可以安裝一個timout回調和查詢文本框的內容,比方說,100msecs間隔並將其與以前存儲在變量中的一些值。
關鍵詞:window.setTimout(),window.setInterval()
當設置從JS代碼的文本框的內容,叫喚傳遞設置文字的另一種功能,你可以調用它來自你需要的地方,然後做你的邏輯。
嘗試斷開負責使用的setTimeout從onchange事件的執行路徑改變控制的值的邏輯。
<html>
<head>
<script type="text/javascript">
function setValue(target) {
alert("changed - value: " + target.value);
setTimeout("reallySetValue('" + target.id + "');", 1);
}
function reallySetValue(id) {
var control = document.getElementById(id);
control.value += control.value;
}
</script>
</head>
<body>
<form>
<div>
Enter "a" here:
<input type="text" id="test" onchange="setValue(this)">
<br/>
<br/>
<input type="text">
</div>
</form>
</body>
</html>
所示。您可以使用優秀的event.simulate.js做到這一點。不過,該腳本依賴於Prototype.js庫。
如果你想要這個不依賴於外部庫,看看在fireEvent
和createEvent
功能。你如何能實現一個簡單的演示:
function triggerEvent(element, eventName)
{
if (document.createEvent)
{
var evt = document.createEvent('HTMLEvents');
evt.initEvent(eventName, true, true);
return element.dispatchEvent(evt);
}
if (element.fireEvent)
return element.fireEvent('on' + eventName);
}
triggerEvent(document.getElementById('myTextbox', 'change'));
使用event.simululate.js,你會做這樣的:
Event.simulate('myTextbox', 'change');
一個類似的問題在這裏問:Trigger an event with Prototype。
編輯:雖然有可能使用document.getElementById('myTextbox').change()
,我不會推薦這樣做,因爲它會讓您的代碼更加靈活。將附加onChange事件附加到文本框時,手動調用change()事件時這些事件不會觸發。使用上述方法,事件將會傳播,就像事件是用戶觸發的一樣。
在Web瀏覽器中,控件上的編程更改不會觸發該控件上的事件。您必須指示更改文本框值的代碼來觸發onchange事件。這是你如何能做到這在普通的JavaScript:
var textbox = document.getElementById("boxId");
textbox.value = "Abc";
textbox.onchange();
當然,使用庫如jQuery使得它更容易和更強大的:
$("#boxId").val("Abc").change();
我建議你看在YUI的自定義事件例如: YUI Custom Event Example Link
所有你需要的是重視這個腳本活動操作
<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/yahoo-dom-event/yahoo-dom-event.js"></script>
然後你就可以使用自定義事件(無處不在HTML) fnSubscriberChange - 在這個Func裏你可以做任何你想做的事情。你可以把你的文本框更改值邏輯放在這裏,並取決於改變選擇框的值 - 調用所需的功能。 依賴於事件監聽的邏輯清晰且易於修改; YUI庫支持所有的瀏覽器,所以你不應該介意瀏覽器的功能。
文本框,然後選擇框:
<input type='text' id='id_text_fld' value=''/>
<select id='id_sel_one'>
<option value="test1">Test1
<option value="test2">Test2
</select>
<select id='id_sel_two'>
<option value="test3">Test3
<option value="test4">Test4
</select>
腳本事件:
<script>
(function() {
//create a new custom event, to be fired
var onChangeValue = new YAHOO.util.CustomEvent("onChangeValue");
// Attach change event listener for Select boxes by their IDs
YAHOO.util.Event.on(['id_sel_one', 'id_sel_two'], 'change', fnCallback, this);
// Function to call when Change event on Select occures
fnCallback = function(e) {
alert("This elem:" + this.id+ " changed value to:" + this.value);
// Fire our Custom event
onChangeValue.fire({dom_el: this}); // passing select box element [this] to function
}
// Listen for Custom event and call our Func
onChangeValue.subscribe(fnSubscriberChange); // Lets listen for ChangeValue event and call our Func
fnSubscriberChange = function(type, args) {
alert("Event type:" + type + " dom el id:" + args[0].dom_el.id);
var dom_el = args[0].dom_el; // Select Box that produces Change
};
})();
</script>