100 分 求解一个关于回车的问题

rainingheart 2006-11-28 02:53:54
这问题是我在别的论坛中看到的,我想想自已也不会,所以来请各位CSDN的高手帮帮忙


下面是原文(原网址是http://www.chinaaspx.com/comm/dotnetbbs/Showtopic.aspx?Forum_ID=5&Id=252416&PPage=2)


页面回车按钮的困惑
虽然可以避免问题,但是问题仍然存在:
一个HTML页面,很简单的只有一个表格,两个测试用的js


<html>
<head>
<script>
function onSub() {
alert("button submit");
return true;
}

function keypress() {
if(event.keyCode == 13) {
document.getElementsByName("sub1")[0].click();
return false;
}
return true;
}

function onSubmit() {
alert("automatic submit");
return true;
}
</script>
</head>
<body>
<form onsubmit="return onSubmit();">
<table width=200 height=200>
<tr>
<td>
<input type="text" name="text1">
</td>
<td>
<input type="submit" value="submit" name="sub1" onclick="return onSub();">
</td>
</tr>
</table>
</form>
</body>
</html>

解释一下,画面上只有一个textbox和一个submit类型的按钮,按照常理来讲,在html画面上点击回车按钮,默认激发的submit按钮事件。现在我做了这个一个画面,当在textbox中点下回车键的时候,没有激发submit按钮事件,而是直接form的onsubmit事件,于是,画面上只弹出了“automatic submit”,但是,我在那个textbox下面同样的copy了一个textbox的时候,名字不一样的当然,再在textbox中点回车键的时候,就触发了submit按钮,于是,画面就弹出了两个message,第一个“button submit”,第二个“automatic submit”,思考不得其解,于是,我仍然只保留了第一个textbox,把后来追加的textbox删除掉了,加上了一个属性,onkeypress="return keypress();",结果和有两个textbox的结果一致,废话,当然一致了,嗯,由于没有仔细的了解html的精髓,所以这个问题想不清楚,如果大家有知道的,不访告诉一下兄弟。ok?

为什么一个控件数时不激发而有两个的时候就会默认去激发submit按钮了呢???

...全文
783 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainingheart 2006-11-29
  • 打赏
  • 举报
回复
谢谢各位
rainingheart 2006-11-29
  • 打赏
  • 举报
回复
呵呵,谢谢各位高手了
终于明白了
JK_10000 2006-11-29
  • 打赏
  • 举报
回复
页面只有一个text时,ie的一个bug/或是自作聪明的一种处理,
在页面再加一个<input style="display:none">就了事
cxj1128zj 2006-11-28
  • 打赏
  • 举报
回复
QDJSADFJLAJSL
文盲老顾 2006-11-28
  • 打赏
  • 举报
回复
mark
memoriccell 2006-11-28
  • 打赏
  • 举报
回复
前一阵子也碰到这样的问题了,最后用想办法用js把text的回车提交问题给屏蔽掉了,呵呵
确实很头疼,百思不得其解,看了大家的回复,原来有可能是这么回事
谢了
tallen2005 2006-11-28
  • 打赏
  • 举报
回复
说不定是IE的一个小bug大家争相研究觉得意义不大!!
你们用其它的浏览器试试就知道结果了!
加上onkeypress就解决的问题觉得讨论的意义不大~~
如果大家不同意我的说法,有精力研究就当我没说!
li1229363 2006-11-28
  • 打赏
  • 举报
回复
skendy(那年杀猪亏了) 的说法坚决同意!!微软啊~世界上最霸道的软件公司了
hax 2006-11-28
  • 打赏
  • 举报
回复
哦,还有,ff在没有submit或button的时候表现与ie是一致的,即仅单个文本框会触发onsubmit,而opera总是会触发。

相对来说,ff的行为最复杂。

1. 有submit或button时,触发submit或button的onclick,然后该onclick的默认行为会触发onsubmit。
2. 没有submit或button时,
2.1 只有一个text框时,触发onsubmit;
2.2 有多个text框时,不触发onsubmit。

opera的行为是第2条简化为(不管几个text框)总是触发onsubmit。

ie最傻呆:

1. 只有一个text框时,(不管有没有submit),直接触发onsubmit
2. 有多个text框时,触发submit上的onclick,其默认行为为触发onsubmit。

显然,我们很容易推理出来:最早ie是没有对单个text框做处理的,后来要加上这个feature,于是以很粗陋的打patch的方式对单个text框做了特殊处理,结果就是如此了。
theseraph 2006-11-28
  • 打赏
  • 举报
回复
刚才一下又乱了。现在又绕回来了。
还是象我刚才所说的:
IE为了满足对一个输入控件进行自动提交,实际上它就采取绕过SUBMIT按钮,直接提交了。
而当输入控件不只一个的时候,就不能应用那套默认机制,而必须通过SUBMIT按钮来进行提交,所以按钮的事件又好使了。
skendy 2006-11-28
  • 打赏
  • 举报
回复
function keypress() 这个函数本来一直就没有用...

如果你想用,应该这样写
<body onLoad="keypress()">
....


以后测试JavaScript最好用Firefox..
IE是为它的Jscript服务的...
theseraph 2006-11-28
  • 打赏
  • 举报
回复
不对,错了,乱了,哈

实际上,是相当于在只有一个文本框时,SUBMIT按钮无效了,被越过了。当有多个文本框时才正常。

而且
function keypress() {
if(event.keyCode == 13) {
document.getElementsByName("sub1")[0].click();
return false;
}
return true;
}
可以去掉,效果一样
hax 2006-11-28
  • 打赏
  • 举报
回复
ie的特殊处理,你可以认为是它的bug,估计是为单个input写特例代码的后遗症(或者m$的fans可以认为这是一个feature)。

ff和opera的处理是完全一致的,总是会触发第一个submit按钮或者button按钮(不是input type=button)的onclick,而不管有几个文本框。

最佳实践:不要在submit上写onclick事件,只使用form上的onsubmit。
theseraph 2006-11-28
  • 打赏
  • 举报
回复
楼主可以干脆把
<input type="submit" value="submit" name="sub1" onclick="return onSub();">
去掉
也就是不要提交按钮

然后,当表单内只有一个INPUT文本框时,你按回车,也会执行自动提交事件。
这是因为,只有一个输入控件的情况下,你按回车,毫无疑问就是应该要提交表单了。
但当有一个以上的输入控件时,这个默认就不能成立了,因为其它的输入控件未必是输入有效的状态嘛。
chenguang79 2006-11-28
  • 打赏
  • 举报
回复
<SCRIPT LANGUAGE="JavaScript" event="onkeydown" for="document">
if (event.keyCode == 13){
document.UserLogin.submit();
}
</SCRIPT>



<area shape="circle" coords="23,40,24" href="#" onclick=javascript:document.UserLogin.submit();>

UserLogin为你的form名
skendy 2006-11-28
  • 打赏
  • 举报
回复
兄弟还在阿,
我刚才做了测试,具体什么原因,我现在不能给出肯定的答案。
你把你的程序用Firefox浏览器测试,我怀疑是IE对JavaScript支持的方式不一样,Firefox支持JavaScript是正宗的。
多做几个测试,比如:Form里面添加<img .... /> <input type="radio" ... /> 或者 把最后的<input type="submit" ....> 修改成<input type="button" /> 然后测试在不同的内容怎么调用JavaScript

我还在翻书,《JavaScript权威指南》 太厚了,一下子也找不出来正确答案....
rainingheart 2006-11-28
  • 打赏
  • 举报
回复
呵呵,CSDN的人真热心啊^_^
skendy 2006-11-28
  • 打赏
  • 举报
回复
呵呵,这个问题的确比较怪...
我翻书找找..
NiuniuASP 2006-11-28
  • 打赏
  • 举报
回复
有多个文本框时,表单的 INPUT type=submit 元素也带有黑色边框,那不是同样意味着用户按下回车键即可提交表单?为何就执行INPUT type=submit 元素的onclick事件呢?
li1229363 2006-11-28
  • 打赏
  • 举报
回复
我也不理解的说~高手请回答~

加载更多回复(6)

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