javascript 为何浏览器加载就触发了网页的input的onchange事件,而后概不触发。新人请多多指教

理论效果:通过t2(id)的onchange事件,来让t3.value=t1.value-t2.value<body><p><inputtype="text"id="t1... 理论效果:通过t2(id)的onchange事件,来让t3.value=t1.value-t2.value
<body>
<p>
<input type="text" id="t1" value="0" />
-
<input type="text" id="t2" value="0" />
=
<input type="text" id="t3" />
</p>

</body>
<script type="text/javascript">
//声明一个对象,让对象的属性来保留所有;
var lab3 = {};
//对象里的$ 函数来获得id;
lab3.$ = function(id) {
return document.getElementById(id);
}
//获得id三个input的id
lab3.t1 = lab3.$("t1");
lab3.t2 = lab3.$("t2");
lab3.t3 = lab3.$("t3");
//先设置两个check的值,后面设置为真的时候相减
lab3.check = false;
lab3.check1 = false;

//当t2(第二个input)发生改变的时候才会执行result函数;
//lab3.t2.onchange = result();
//一开始我以上对象的属性的方法不能但是我错了。。。
document.getElementById("t2").onchange = result();
function result() {
var temp1=0;
var temp2=0;
//注意这里的check函数不是lab3.check;
lab3.check = check(lab3.t1.value);
lab3.check1 = check(lab3.t2.value);
//如以上为真则执行
if (lab3.check && lab3.check1) {
temp1 = parseFloat(lab3.t1.value);
temp2 = parseFloat(lab3.t2.value);
lab3.t3.value = (temp1 - temp2).toString();
return true;
}
//用来检测用的。。。
alert("dfdf");
//如果都没有则函数默认设置t3的value为0
lab3.t3.value = "0";
}
function check(v) {
alert(v);
//javascript的正则表达式 下含义为:0-9当中的数出现至少一次无上限
var regex = /[0-9]+/;
//用正则表达式的test方法匹配v如果匹配到了则返回true;
if (regex.test(v)) {
return true;
}
return false;
}
</script>
不明真相:
这是在火狐里的,当浏览器第一次执行的时候,就自动执行了onchange事件,而事实是我的根本没有动t2里的值!
奇怪的事发生了,就是当我把里面的值改变之后f5刷新之后,可以求得,改变之后的值。

而在IE里就没那么好了改变了f5刷新也没有用!

还有一个奇怪的就是当我在IE8环境下,运行这段代码的时候会出现一个警告!具体就是:**未实现
,是属性还是什么的忘记了。

是我的逻辑错误吗?还是代码那里错了,请指正!
展开
 我来答
曾经有个怪叔叔
2015-04-04 · TA获得超过534个赞
知道小有建树答主
回答量:369
采纳率:100%
帮助的人:361万
展开全部
<p>
<input type="text" id=t1 value="0" />
-
<input type="text" id=t2 value="0" onchange="ff()" />
=
<input type="text" id=t3 />
</p>
</body>
<script>
function ff(){
t3.value=t1.value-t2.value
}
</script>

你写了一大堆,到底要干什么呀?
更多追问追答
追问
通过t2(id)的onchange事件,来让t3.value=t1.value-t2.value

而不是简单的运行就这样子。
function ff(){
t3.value=t1.value-t2.value
}
而不是自己要算啥还要修改代码。。
看提问的开头我就说了的,要的每次的onchange!至于写那么多纯粹是新手练手!可能你没看懂!
至于我要干嘛,代码的每一条都有我的注释!如不懂请认真看一下!
追答
好吧,那按照你的逻辑走一遍,

document.getElementById("t2").onchange = result();

赋值有问题,你这样写有问题,result 是个方法,返回值是 true 或者false 等等,你要把这个返回值赋给 onchange 事件么?
显然不是
应该是
document.getElementById("t2").onchange = result;
将result 这个对象给 onchange对象。也就是让onchange这个对象指向你的result对象。

IE 和 火狐在这里有不同,IE会认为你还没有注册 result 所以报 尚未实现。

而火狐会真的 去执行(他倒是可以在后面找到这个result),但是按照你的写法要将result()的结果返回,所以会真的去执行这个结果,但是执行结果之后,你的onchange 方法变成了一个 true(false),也就没办法再次执行了。

还要解释一下,IE中 不能绑定onchange为result(),找不到
但是为什么能注册 onchange为result 就能找到呢。result 的定义在 这个绑定的后面呀。
实际上,在绑定的时候 没有将result 的实现绑定样,而是讲一个空的内存地址帮过来了,不过这个空地址有名字为 result,当你注册 result 时才将这个空地址的内容填上了你要的内容。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式