请问如何暂时屏蔽掉鼠标左键的单击

netstarry 2002-10-10 11:00:02
有一个用<a href="#" onclick="">方式激活的函数,因为该函数处理时间比较长,大概半秒左右,如果连续点击该链接就会出现该函数的连续执行,会消耗大量的时间,而实际只有最后一次的点击有用,有什么方法能够在第一次点击后函数执行中屏蔽掉以后的点击,直到该函数执行完,谢了!
...全文
69 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
netstarry 2002-10-12
  • 打赏
  • 举报
回复
非常感谢各位的参与,其实我不是经常写javascript代码的,所以对javascript不很了解,
还是 onestab(┼─) 说得对,每个click事件都会被按顺序相应,这样就不可能采用在调用函数中采用某种方法屏蔽后来的click事件
如果不使用延迟的方法,问题几乎不能解决,所以
goldenlove(潇洒.net)和bencalie(Bencalie) 的方法中均使用了延迟来屏蔽短时间内的click事件,这样的处理对速度慢的机器是有效的,但是对于速度快的机器,相当于人为的降低了机器速度,不太可取,
net_lover(孟子E章)的方法是一个很奇怪的现象,如果不使用该方法,会出现我前面说的一种停顿现象,使用了该方法,虽然不能屏蔽掉后续的连续点击,但是却让每次点击引发的函数所产生的效果显示了出来,我认为这个方法是最佳的,速度快的机器不会出现停顿,速度慢的机器也不会出现我前面说的那种停顿现象(就像是没反应了一样),我采用了这个方法

十分感谢大家的参与,结贴
coolhealth 2002-10-12
  • 打赏
  • 举报
回复
下次要留意它!
潇洒 2002-10-11
  • 打赏
  • 举报
回复
哦?... 不是说撤退了吗?.........
方工 2002-10-11
  • 打赏
  • 举报
回复
这是个非常古老的问题,牵涉到script的运行机制。
函数运行当中是无法得知a被点击的事件的。(没有VB的doEvents方法)
当他知道这个事件时,函数已经结束了。
就像一个人无法同时跨过两条河流。
较好的解决办法是友好地提醒用户,该段处理费时较长,请耐心等待。
bencalie 2002-10-11
  • 打赏
  • 举报
回复
<body>
<a href="#" onclick="fun1()">123</a><input id=a1>
<script>
for(i=0;i<document.all.tags("A").length;i++)
document.all.tags("A")[i].attachEvent("onclick",setCap)
function setCap(){
document.body.setCapture();
}
var i=1
function fun1(){
//你要执行的代码
if(i<=10){
a1.value=i
setTimeout("fun1()",500)
i++
}
else{
document.body.releaseCapture()
i=1
}
}
</script>
netstarry 2002-10-11
  • 打赏
  • 举报
回复
写反了

这样处理后
document.body.releaseCapture();放在函数末尾
出现不点击右键不能开启捕捉的情况
//这段代码放在了页面的最后
<script>
for(i=0;i<document.all.tags("A").length;i++)
document.all.tags("A")[i].attachEvent("onclick",setCap)
function setCap(){
document.body.setCapture();
}
</script>
netstarry 2002-10-11
  • 打赏
  • 举报
回复
bencalie(Bencalie)

方法基本可以使用
能不能不用定时,而在我的函数执行完就恢复捕捉?
我试了 将function setCap(){
setTimeout('document.body.releaseCapture()',2000);
document.body.setCapture();
}
改为
function setCap(){
document.body.releaseCapture();
}
将document.body.setCapture();放在我的函数为末尾,不行

将document.body.releaseCapture();放在函数开头
将document.body.setCapture();放在函数末尾
将出现不点击右键不能开启捕捉的情况

只能使用定时吗?
潇洒 2002-10-11
  • 打赏
  • 举报
回复
嘿嘿.. 最终版. 不但可以每个连接都能设置不同的 function.
现在连停止的秒数都可以自定义了. 每个连接的停顿时间都不一样. ^_^


<a href=# onclick=alert('fine'),st(this,2)> link </a><br>
<a href=# onclick=alert('link_disabled'),st(this,4)> disabled </a><br>
<a href=# onclick=alert('link_enabled'),st(this,10)> enabled </a>

<script>
var k=new Array(),obj=document.all.tags("A");
for(i=0;i<obj.length;i++)
k[i]=obj[i].onclick
function st(obj,wt){obj.onclick=new Function('return false'),alert('wait '+wt+' 秒!'), setTimeout('rst()',wt*1000);}
function rst(){for(i=0;i<obj.length;i++) obj[i].onclick=k[i];}
</script>
bencalie 2002-10-11
  • 打赏
  • 举报
回复
goldenlove(潇洒.net),一起撤退,我们败了,呵呵
潇洒 2002-10-11
  • 打赏
  • 举报
回复
服了你了...... 还非得要我把鱼噻到你嘴里你才吃啊 !?!...

<a href=# onclick=alert('fine'),st(this)> link </a><br>
<a href=# onclick=alert('link_disabled')> disabled </a><br>
<a href=# onclick=alert('link_enabled')> enabled </a>

