2016-11-21 48 views
0

我在我的html文件中有一個文本框,並且我想要在用戶更改其值並確定其更新值時檢測。文本框HTML代碼:在scala js中跟蹤文本框中的更改

<input type="text" name="amount" id="amount" value="0" onchange="Demo().change(id,value)"> 

,在我的斯卡拉文件,我已經實現了一個功能「變」爲:

@JSExport 
def change(id:String):Unit={ 
appendPar(document.body,"Text Box value is changed and the new value is : "+document.getElementById(id).getAttribute("value")) 
} 

但它不是我的情況下工作。我在這裏做錯了什麼? 有什麼建議嗎?

更新:只有在更改文本框中的值後按Enter鍵時纔會觸發事件。此外,它將更新值顯示爲「0」。我怎樣才能讓它從文本框取代我的預定義值?

+1

一般性評論:關於這些HTML實體如何工作的問題以及幾乎任何問題都不是真正的Scala.js問題,它們是HTML/DOM/JavaScript問題。請記住,Scala.js只是JavaScript上的一個編譯器 - 關於* language *,功能僅僅是普通的瀏覽器功能 - 平均而言,Scala.js社區並不關注DOM功能。所以我懷疑如果包含「html5」和/或「dom」標籤,您可能會得到更快的答案...... –

+0

對於手頭的問題 - 我只希望它在按下回車鍵之後觸發事件,因爲[這是文檔指出的內容](https://developer.mozilla.org/en-US/docs/Web/Events /更改)。你什麼時候想要得到這個信號,如果不是當他們按下Enter鍵? –

+0

你確定你正在將'id'傳遞給你的函數嗎?我承認,我對你所展示的HTML實際上有效而感到有點驚訝 - 我不清楚它是如何捕獲正確的ID的...... –

回答

0

您需要使用其中一個onkey處理程序。例如:

注意IIRC,這也將在用戶使用箭頭鍵四處移動觸發。所以,如果你真的想,如果它變成只能叫,你就需要引入一個變量,並檢查:

var lastValue: String = "" 

@JSExport 
def change(id:String): Unit = { 
    val newValue = document.getElementById(id).getAttribute("value") 
    if (lastValue != newValue) { 
    appendPar(document.body, 
     "Text Box value is changed and the new value is : " + newValue) 
    lastValue = newValue 
    } 
} 
1

可以使用input事件,而不是change,如果你可以忽略IE < = 9。

的DOM輸入事件時的或元件的值改變

MDN被同步地燒製。

請注意,對於非文本/文本區域輸入(例如複選框,單選按鈕等),還有其他瀏覽器兼容性警告,但您可以在這些事件上使用change事件。有關詳細信息,請參見http://caniuse.com/#search=input


我也看不到變量id來自您的代碼。如果這是您想要的,您應該傳遞字符串"amount"而不是id,如下所示:Demo().change("amount")。這將是無法使用的,但至少應該起作用。

如果您希望該方法更通用,請注意,JavaScript將Event對象傳遞給所有事件處理程序,並且它有一個包含發生事件的HTML元素的target鍵(在這種情況下,這將是您的textarea的)。你可以很容易地得到targetvalue

如果這是令人困惑的,我建議你先嚐試在JS中實現這一點,然後將其轉換爲Scala。你不想同時在兩條戰線上作戰。