我用Jquery写了个,拖拽加自由落体的程序。
IE8里实现的效果是我想达到的就是mousedown时间可以立刻终止运动,然后开始拖拽,mouseup后再开始只有落体。
FF和Chrome里都出现一个问题是:——“当我mousedown了,可以进行拖拽,这都很正常。但mouseup后物体会继续mousedown前的运动。没有像我我设想的那样立刻重新开始下落。要过一段时间才能停止。”
你们可以分别用Chrome和ie8试试就知道我说的问题了。
当你第一次mouseup后不要执行任何操作,在IE8下数字的运动和物体的运动是同步进行的,而在FF和Chrome下都是不同步的。我分析这也就是我提出的问题的关键所在。setInterval(),clearInterval和animate()都可能是引起此问题的原因。有谁知道这3个函数在不同浏览器中的实现有什么不同吗?或者有什么更好的方法来避免FF和Chrome中的问题?
问题很长~~~~~~~~~真心求教!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>drag+drop</title>
<script type="text/javascript" src="jquery-1.6.3.js"></script>
<script type="text/javascript">
function GravityObj(idORclass){
var obj=this;
this.idORclass=idORclass;
this.velocity=1000;
this.gravity=1000;
this.longTopx=0.0003;
this.stopNow=null;
this.bottom=0;
this.tAnimate=1;
this.hit=0.9;
this.deltaX=0;
this.deltaY=0;
this.helpStop=false;
function dragStart(dragEvent){
obj.deltaX=dragEvent.clientX-$(obj.idORclass).offset().left;
obj.deltaY=dragEvent.clientY-$(obj.idORclass).offset().top;
//****************************PS:这里用document很关键。如果你用的还是像别的一样$(dragObj.idORclass),拖动时会
//*******************************一卡卡的,因为拖动的物体可能跟不上你鼠标的移动速度。
$(obj.idORclass).unbind("mouseup");
$(document).bind("mousemove",dragMove);
$(obj.idORclass).bind("mouseup",dragStop);
$(obj.idORclass).bind("mouseup",dropStart);
}
function dragMove(dragEvent){
$(obj.idORclass).css({
"left":(dragEvent.clientX-obj.deltaX)+"px",
"top" :(dragEvent.clientY-obj.deltaY)+"px",
})
}
function dragStop(){
// alert("dragStop");
$(document).unbind("mousemove",dragMove);
$(obj.idORclass).unbind("mouseup",dragStop);
var rBottom=getBottom(obj.idORclass);
$(obj.idORclass).css("top","auto");
$(obj.idORclass).css("bottom",rBottom+"px");
obj.bottom=rBottom;
obj.velocity=0;
// alert(rBottom);
}
function dropStart(){
//alert("dropStart"+obj.idORclass);
//event.stopPropagation();
//alert(obj.bottom);
//alert(obj.velocity);
dropMove();
$(obj.idORclass).unbind("mouseup",dropStart);
}
function dropMove(){
obj.stopNow=setInterval(dropAction(),obj.tAnimate);
}
function dropStop(){
//alert("dropStop"+obj.idORclass);
clearInterval(obj.stopNow);
return
}
function getBottom(idORclass){
return rBottom=document.documentElement.clientHeight-$(idORclass).offset().top-parseInt($(idORclass).css("height"));
}
function dropAction(){
return function(){
var positionChange=(obj.velocity*obj.tAnimate+(1/2)*obj.gravity*obj.tAnimate*obj.tAnimate)*obj.longTopx; obj.velocity=obj.velocity+obj.gravity*obj.tAnimate; //v=v0+gt
obj.bottom=obj.bottom-positionChange;
var endbottom=5;
if(obj.bottom<=endbottom){
obj.velocity=(0-obj.velocity)*obj.hit; //碰撞后速度的变化
if (Math.abs(obj.velocity)<=100){
dropStop();
return;
}
}
$("#output").html("速度"+obj.velocity+"高度"+obj.bottom);
$(obj.idORclass).animate({bottom:obj.bottom+"px"},obj.tAnimate);
}
}
function mousedownBind(){
$(obj.idORclass).bind("mousedown",dragStart);
$(obj.idORclass).bind("mousedown",dropStop);
}
$(document).ready(function(){
mousedownBind();
})
}
var obj1=new GravityObj(".gravity1");
var obj2=new GravityObj(".gravity2");
</script>
<style type="text/css">
body{
margin:0;
padding:0;
}
.gravity1{
height:100px;
width:100px;
background-color:#000066;
position:absolute;
cursor:pointer;
}
.gravity2{
height:100px;
width:100px;
right:200px;
background-color:red;
position:absolute;
cursor:pointer;
}</style>
</head><body>
<div class="gravity1"></div>
<div class="gravity2"></div>
<span id="output"></span>
</body>
</html>
IE8里实现的效果是我想达到的就是mousedown时间可以立刻终止运动,然后开始拖拽,mouseup后再开始只有落体。
FF和Chrome里都出现一个问题是:——“当我mousedown了,可以进行拖拽,这都很正常。但mouseup后物体会继续mousedown前的运动。没有像我我设想的那样立刻重新开始下落。要过一段时间才能停止。”
你们可以分别用Chrome和ie8试试就知道我说的问题了。
当你第一次mouseup后不要执行任何操作,在IE8下数字的运动和物体的运动是同步进行的,而在FF和Chrome下都是不同步的。我分析这也就是我提出的问题的关键所在。setInterval(),clearInterval和animate()都可能是引起此问题的原因。有谁知道这3个函数在不同浏览器中的实现有什么不同吗?或者有什么更好的方法来避免FF和Chrome中的问题?
问题很长~~~~~~~~~真心求教!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>drag+drop</title>
<script type="text/javascript" src="jquery-1.6.3.js"></script>
<script type="text/javascript">
function GravityObj(idORclass){
var obj=this;
this.idORclass=idORclass;
this.velocity=1000;
this.gravity=1000;
this.longTopx=0.0003;
this.stopNow=null;
this.bottom=0;
this.tAnimate=1;
this.hit=0.9;
this.deltaX=0;
this.deltaY=0;
this.helpStop=false;
function dragStart(dragEvent){
obj.deltaX=dragEvent.clientX-$(obj.idORclass).offset().left;
obj.deltaY=dragEvent.clientY-$(obj.idORclass).offset().top;
//****************************PS:这里用document很关键。如果你用的还是像别的一样$(dragObj.idORclass),拖动时会
//*******************************一卡卡的,因为拖动的物体可能跟不上你鼠标的移动速度。
$(obj.idORclass).unbind("mouseup");
$(document).bind("mousemove",dragMove);
$(obj.idORclass).bind("mouseup",dragStop);
$(obj.idORclass).bind("mouseup",dropStart);
}
function dragMove(dragEvent){
$(obj.idORclass).css({
"left":(dragEvent.clientX-obj.deltaX)+"px",
"top" :(dragEvent.clientY-obj.deltaY)+"px",
})
}
function dragStop(){
// alert("dragStop");
$(document).unbind("mousemove",dragMove);
$(obj.idORclass).unbind("mouseup",dragStop);
var rBottom=getBottom(obj.idORclass);
$(obj.idORclass).css("top","auto");
$(obj.idORclass).css("bottom",rBottom+"px");
obj.bottom=rBottom;
obj.velocity=0;
// alert(rBottom);
}
function dropStart(){
//alert("dropStart"+obj.idORclass);
//event.stopPropagation();
//alert(obj.bottom);
//alert(obj.velocity);
dropMove();
$(obj.idORclass).unbind("mouseup",dropStart);
}
function dropMove(){
obj.stopNow=setInterval(dropAction(),obj.tAnimate);
}
function dropStop(){
//alert("dropStop"+obj.idORclass);
clearInterval(obj.stopNow);
return
}
function getBottom(idORclass){
return rBottom=document.documentElement.clientHeight-$(idORclass).offset().top-parseInt($(idORclass).css("height"));
}
function dropAction(){
return function(){
var positionChange=(obj.velocity*obj.tAnimate+(1/2)*obj.gravity*obj.tAnimate*obj.tAnimate)*obj.longTopx; obj.velocity=obj.velocity+obj.gravity*obj.tAnimate; //v=v0+gt
obj.bottom=obj.bottom-positionChange;
var endbottom=5;
if(obj.bottom<=endbottom){
obj.velocity=(0-obj.velocity)*obj.hit; //碰撞后速度的变化
if (Math.abs(obj.velocity)<=100){
dropStop();
return;
}
}
$("#output").html("速度"+obj.velocity+"高度"+obj.bottom);
$(obj.idORclass).animate({bottom:obj.bottom+"px"},obj.tAnimate);
}
}
function mousedownBind(){
$(obj.idORclass).bind("mousedown",dragStart);
$(obj.idORclass).bind("mousedown",dropStop);
}
$(document).ready(function(){
mousedownBind();
})
}
var obj1=new GravityObj(".gravity1");
var obj2=new GravityObj(".gravity2");
</script>
<style type="text/css">
body{
margin:0;
padding:0;
}
.gravity1{
height:100px;
width:100px;
background-color:#000066;
position:absolute;
cursor:pointer;
}
.gravity2{
height:100px;
width:100px;
right:200px;
background-color:red;
position:absolute;
cursor:pointer;
}</style>
</head><body>
<div class="gravity1"></div>
<div class="gravity2"></div>
<span id="output"></span>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>drag+drop</title>
<script type="text/javascript" src="jquery-1.6.3.js"></script>
<script type="text/javascript">
function GravityObj(idORclass){
var obj=this;
this.idORclass=idORclass;
this.velocity=1000;
this.gravity=1000;
this.longTopx=0.0003;
this.stopNow=null;
this.bottom=0;
this.tAnimate=1;
this.hit=0.9;
this.deltaX=0;
this.deltaY=0;
this.helpStop=false;
function dragStart(dragEvent){
obj.deltaX=dragEvent.clientX-$(obj.idORclass).offset().left;
obj.deltaY=dragEvent.clientY-$(obj.idORclass).offset().top;
//****************************PS:这里用document很关键。如果你用的还是像别的一样$(dragObj.idORclass),拖动时会
//*******************************一卡卡的,因为拖动的物体可能跟不上你鼠标的移动速度。
$(obj.idORclass).unbind("mouseup");
$(document).bind("mousemove",dragMove);
$(obj.idORclass).bind("mouseup",dragStop);
$(obj.idORclass).bind("mouseup",dropStart);
}
function dragMove(dragEvent){
$(obj.idORclass).css({
"left":(dragEvent.clientX-obj.deltaX)+"px",
"top" :(dragEvent.clientY-obj.deltaY)+"px",
})
}
function dragStop(){
// alert("dragStop");
$(document).unbind("mousemove",dragMove);
$(obj.idORclass).unbind("mouseup",dragStop);
var rBottom=getBottom(obj.idORclass);
$(obj.idORclass).css("top","auto");
$(obj.idORclass).css("bottom",rBottom+"px");
obj.bottom=rBottom;
obj.velocity=0;
// alert(rBottom);
}
function dropStart(){
//alert("dropStart"+obj.idORclass);
//event.stopPropagation();
//alert(obj.bottom);
//alert(obj.velocity);
dropMove();
$(obj.idORclass).unbind("mouseup",dropStart);
}
function dropMove(){
obj.stopNow=setInterval(dropAction(),obj.tAnimate);
}
function dropStop(){
//alert("dropStop"+obj.idORclass);
clearInterval(obj.stopNow);
return
}
function getBottom(idORclass){
return rBottom=document.documentElement.clientHeight-$(idORclass).offset().top-parseInt($(idORclass).css("height"));
}
function dropAction(){
return function(){
var positionChange=(obj.velocity*obj.tAnimate+(1/2)*obj.gravity*obj.tAnimate*obj.tAnimate)*obj.longTopx;
// ds=v0*t+(1/2)g(t^2)
obj.velocity=obj.velocity+obj.gravity*obj.tAnimate; //v=v0+gt
obj.bottom=obj.bottom-positionChange;
var endbottom=5;
if(obj.bottom<=endbottom){
obj.velocity=(0-obj.velocity)*obj.hit; //碰撞后速度的变化
if (Math.abs(obj.velocity)<=100){
dropStop();
return;
}
}
$("#output").html("速度"+obj.velocity+"高度"+obj.bottom);
$(obj.idORclass).animate({bottom:obj.bottom+"px"},obj.tAnimate);
}
}
function mousedownBind(){
$(obj.idORclass).bind("mousedown",dragStart);
$(obj.idORclass).bind("mousedown",dropStop);
}
$(document).ready(function(){
mousedownBind();
})
}
var obj1=new GravityObj(".gravity1");
var obj2=new GravityObj(".gravity2");
</script>
<style type="text/css">
body{
margin:0;
padding:0;
}
.gravity1{
height:100px;
width:100px;
background-color:#000066;
position:absolute;
cursor:pointer;
}
.gravity2{
height:100px;
width:100px;
right:200px;
background-color:red;
position:absolute;
cursor:pointer;
}</style>
</head><body>
<div class="gravity1"></div>
<div class="gravity2"></div>
<span id="output"></span>
</body>
</html>