2009-02-26 116 views
2

我的表單上的文本框可能會根據各種下拉列表中選擇的內容而變化。Javascript事件在沒有用戶交互的情況下觸發?

當文本框的值發生變化時,有沒有辦法調用javascript函數?

嘗試onchange事件,但這似乎只有在用戶手動更改文本框值時才起作用。

乾杯,

Breandán

回答

7

不,javascript觸發的對錶單元素的更改不會觸發事件。如果他們這樣做,這會導致各種遞歸無限循環。

簡單的解決方案是每當您更改文本框的值時手動調用您的onchange函數,但是您也可以使用某種包裝函數。作爲一個非常基本的例子:

function updateTextField(new_text) { 
    text_field.value = new_text; 
    text_field.onchange(); 
} 
0

假設前端是HTML:

你可以安裝一個timout回調和查詢文本框的內容,比方說,100msecs間隔並將其與以前存儲在變量中的一些值。

關鍵詞:window.setTimout(),window.setInterval()

2

當設置從JS代碼的文本框的內容,叫喚傳遞設置文字的另一種功能,你可以調用它來自你需要的地方,然後做你的邏輯。

2

嘗試斷開負責使用的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> 

它在這裏 Changing a Textbox Value in its OnChange Event

1

所示。您可以使用優秀的event.simulate.js做到這一點。不過,該腳本依賴於Prototype.js庫。

如果你想要這個不依賴於外部庫,看看在fireEventcreateEvent功能。你如何能實現一個簡單的演示:

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()事件時這些事件不會觸發。使用上述方法,事件將會傳播,就像事件是用戶觸發的一樣。

1

在Web瀏覽器中,控件上的編程更改不會觸發該控件上的事件。您必須指示更改文本框值的代碼來觸發onchange事件。這是你如何能做到這在普通的JavaScript:

var textbox = document.getElementById("boxId"); 
textbox.value = "Abc"; 
textbox.onchange(); 

當然,使用庫如jQuery使得它更容易和更強大的:

$("#boxId").val("Abc").change(); 
0

我建議你看在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> 
相關問題