<script>
var k=new Array();
for(i=0;i<document.all.tags("A").length;i++)
k[i]=document.all.tags("A")[i].onclick

function st(obj){obj.onclick=new Function('return false'), setTimeout('rst()',2000);}
function rst(){for(i=0;i<document.all.tags("A").length;i++) document.all.tags("A")[i].onclick=k[i];}
</script>
bencalie 2002-10-11
  • 打赏
  • 举报
回复
晕,没试试不要乱讲

<body>
<a href="#" onclick="alert();">123</a>
<a href="#" onclick="confirm('123');">123</a>
<script>
for(i=0;i<document.all.tags("A").length;i++)
document.all.tags("A")[i].attachEvent("onclick",setCap)
function setCap(){
setTimeout('document.body.releaseCapture()',2000);
document.body.setCapture();
}
</script>
netstarry 2002-10-11
  • 打赏
  • 举报
回复
to goldenlove(潇洒.net)
我是在说你的方法不行,你的方法使得每个a标签的onclick都执行相同的函数,包括参数,但是我要做的是每个a标签的onclick执行的函数参数是不同的,这样你的方法就不能工作了

bencalie(Bencalie)的方法好像也存在同样的问题,就是要求每个a标签的onclik方法执行相同的函数,包括参数
潇洒 2002-10-11
  • 打赏
  • 举报
回复
晕倒~~~~~~ 你就不晓得自己变通一下 ?
一定要别人给你写现成的?

我只是告诉你一种实现的方法, 具体要实现成什么样,得靠你自己.
---呵... 给人鱼不如给人网.希望你能学会用"网".... :)
netstarry 2002-10-11
  • 打赏
  • 举报
回复
to goldenlove(潇洒.net)
我不是要改变整个页面的<a>标签的onclick所执行的函数,只是一部分,而且每个链接执行的函数的参数是不一样的
bencalie 2002-10-11
  • 打赏
  • 举报
回复
为了让你看出效果,我改成两秒的,无论多少链接都可以。这是定时的,你也可以把document.body.releaseCapture()放在你要执行的函数结尾

<body>
<a href="#" onclick="alert();">123</a>
<script>
for(i=0;i<document.all.tags("A").length;i++)
document.all.tags("A")[i].attachEvent("onclick",setCap)
function setCap(){
setTimeout('document.body.releaseCapture()',2000);
document.body.setCapture();
}
</script>
潇洒 2002-10-11
  • 打赏
  • 举报
回复
<script>
function st(obj){obj.onclick=new Function('return false')}
function rst(obj){obj.onclick=new Function('alert("ok! i\'m back!")')}
</script>

<a href=# onclick=alert('fine')> link </a><br>
<a href=# onclick=alert('link_disabled'),st(document.all.tags("A")[0])> disabled </a><br>
<a href=# onclick=alert('link_enabled'),rst(document.all.tags("A")[0])> enabled </a>

netstarry 2002-10-11
  • 打赏
  • 举报
回复
to bencalie(Bencalie)
据个例子吧,我对javascript不熟,不会用attachEvent
bencalie 2002-10-11
  • 打赏
  • 举报
回复
你可以使用attachEvent方法将我给的代码setTimeout('a1.releaseCapture()',500);a1.setCapture();附加到每个链接的onclick事件中,如果在指定时间内想取消鼠标的抓取,使用右键即可,否则将不等到setTimeout时间到了自动取消抓取,就根本无法对当前窗口进行任何操作。应为弹出对话框和滚动窗口来取消鼠标抓取都无法做到。
netstarry 2002-10-11
  • 打赏
  • 举报
回复
我用了 net_lover(孟子E章) 的思想,因为是多个链接调用同一个函数,所以我使用了document.flag变量代替mxh,具体实现如下
<script.....>
document.flag=0;
</sc..>

<a href=# onclick="if(document.flag==0){document.flag=1;myfun();document.flag=0;};return false">


这样虽然避免了多次快速点击产生的停顿(注:停顿现象是这样的,当快速点击时,中间的点击调用的函数产生的效果并不会显示,但是会消耗时间,只有最后一次点击的效果才会显示出来,感觉就像停顿),但是中间点击产生的效果会依次显示,并占用时间,也就是说中间的点击并没有取消函数的调用,有没有办法能真正取消中间的点击对函数的调用,谢了。

bencalie(Bencalie) 的方法没试,因为我要处理的不是单一的链接,而是几个链接。
孟子E章 2002-10-10
  • 打赏
  • 举报
回复
<a href="" mxh="0" onclick="if(this.mxh=='0'){this.mxh='1';youFun(this);};return false">xcvxcv</a>
<script>
function youFun(a)
{
alert("I am running")
xxx()
a.mxh='0'
}
function xxx()
{
for(i=0;i<1000000;i++)
{
a=i
}
}
</script>
在youFun()执行完后把mxh='0'即可
加载更多回复(3)

87,904

社区成员

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

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