2016-11-21 52 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。你不想同时在两条战线上作战。