實時監聽js改變value,跨瀏覽器支持

想要實現的功能大概是這樣的:
有兩個文本框,其中一個只讀,另外一個能夠輸入。要求在可輸入文本框中輸入文本時,只讀文本框可以得到輸入的值,且只讀文本框旁邊出現提示信息,實時顯示只讀文本框的內容。
這個功能看是簡單,但其實並無想象的那麼簡單。(注意,可輸入框的處理沒什麼可討論的,關鍵是隻讀框的處理) html

一開始,咱們通常會想到在只讀文本框上運用onchange事件。一試,發現onchange根本沒用,該事件是在文本框得到焦點,而後內容改變失去焦點後才觸發的,如今在只讀文本框上根本沒有這些,它的內容是經過js改變的。因而,須要尋找另外的方法。 瀏覽器

這時,在網上找到了onpropertychange事件。該事件在文本框屬性改變時觸發,不論是經過什麼方式改變的。注意,是屬性改變,而不只僅是value改變。一試,果真好使。然而,這個事件是IE專有的。WEB開發,必須得考慮瀏覽器的兼容問題。因而繼續摸索…… app

在網上有看到了另一個事件:oninput。網上處處都是:fireFox中的該事件與IE中onpropertychange的事件等同。然而,我一試,發現根本不等同。oninput事件在fireFox中彷佛沒有起做用。通過一段時間測試,終於明白,原來oninput並不是與onpropertychange等同(網上處處處處亂轉貼,也不認真測試一下)。oninput只在用戶輸入值改變時觸發(即value改變),並不是全部屬性改變時觸發,並且,經過js改變value時,oninput不會觸發。這下鬱悶了。好不容易看到點但願,又再次陷入了失望,還好沒有絕望……哎,瀏覽器兼容問題真是麻煩。 函數

冥思苦想,總有又有了眉目。對於fireFox等瀏覽器,能夠經過定時器檢查只讀文本框的內容是否改變。測試後,終於大功告成。下面把代碼貼出來與你們分享。
在google Chrome測試也成功了(跟fireFox同樣的)。性能

HTML代碼:
測試

<table>
			<tr>
				<td>此處值經過js設置:</td>
				<td><input id="jsUserName" type="text" name="jsUserName" readonly/></td>
			</tr>
			<tr>
				<td>此處輸入值:</td>
				<td><input id="userName" type="text" name="userName"/></td>
			</tr>
		</table>

 

JavaScript代碼this

 

$(function()
		{
			var jsUserName = "";
			if($.browser.msie)	// IE瀏覽器
			{
				$("#userName").get(0).onpropertychange = setJsUserName;
				$("#jsUserName").get(0).onpropertychange = handle;
			}
			else	// 其餘瀏覽器
			{
				var intervalName;	// 定時器句柄
				$("#userName").get(0).addEventListener("input",setJsUserName,false);
				
				// 得到焦點時,啓動定時器
				$("#userName").focus(function(){
					intervalName = setInterval(handle,1000);
				});
				// 失去焦點時,清除定時器
				$("#userName").blur(function()
				{
					clearInterval(intervalName);
				});
			}
			
			// 設置jsUserName input的值
			function setJsUserName()
			{
				$("#jsUserName").val($(this).val());
			}
			
			// jsUserName input的值改變時執行的函數
			function handle()
			{	
				// IE瀏覽器此處判斷沒什麼意義,但爲了統一,且提取公共代碼而這樣處理。
				if($("#jsUserName").val() != jsUserName)
				{
					$("#toolTip").remove();
					$("#jsUserName").parent().append("<span id='toolTip'>看到這裏的信息代表,經過js改變input的值也能響應相應事件:<span  style="color:red;" mce_style="color:red;">" + $("#jsUserName").val() + "</span></span>");
					jsUserName = $("#jsUserName").val();
				}
			}
		});

 

說明:爲了方便,js代碼使用了jQuery。不使用是同樣的。
另外,考慮性能問題,能夠考慮什麼時候啓動定時器和清除定時器以及定時器延時時間。 google

總結: spa

一、onchange事件與onpropertychange事件的區別:
onchange事件在內容改變(兩次內容有可能仍是相等的)且失去焦點時觸發;onpropertychange事件倒是實時觸發,即每增長或刪除一個字符就會觸發,經過js改變也會觸發該事件,可是該事件IE專有。 code

二、oninput事件與onpropertychange事件的區別:
oninput事件是IE以外的大多數瀏覽器支持的事件,在value改變時觸發,實時的,即每增長或刪除一個字符就會觸發,然而經過js改變value時,卻不會觸發;onpropertychange事件是任何屬性改變都會觸發的,而oninput卻只在value改變時觸發,oninput要經過addEventListener()來註冊,onpropertychange註冊方式跟通常事件同樣。(此處都是指在js中動態綁定事件,以實現內容與行爲分離)

三、oninput與onpropertychange失效的狀況: (1)oninput事件:a). 當腳本中改變value時,不會觸發;b). 從瀏覽器的自動下拉提示中選取時,不會觸發。 (2)onpropertychange事件:當input設置爲disable=true後,onpropertychange不會觸發

相關文章
相關標籤/搜索