本文目录
倒计时代码,求修改!!!
var _time=document.getElementById(’time’); var _text=document.getElementById(’text’); var _start=document.getElementById(’start’); var starttime; //定义最上,防止点击事件无限undefined _start.onclick=function CountDown(){ //只给赋值一次,否则下面运算无效,so 计时器不会跑. if(starttime==undefined)starttime=parseInt(_text.value); if(starttime》=0){ hours=Math.floor(starttime/3600); minutes = Math.floor(starttime/60); seconds = Math.floor(starttime%60); msg = "距离结束还有"+hours+"小时"+minutes+"分"+seconds+"秒"; document.getElementById(’time’).innerHTML=msg; starttime -= 1; } else{ clearTimeout(time); alert("时间到"); return; //如果时间到,下面的timeout不再执行. } //setinterval 达不到效果,它会一次性全部执行完毕,所以采用timeout time= setTimeout(CountDown,1000); };
jquery自定义事件 this问题
两个地方需要说明
$.fn.xxx 中的 this 指向的是 $() 调用时的 jQuery 对象,不用再通过$来封装;
$.fn.longPress 中,如果要调用参数里的 fn,并且正确传递DOM对象的话,需要写成类似以下这样:
$.fn.longPress = function(fn) { ... this.each(function() { fn.apply(this /*, 其它参数 */ ); });};
用 apply 方法来替换回调函数fn中的 this 。
具体来说,在setTimeout的时候,可以类似这么调用:
timeout = setTimeout(function() { fn.apply($temThis);}, 800);
这样,在 fn() 中的this就变成当前DOM对象了。
但是,这样写还有一个重要问题,那就是变量 i ,它的值在当前闭包环境中会变成 $temThis.length ,导致代码出错。要正确工作,需要改成这样:
for(var i = 0; i 《 $temThis.length; i++) { (function(target) { var timeout; target.addEventListener(’touchstart’, function(event) { timeout = setTimeout(function() { fn.apply(target); }, 800); }, false); target.addEventListener(’touchend’, function(event) { clearTimeout(timeout); }, false); })($temThis);}
这样创建一个闭包,确保$temThis在每个闭包中都是正确的。另外注意那个timeout,由于对象可能有多个,因此每个对象需要一个单独的 timeout 。
使用 jQuery 的方法会简化一些,含义是一样的,如下:
$temThis.each(function() { var timeout, target = this; this.addEventListener(’touchstart’, function(event) { timeout = setTimeout(function() { fn.apply(target); }, 800); }, false); this.addEventListener(’touchend’, function(event) { clearTimeout(timeout); }, false);});
手机点与长按共存事件 怎样将下面的代码实现 点击与长按 不冲突
引入jquery.mobile.min.js文件,***隐藏网址***里面就有一个长按事件,$("xx").on("taphold",function(){ // 操作 });点击事件$("xx").on("tap",function(){ // 操作 });
急求解决方法 鼠标移动太快时 onmouseout事件无法触发
话说有一个DIV元素,其内部有一个IMG元素和SPAN元素,不用理会这两个内部元素怎么布局,这不是我要讨论的重点。为了实现一些特殊的效果,我需要利用TD的onmouseover和onmouseout事件,测试时就会发现如下的状况:当鼠标移入DIV内部时,onmouseover事件被触发;接着再鼠标移动到DIV内部的IMG或者SPAN元素之上,我们肯定不会认为这时鼠标已经移到了DIV的外边,但奇怪的是onmouseout事件触发了,而且紧接着onmouseover事件也马上被触发了。这可不是我想要的,那么怎么来“屏蔽”内部元素给外层元素带来的Javascript事件干扰呢?这里列举两种方法:一. setTimeout因为在鼠标移动到内部元素之上而触发了外层元素的onmouseout事件后,外层元素的onmouseover也会马上触发,所以我们只需要把外层元素的onmouseout事件需要执行的动作延迟很短的一段时间来运行,然后在onmouseover事件中再执行clearTimeout方法,这样就可以避免内部元素引起的事件干扰。具体的执行过程请看下图(纵向的虚线表示时间): 这是个很巧妙的的方法,因为当onmouseout触发后,实质性的方法并没有马上执行,而是要等待一小段时间。如果在这段时间里马上又触发了 onmouseover事件,那么基本上就可以肯定onmouseout事件的触发是因为内部元素的干扰了,所以在onmouseover事件中使用 clearTimeout来阻止延时的方法执行。二.contains在onmouseover时先进行如下判断,结果为true时再执行方法体:1 $("#popFormDiv").mouseover(function () {2 var s = event.fromElement || event.relatedTarget;3 if (!this.contains(s)) { $(this).show("slow"); } 4 });在onmouseout时先进行如下判断,结果为true时再执行方法体:$("#popFormDiv").mouseout(function () { var s = event.toElement || event.relatedTarget; if (!this.contains(s)) { $(this).hide("slow"); } });下面来解释一下上面两行代码的含义:在IE中,所有的HTML元素都有一个contains方法,它的作用是判断当前元素内部是否包含指定的元素。我们利用这个方法来判断外层元素的事件是不是因为内部元素而被触发,如果内部元素导致了不需要的事件被触发,那我们就忽略这个事件。event.fromElement指向触发onmouseover和onmouseout事件时鼠标离开的元素;event.toElement指向触发onmouseover和onmouseout事件时鼠标进入的元素。那么上面两行代码的含义就分别是:○ 当触发onmouseover事件时,判断鼠标离开的元素是否是当前元素的内部元素,如果是,忽略此事件;○ 当触发onmouseout事件时,判断鼠标进入的元素是否是当前元素的内部元素,如果是,忽略此事件;这样,内部元素就不会干扰外层元素的onmouseover和onmouseout事件了。但问题又来了,非IE的浏览器并不支持contains函数,不过既然我们已经知道了contains函数的作用,就可以自行添加如下的代码来为非IE浏览器增加contains支持:1 if (typeof (HTMLElement) != "undefined") { 2 3 HTMLElement.prototype.contains = function (obj) { 4 5 while (obj != null && typeof (obj.tagName) != "undefined") { 6 7 if (obj == this) 8 9 return true;10 11 obj = obj.parentNode;12 13 }14 15 return false;16 17 };18 19 }