该beforeinput事件是否提供了一种便捷的方式来预览拟议修改的结果,以便在需要验证时可以阻止它?
我并不是在寻找其他方法来进行输入验证;我已经很清楚涉及keypress和input事件的方法,以及 HTML5 验证等。现在,我正在专门研究该beforeinput事件,看看它提供了什么。
到目前为止,这是我想出的最好的:
document.getElementById("phone").addEventListener("beforeinput", function(e) {
if(!/^(\d{0,7}|\d{3}-\d{0,4}|)$/.test(e.target.value + (e.data ?? ""))) {
e.preventDefault();
}
return;
});Run Code Online (Sandbox Code Playgroud)
<input id="phone">Run Code Online (Sandbox Code Playgroud)
上述代码片段中的文本字段应接受一个简单的 7 位电话号码,第三位数字后带有可选的破折号。
请注意,我正在附加事件的data属性附加到输入的当前值以创建修改值的预览。如果您仅按顺序输入输入,则效果很好。但是,例如,如果您输入所有 7 位数字,然后用箭头返回到第三个数字之后并尝试插入破折号,则您将无法执行此操作,因为验证假设您位于破折号所在的末尾无效的。如果您尝试替换或删除选择,则会出现其他问题。
解决这些问题需要准确的预览。有没有简单的方法可以从beforeinput活动中获得一个?
如果我想打一个JavaScript对象的属性不变,我可以使用对象的方法,如defineProperties(),defineProperty()和freeze().我的问题是,我如何对HTML元素属性做同样的事情?
我已经尝试过上述方法,虽然它们可以用来防止直接设置元素的属性(例如elem.id = 'foo';),但正如预期的那样,仍然可以通过改变底层属性setAttribute().
答案"不,不可能"是可以接受的,但我还没有遇到任何明确的声明.
如果你不知道我在说什么,试试这个:
<cffunction name="myFunc">
<cfargument name="myArg" default="foobar">
<cfdump var="#local#" label="local and arguments scopes before deleting myArg">
<cfset StructDelete(arguments, "myArg")>
<cfdump var="#local#" label="local and arguments scopes after deleting myArg">
<cfset StructDelete(local, "arguments")>
<cfdump var="#local#" label="local scope after deleting arguments scope">
<cftry>
<cfset writeOutput("myArg still exists, and evaluates to: " & myArg)>
<cfcatch>
<cfset writeOutput("myArg no longer exists")>
</cfcatch>
</cftry>
</cffunction>
<cfset myFunc()>
<cfexit>
Run Code Online (Sandbox Code Playgroud)
如果运行该代码,您将发现即使删除了参数和参数范围,您仍然可以通过无范围引用访问声明的参数.这意味着有一个未命名的作用域包含声明的参数的副本或对其值的引用.我想要找出的是,是否有某种方法可以直接使用此作用域,例如未记录的作用域名称或底层Java中的getter方法.现在考虑这是一个纯粹的学术问题,因为我很确定我可能想到的任何用例都会被大多数有信誉的程序员解雇.
编辑
我认为提供我目前对UDF范围的理解的细分可能是有用的,因为Adam的反应有点模糊了这些线条.为简单起见,我将排除cfc特定的东西......
没有范围或"var"关键字定义的变量放在调用页面的变量范围内.
在本地范围包含正在使用该功能执行期间创建的变量VAR关键字或本地范围的名称(例如local.myvar,本地["MYVAR"]).它还包含参数范围.
该参数的 …
据我所知,isValid函数不支持此功能,并且没有内置的"isUDF"或"isFunction"函数.到目前为止,我能够想到的最好的是
findNoCase("func", myUDF.getClass.getSimpleName()) neq 0
Run Code Online (Sandbox Code Playgroud)
在UDF上使用时,Java方法getClass().getSimpleName()似乎总是返回一个带有子字符串的值func.我对Java知之甚少,所以我不知道这有多可靠.
有没有更好的方法来识别对函数的引用?
coldfusion ×2
javascript ×2
arguments ×1
dom ×1
dom-events ×1
function ×1
html ×1
immutability ×1
scope ×1
types ×1
validation ×1
variables ×1