作者senser (彷佛曾经一起死过)
看板Ajax
标题Re: [问题] 呼叫div,hide该div後,重复执行的bug?
时间Thu Jul 28 15:41:24 2011
对 你的问题在於你重复bind event
你的event trigger时都会把每个bind过event handler都执行一次
这是DOM2 event的特性
当你把他移出来之後 你可能会有另一个问题就是如何pass你的 box_title
此时你可以把他宣告在外面 而你mousedown时 可以去改变的他的值
所以你的input的click trigger时
因为两个closures在同个environment 所以应该可以抓到每次的box_title改变後的值
试试看吧
※ 引述《iam87king (沉默伤心)》之铭言:
: ※ 引述《terrybob (罪云樵)》之铭言:
: : [问题描述]
: : 当点击<a>时,会呼叫<div id="shareit-box">显示在页面上,
: : 当点击<div id="shareit-box">里的按钮,进行关闭动作时,
: : 我放置了 alert("结束"+boxtitle); ,看关闭按钮执行时,跳了几次alert…
: : 测试结果时,会一直不断跳出alert,而且跳出alert的顺序,
: : 会是我每次点过<a>的连结顺序…
: : 我想问的是…是否有方法,可以第一次点击显示alert之後,
: : 该物件执行就结束了,其他的alert不再会执行?
: : 谢谢!
: : [html]
: : <div style="border:#000000 1px solid; margin-left:200px;">
: : <a href="#" class="alert" rel="shareit" boxtitle="AAA">AAA</a><br/>
: : <a href="#" class="alert" rel="shareit" boxtitle="BBB">BBB</a><br/>
: : <a href="#" class="alert" rel="shareit" boxtitle="CCC">CCC</a><br/>
: : <a href="#" class="alert" rel="shareit" boxtitle="DDD">DDD</a><br/>
: : <a href="#" class="alert" rel="shareit" boxtitle="EEE">EEE</a><br/>
: : <a href="#" class="alert" rel="shareit" boxtitle="FFF">FFF</a><br/>
: : <a href="#" class="alert" rel="shareit" boxtitle="GGG">GGG</a><br/>
: : </div>
: : <div id="shareit-box" style="display:none;">
: : <div id="shareit-header"></div>
: : <div id="shareit-body">
: : <div id="shareit-submitbox">
: : <input name="btn_end" type="button" class="style2" />
: : </div>
: : </div>
: : </div>
: : [jquery]
: : $(document).ready(function()
: : {
: : $('a[rel=shareit]').mousedown(function()
: : {
: : var height = $(this).height();
: : var top = $(this).offset().top;
: : //get the left and find the center value
: : var left = $(this).offset().left +
: : ($(this).width() /2) -
: : ($('#shareit-box').width() / 2);
: : $('#shareit-header').height(height);
: : $('#shareit-box').show();
: : $('#shareit-box').css({'top':top, 'left':left});
: : var box_title = $(this).attr("boxtitle");
: : $("input[name=btn_end]").click(function()
: : {
: : alert("结束!"+box_title); // <=测试用的alert
: : $('#shareit-box').hide();
: : return false;
: : });
: : $('#shareit-header').click(function () {
: : $('#shareit-box').hide();
: : })
: : });
: : });
: : 以上,谢谢。
: 你把关闭动作的事件绑在mousedown里面,所以每次mousedown就会再绑一次关闭动作
: 结局就是你按n次就会有n次关闭动作
: 解决方法是把$("input[name=btn_end]").click(function(){ ... })移出来,另外
: $('#shareit-header').click(function(){ ... })也可以移出来,因为这个动作
: 似乎也没有必要每mousedown一次就要绑一次
: 2个地方提醒一下
: 1.常用的jquery物件可以设一个变数存起来:
: 例如你程式码里面常出现的$(this),可以用个变数,比如说var j_obj = $(this);存
: 再用j_obj去操作你要的动作,而且在一个function之中又有function的程式码里也可
: 以比较清楚知道现在的this指的是哪一层的this
: 2.可以串接就串接
: $('#shareit-box').show();
: $('#shareit-box').css({'top':top, 'left':left});
: 可以写成
: $('#shareit-box').show().css({'top':top, 'left':left});
: 另外你要设定top和left,别忘了position也要一起设定
: 以下是我改过的程式码,不过不知道合不合你需求就是了
: $(function(){
: $('a[rel=shareit]').click(function(){
: var j_obj = $(this);
: var top = j_obj.offset().top + j_obj.height();
: var left = j_obj.offset().left + (j_obj.width()/2);
: $('#shareit-box').show().css({'top':top, 'left':left, 'position':'absolute'});
: $('#shareit-header').text(j_obj.attr("boxtitle"));
: });
: $("#shareit-box").click(function(e){
: if(e.target.tagName === "INPUT" && e.target.name === "btn_end"){
: alert("结束!" + $('#shareit-header').text());
: }
: $('#shareit-box').hide();
: });
: });
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 71.104.223.87
1F:推 terrybob:也谢谢这位高手的说明。顺便将文章寄回信箱 07/29 13:09