b/s,回车事件

cjlxm1 2008-06-10 01:02:51
大家好,应用户要求,现雇员信息录入页的"添加""修改"信息的Control(textbox,checkbox)等全由回车键移动光标.
问题:基本功能已实现,但发现用户敲回车很快的时候,一下子会插进多条一样的记录.
如:输入备注的textbox值,光标自动移到"更新"btnupdate上,用户输入备注textbox值后,敲了很多次回车,发现插入了两条以上的记录.
请问这个问题应怎样解决?需考虑主键自动生成的情况.谢谢!
...全文
939 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjlxm1 2008-07-07
  • 打赏
  • 举报
回复
谢谢各位的解答,特别谢谢kingdomgps
zyhd82 2008-07-01
  • 打赏
  • 举报
回复
同意43楼!
software820830 2008-07-01
  • 打赏
  • 举报
回复
要先把回车健转成tab健,再判断一下就行了
software820830 2008-07-01
  • 打赏
  • 举报
回复
function document.onkeydown(e)
{
var e = window.event;
if (e.keyCode == 13)
{
e.keyCode=9;
var obj = event.srcElement;
var name1=obj.name;

if(name1!=undefined)
{
if(name1=="控件id1")
{
e.keyCode=65;
return false;
}
if(name1=="控件id2")
{
e.keyCode=65;
return false;
}
if(name1=="控件id3")
{
e.keyCode=65;
return false;
}
}
}
}
我是这样写的,控件是SPREAD for web 你改改吧
注册失败 2008-07-01
  • 打赏
  • 举报
回复
第一次post后,浏览器中输入框的值都清除了?是它浏览器自带功能吗,它会自动清空吗?
post过后,浏览器会接受到服务器的响应,而服务器的响应给的是初始页面,因此浏览器显示的也就是输入框的值被清空了
这个与服务器的响应数据有关系,你的page_loag里写一段 xxxText.Text = "asd";那展现出来肯定也是asd了

我在btnupdate_click中清空了输入框的值,而脚本被执行到了,但发现还是插重了.
脚本的执行是在后台代码之前的,所以你从后台清空是不会影响到脚本执行的结果的
但你又不能用脚本清空输入框的值,因为那样会导致服务器端读不到用户的实际输入数据

to kingdomgps:
function ctr_value_valid_js()
加上这个: document.getElementById('btnUpdate').disabled= true;

btnupdate事件一次都没被执行,请问需在哪改变btnupdate的enabled属性呢.

我写错了,我当时的做法是使用了一个隐藏button
当时我的做法是这样的:把你现在的这个btnupdate隐藏起来了,不给客户看到,设置为width=0px,height=0px
然后加一个<input type="button" id="ClientUpdate" text="update" onclick="return ctr_value_valid_js();">
在ctr_value_valid_js() 还加了一句document.getElementById('btnUpdate').click();来触发btnupdate的后台事件
这样的,所以我加了document.getElementById('btnUpdate').disabled= true;
这样多次按这个ClientUpdate不会引起btnUpdate的事件的多次触发

插入很慢实际上就是服务器响应慢,而浏览器在没有接受到服务器响应的时候是不会更新当前页面的
因此用户多次点击,浏览器仍然会向服务器post本页面的信息,所以会多次重新插入同样的记录
xin_shui 2008-06-30
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 xin_shui 的回复:]
那你声明一个全局变量bool isDuplicate=false
事件触发后
{
if(isDuplicate)
{
//返回(前面可以加一个提示,如23楼所说“"按**,慢点会死?")
return
}
isDuplicate=true;
执行插入操作
}
[/Quote]
那你用这个试试,写在button_click事件里面。
cjlxm1 2008-06-30
  • 打赏
  • 举报
回复
Page_Load事件里:
BtnUpdate.Attributes.Add("onclick", "return ctr_value_valid_js()"); // add lxm 20080623

每次触发btnupdate事件时,ctr_value_valid_js()都会调过,所以这样连一条数据都插入不进.

cjlxm1 2008-06-30
  • 打赏
  • 举报
