请问如何暂时屏蔽掉鼠标左键的单击
有一个用<a href="#" onclick="">方式激活的函数,因为该函数处理时间比较长,大概半秒左右,如果连续点击该链接就会出现该函数的连续执行,会消耗大量的时间,而实际只有最后一次的点击有用,有什么方法能够在第一次点击后函数执行中屏蔽掉以后的点击,直到该函数执行完,谢了! 问题点数:100、回复次数:23Top
1 楼net_lover(【孟子E章】)回复于 2002-10-10 23:06:17 得分 0
<a href="#" mxh="0" onclick="if(this.mxh=='0') youFun();ifthis.mxh='1'">
在youFun()执行完后把mxh='0'即可Top
2 楼bencalie(Bencalie)回复于 2002-10-10 23:18:54 得分 0
<a href="#" onclick="alert();setTimeout('a1.releaseCapture()',500);a1.setCapture();">123</a>
<a id=a1>123</a>Top
3 楼bencalie(Bencalie)回复于 2002-10-10 23:20:39 得分 0
当然你也可以在你要执行函数最后加上释放鼠标事件的抓取Top
4 楼net_lover(【孟子E章】)回复于 2002-10-10 23:23:44 得分 50
<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'即可Top
5 楼netstarry(等待流星)回复于 2002-10-11 18:04:06 得分 0
我用了 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) 的方法没试,因为我要处理的不是单一的链接,而是几个链接。
Top
6 楼bencalie(Bencalie)回复于 2002-10-11 19:14:32 得分 0
你可以使用attachEvent方法将我给的代码setTimeout('a1.releaseCapture()',500);a1.setCapture();附加到每个链接的onclick事件中,如果在指定时间内想取消鼠标的抓取,使用右键即可,否则将不等到setTimeout时间到了自动取消抓取,就根本无法对当前窗口进行任何操作。应为弹出对话框和滚动窗口来取消鼠标抓取都无法做到。Top
7 楼netstarry(等待流星)回复于 2002-10-11 20:37:54 得分 0
to bencalie(Bencalie)
据个例子吧,我对javascript不熟,不会用attachEventTop
8 楼goldenlove(潇洒.net)回复于 2002-10-11 20:54:40 得分 0
<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>
Top
9 楼bencalie(Bencalie)回复于 2002-10-11 21:12:42 得分 0
为了让你看出效果,我改成两秒的,无论多少链接都可以。这是定时的,你也可以把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>Top
10 楼netstarry(等待流星)回复于 2002-10-11 21:20:43 得分 0
to goldenlove(潇洒.net)
我不是要改变整个页面的<a>标签的onclick所执行的函数,只是一部分,而且每个链接执行的函数的参数是不一样的Top
11 楼goldenlove(潇洒.net)回复于 2002-10-11 22:16:55 得分 0
晕倒~~~~~~ 你就不晓得自己变通一下 ?
一定要别人给你写现成的?
我只是告诉你一种实现的方法, 具体要实现成什么样,得靠你自己.
---呵... 给人鱼不如给人网.希望你能学会用"网".... :)Top
12 楼netstarry(等待流星)回复于 2002-10-11 22:31:34 得分 0
to goldenlove(潇洒.net)
我是在说你的方法不行,你的方法使得每个a标签的onclick都执行相同的函数,包括参数,但是我要做的是每个a标签的onclick执行的函数参数是不同的,这样你的方法就不能工作了
bencalie(Bencalie)的方法好像也存在同样的问题,就是要求每个a标签的onclik方法执行相同的函数,包括参数Top
13 楼bencalie(Bencalie)回复于 2002-10-11 22:39:39 得分 20
晕,没试试不要乱讲
<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>Top
14 楼goldenlove(潇洒.net)回复于 2002-10-11 22:56:16 得分 0
服了你了...... 还非得要我把鱼噻到你嘴里你才吃啊 !?!...
<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>Top
15 楼bencalie(Bencalie)回复于 2002-10-11 23:01:49 得分 0
goldenlove(潇洒.net),一起撤退,我们败了,呵呵Top
16 楼goldenlove(潇洒.net)回复于 2002-10-11 23:06:58 得分 20
嘿嘿.. 最终版. 不但可以每个连接都能设置不同的 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>Top
17 楼netstarry(等待流星)回复于 2002-10-11 23:08:52 得分 0
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();放在函数末尾
将出现不点击右键不能开启捕捉的情况
只能使用定时吗?Top
18 楼netstarry(等待流星)回复于 2002-10-11 23:32:40 得分 0
写反了
这样处理后
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>Top
19 楼bencalie(Bencalie)回复于 2002-10-11 23:36:25 得分 0
<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>Top
20 楼onestab()回复于 2002-10-11 23:52:49 得分 10
这是个非常古老的问题,牵涉到script的运行机制。
函数运行当中是无法得知a被点击的事件的。(没有VB的doEvents方法)
当他知道这个事件时,函数已经结束了。
就像一个人无法同时跨过两条河流。
较好的解决办法是友好地提醒用户,该段处理费时较长,请耐心等待。Top
21 楼goldenlove(潇洒.net)回复于 2002-10-11 23:54:14 得分 0
哦?... 不是说撤退了吗?.........Top
22 楼netstarry(等待流星)回复于 2002-10-12 00:52:00 得分 0
非常感谢各位的参与,其实我不是经常写javascript代码的,所以对javascript不很了解,
还是 onestab(┼─) 说得对,每个click事件都会被按顺序相应,这样就不可能采用在调用函数中采用某种方法屏蔽后来的click事件
如果不使用延迟的方法,问题几乎不能解决,所以
goldenlove(潇洒.net)和bencalie(Bencalie) 的方法中均使用了延迟来屏蔽短时间内的click事件,这样的处理对速度慢的机器是有效的,但是对于速度快的机器,相当于人为的降低了机器速度,不太可取,
net_lover(孟子E章)的方法是一个很奇怪的现象,如果不使用该方法,会出现我前面说的一种停顿现象,使用了该方法,虽然不能屏蔽掉后续的连续点击,但是却让每次点击引发的函数所产生的效果显示了出来,我认为这个方法是最佳的,速度快的机器不会出现停顿,速度慢的机器也不会出现我前面说的那种停顿现象(就像是没反应了一样),我采用了这个方法
十分感谢大家的参与,结贴Top
23 楼coolhealth(漫漫追求)回复于 2002-10-12 01:46:10 得分 0
下次要留意它!Top