回复
to kingdomgps:
function ctr_value_valid_js()
加上这个: document.getElementById('btnUpdate').disabled= true;

btnupdate事件一次都没被执行,请问需在哪改变btnupdate的enabled属性呢.

另:我在btnupdate_click事件里加上这个,btnupdate.enabled=true;

但还是没有用.
cjlxm1 2008-06-30
  • 打赏
  • 举报
回复
顶起,

分少了,可加的.
cjlxm1 2008-06-30
  • 打赏
  • 举报
回复
to kingdomgps:
问题还是没能很好的解决,仔细看了各位的回复信息,
这个不太明白,现加了js可发现"btnupdate"执行慢时,还要可以插重.
这个没能很好的理解.


"用脚本的原因:因为脚本是在浏览器触发的,当你第一次post之后,浏览器中输入框的值都清除了
因此你的脚本检测肯定是通不过的,这样就直接阻止了btnupdate的服务器端调用,因此不会多次插入数据了"

第一次post后,浏览器中输入框的值都清除了?是它浏览器自带功能吗,它会自动清空吗?
我在btnupdate_click中清空了输入框的值,而脚本被执行到了,但发现还是插重了.

whoisi2222 2008-06-26
  • 打赏
  • 举报
回复
用sleep()设置过1,2的具体函数去查baidu
GhostAdai 2008-06-26
  • 打赏
  • 举报
回复
mark一下慢慢看。
cjlxm1 2008-06-26
  • 打赏
  • 举报
回复
谢谢,
我不知道我这样写对不对.当"更新"执行慢的时候,(也就是说点了更新后要等待一阵子才执行完成)
发现有时候还会插重,有些页面的"更新"执行快,就不会有问题.
主要如下:
js
function ctr_value_valid_js()
{
if(Trim(document.getElementById('txtamount').value)=="" || Trim(document.getElementById('txtamount').value)=="0")
{
return false;
}
if(Trim(document.getElementById('txtVendCD').value)=="" )
{
return false;
}
if(Trim(document.getElementById('txtwarename').value)=="" || Trim(document.getElementById('txtWareCD').value)=="")
{
return false;
}
return true;
}
function Trim(str) //去空格函数
{
return str.replace(/^\s*(.*?)[\s\n]*$/g, '$1');
}

cs:
protected void BtnUpdate_Click(object sender, EventArgs e)
{...
if (ctr_value_valid() == true) //控件有效性检查
{
GetDTOOR1(Dtoor1);
int result = entor1.InsertOrderCD(Dtoor1);
if (result > 0)
{
//成功插入
//ctr_values_clear(), //发现有没有这个与插不插重没关系
}
else
{
Msg.ShowResult_ajax(UpdatePanel1, SystemContant.MESSAGE_ID_UPDATE_FAIL);
return;
}
}
}
Page_Load事件里:
BtnUpdate.Attributes.Add("onclick", "return ctr_value_valid_js()"); // add lxm 20080623


注册失败 2008-06-26
  • 打赏
  • 举报
回复
当"更新"执行慢的时候,(也就是说点了更新后要等待一阵子才执行完成)

当你的更新执行慢的时候,点了提交,实际上 btnUpdate还是可以点的,
这个时候第一个post已经过去,但是没有执行完,因此页面没有刷新
多次连续回车,这个时候就会引起你的过程多次重复执行

解决办法,修改你的ctr_value_valid_js()函数

function ctr_value_valid_js()
{
if(Trim(document.getElementById('txtamount').value)=="" ¦ ¦ Trim(document.getElementById('txtamount').value)=="0")
{
return false;
}
if(Trim(document.getElementById('txtVendCD').value)=="" )
{
return false;
}
if(Trim(document.getElementById('txtwarename').value)=="" ¦ ¦ Trim(document.getElementById('txtWareCD').value)=="")
{
return false;
}
document.getElementById('btnUpdate').disabled= true;
return true;
}

注册失败 2008-06-25
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 cjlxm1 的回复:]
引用 24 楼 kingdomgps 的回复:
能否解释一下:
1 为什么用了ctr_values_clear(),还能够通过ctr_value_valid()并插入成功,
kingdomgps的意思是没有执行ctr_values_clear(),按理说应该是没有执行,否则是不能通过服务端验证函数ctr_values_valid()的,可为什么没能触发呢?

2我在插入成功后,至btnupdate.enabeld=false,而回车敲快的时候,为什么还能插入多条记录呢?
[/Quote]

试着解释下,不一定完全正确:

1.你的ctr_values_clear()执行了,是在服务器端执行的,
客户端的输入框的值被清除掉的,这个是没有问题的。但是用户连续多次快速的post给你数据,并不是说第二次post之后就没有值了,值仍然是有的
因此你的ctr_values_valid()就不触发,这个应该是跟ViewState有关
记得APS.net有个问题么:刷新页面的时候会提示: 当前页面已经更行,按刷新更新页面,按确定刷新后,控件中的值不会消失的
理论上说刷新页面后,你的控件是从服务器端重新加载的,值应该是没有的才对,为什么会这样我还没搞清楚

2.用户敲回车后到你的数据插入成功是有一个过程的
中间会调用到你的page_load,虽然你的代码中写了btnupdate.enabeld=false,但是调用page_load后,
btnupdate.enabeld就不再是false而是页面加载的最初状态了,也就是btnupdate.enabeld=true
所以回车敲快的时候实际上是多次按理btnupdate按钮,当让多次插入数据了

用脚本的原因:因为脚本是在浏览器触发的,当你第一次post之后,浏览器中输入框的值都清除了
因此你的脚本检测肯定是通不过的,这样就直接阻止了btnupdate的服务器端调用,因此不会多次插入数据了
cjlxm1 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 kingdomgps 的回复:]
引用 9 楼 cjlxm1 的回复:
按理说:
每次插入时,都要判断这个ctr_value_valid() ,而插入成功时,我用ctr_values_clear()清空所有控件的值,

应该是插不进的才对,可发现敲快的时候总会有多插的情况,郁闷啦.

谢谢楼上的,能详细点吗?


你确定你的 ctr_values_clear() 在插入成功之后被调用了么?

我的代码结果是不会多次触发,一定会触发到ctr_value_valid()里的提示

ctr_value_valid()有客户端验证,如果你…
[/Quote]

能否解释一下:
1 为什么用了ctr_values_clear(),还能够通过ctr_value_valid()并插入成功,
kingdomgps的意思是没有执行ctr_values_clear(),按理说应该是没有执行,否则是不能通过服务端验证函数ctr_values_valid()的,可为什么没能触发呢?

2我在插入成功后,至btnupdate.enabeld=false,而回车敲快的时候,为什么还能插入多条记录呢?
huozhao 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 cjlxm1 的回复:]
引用 22 楼 xin_shui 的回复:
点击按钮后,enable设为false,执行完毕,改为true

[/Quote]

这个 有一个button能设置成default,应该可以。
xin_shui 2008-06-23
  • 打赏
  • 举报
回复
写在写在btnupdate的click事件里,你试试看。
cjlxm1 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 xin_shui 的回复:]
那你声明一个全局变量bool isDuplicate=false
事件触发后
{
if(isDuplicate)
{
//返回(前面可以加一个提示,如23楼所说“"按**,慢点会死?")
return
}
isDuplicate=true;
执行插入操作
}

可以不?
[/Quote]

写在btnupdate的click事件里吗?服务端代码?
我现用了这个:
ctr_value_clear()插入后清空控制的值,再用ctr_value_valid(),服务端代码判断控件的值输入是否符合要求,问题是多次敲回车后,第一次能正常插入,第二次...似乎没有执行ctr_value_valid()代码,所以执行的话,是插不进的.


这种情况一定要用js判断吗?
xin_shui 2008-06-20
  • 打赏
  • 举报
回复
那你声明一个全局变量bool isDuplicate=false
事件触发后
{
if(isDuplicate)
{
//返回(前面可以加一个提示,如23楼所说“"按**,慢点会死?")
return
}
isDuplicate=true;
执行插入操作
}

可以不?
加载更多回复(33)

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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