2012-01-06 71 views
0

我已经完成了JavaScript中的弹出窗口的拖放操作,并且正确地向各个方向拖动,但向下拖动弹出窗口时down.MouseUp事件没有正确触发。尽管我发布了鼠标。我真的搞砸了这个bug.Please help..I已紧急解决这一问题....JavaScript拖放中的错误

这里是我的代码..

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<HTML> 
<HEAD> 
<TITLE> New Document </TITLE> 
<META NAME="Generator" CONTENT="EditPlus"> 
<META NAME="Author" CONTENT=""> 
<META NAME="Keywords" CONTENT=""> 
<META NAME="Description" CONTENT=""> 

<style> 
body{ 
margin:0px; 
padding:0px; 
} 
iframe{ 
    width:800px; 
    height:500px; 
} 
img{border:none;} 

.parentDisabled 
{ 
width:100%; 
height:100% 
background-color:red; 
position:absolute; 
top:0; 
left:0; 
display:block; 
border:1px solid blue; 
} 
#popup{ 
    position:absolute; 
    width:800px; 
    height:500px; 
    border:2px solid #999188; 
    display:none; 
} 

#header{ 
padding-right:0px; 
width:800px; 
} 

#close{ 
    cursor:hand; 
    width:15px; 
    position: absolute; 
    right:0; 
    top:0; 
    padding:2px 2px 0px 0px; 
} 

#move{ 
cursor:move; 
background:#999188; 
width:800px; 
line-height:10px; 
} 

#container{ 

} 
.navigate{ 
    border:1px solid black ; 
    background:#CC00FF; 
    color:white; 
    padding:5px; 
    cursor:hand; 
    font-weight:bold; 
    width:150px; 
} 

</style> 
</HEAD> 

<BODY> 
<div onClick="showPopUp('w3schools');" class="navigate">W3Schools</div> 
<div onClick="showPopUp('yahoo');" class="navigate">Yahoo</div> 
<div onClick="showPopUp('linkedin');" class="navigate">LinkedIn</div> 
<div onClick="showPopUp('vistex');" class="navigate">Vistex</div> 

<div id="popup"> 
     <div id="header"> 
     <span id="move"></span> 
     <span id="close"><img src="close_red.gif" onClick="closePopUp()" alt="Close"/></span> 
     </div> 

     <div id="container"> 
      <iframe name="frame" id="Page_View" frameborder=0> 
       page cannot be displayed 
      </iframe> 
     </div> 

    </div> 
</BODY> 

<script> 

var popUpEle=null; 

function showPopUp(value,evt) 
{ 
evt = evt ? evt : window.event; 
var left=evt.clientX; 
var top=evt.clientY; 

popUpEle = document.getElementById('popup'); 
if(popUpEle) 
{ 
    closePopUp(); 
    var url= "http://www."+value+".com"; 
    document.getElementById('Page_View').src=url; 

    popUpEle.style.left=left; 
    popUpEle.style.top=top; 
    popUpEle.style.filter="revealTrans(transition=1, duration=1)"; 
    popUpEle.filters.revealTrans(transition=1, duration=1).Apply(); 
    popUpEle.filters.revealTrans(transition=1, duration=1).Play(); 
    popUpEle.style.display="inline"; 
} 
} 
function closePopUp(){ 
if(popUpEle) 
{ 
    popUpEle.style.filter="revealTrans(transition=0, duration=4)"; 
    popUpEle.filters.revealTrans(transition=0, duration=5).Apply(); 
    popUpEle.filters.revealTrans(transition=0, duration=5).Play(); 
    popUpEle.style.display="none"; 

} 
} 

    var dragApproved=false; 
    var DragHandler = { 

    // private property. 
    _oElem : null, 

    // public method. Attach drag handler to an element. 
    attach : function(oElem) { 
     oElem.onmousedown = DragHandler._dragBegin; 
     // callbacks 
     oElem.dragBegin = new Function(); 
     oElem.drag = new Function(); 
     oElem.dragEnd = new Function(); 
     return oElem; 
    }, 
    // private method. Begin drag process. 
    _dragBegin : function(e) { 

     var oElem = DragHandler._oElem = this; 

     if (isNaN(parseInt(oElem.style.left))) { oElem.style.left = '0px'; } 
     if (isNaN(parseInt(oElem.style.top))) { oElem.style.top = '0px'; } 

     var x = parseInt(oElem.style.left); 
     var y = parseInt(oElem.style.top); 

     e = e ? e : window.event; 

     if (e.pageX || e.pageY) 
     { 
     oElem.mouseX = e.pageX; 
     oElem.mouseY = e.pageY; 
     } 
     else if (e.clientX || e.clientY)  { 
     oElem.mouseX = e.clientX + document.body.scrollLeft+ document.documentElement.scrollLeft; 
     oElem.mouseY = e.clientY + document.body.scrollTop+ document.documentElement.scrollTop; 
     } 

     document.onmousemove = DragHandler._drag; 
     document.onmouseup = DragHandler._dragEnd; 
     return false; 
    }, 
    // private method. Drag (move) element. 
    _drag : function(e) { 

     var oElem = DragHandler._oElem; 

     var x = parseInt(oElem.style.left); 
     var y = parseInt(oElem.style.top); 

     e = e ? e : window.event; 

     var clientXTmp,clientYTmp; 
     if (e.pageX || e.pageY) 
     { 
     clientXTmp = e.pageX; 
     clientXTmp = e.pageY; 
     } 
     else if (e.clientX || e.clientY)  { 
     clientXTmp = e.clientX + document.body.scrollLeft+ document.documentElement.scrollLeft; 
     clientYTmp = e.clientY + document.body.scrollTop+ document.documentElement.scrollTop; 
     } 

     var tmpX = x + (clientXTmp - oElem.mouseX); 
     var tmpY = y + (clientYTmp - oElem.mouseY); 

     if(tmpX<=0){tmpX = 0;} 
     if(tmpY<=0){tmpY = 0;} 

     oElem.style.left = tmpX + 'px'; 
     oElem.style.top = tmpY + 'px'; 

     oElem.mouseX = clientXTmp; 
     oElem.mouseY = clientYTmp; 
     return false; 

    }, 
    // private method. Stop drag process. 
    _dragEnd : function() 
    { 
     var oElem = DragHandler._oElem; 
     document.onmousemove = null; 
     document.onmouseup = null; 
     DragHandler._oElem = null; 
    } 
} 
DragHandler.attach(document.getElementById('popup'));</script> 

</HTML> 
+0

就http://jsfiddle.net – diEcho 2012-01-06 05:57:29

+0

小提琴请什么用的jsfiddle的。我在jsfiddle中做到了这一点,但我没有得到任何错误。 – 2012-01-06 11:56:35

回答

0

首先,你的脚本不工作在Firefox或铬,所以我做了一些改变。 其次,在iframe上快速移动鼠标时存在限制。看起来,当鼠标悬停在iframe上时,'mousemove'事件不会被触发。

我插入了一些修正,以你的代码,这就是:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<html> 
<head> 
<title>New Document </title> 
<meta name="Generator" content="EditPlus"> 
<meta name="Author" content=""> 
<meta name="Keywords" content=""> 
<meta name="Description" content=""> 
<style> 
    body 
    { 
     margin: 0px; 
     padding: 0px; 
    } 
    iframe 
    { 
     width: 800px; 
     height: 500px; 
    } 
    img 
    { 
     border: none; 
    } 

    .parentDisabled 
    { 
     width: 100%; 
     height: 100% background-color:red; 
     position: absolute; 
     top: 0; 
     left: 0; 
     display: block; 
     border: 1px solid blue; 
    } 
    #popup 
    { 
     position: absolute; 
     width: 800px; 
     height: 500px; 
     border: 2px solid #999188; 
     display: none; 
    } 

    #header 
    { 
     padding-right: 0px; 
     width: 800px; 
     height:20px; 
     background:#d8d8d8; 
     cursor:move; 
    } 

    #close 
    { 
     cursor: hand; 
     width: 15px; 
     position: absolute; 
     right: 0; 
     top: 0; 
     padding: 2px 2px 0px 0px; 
    } 

    #move 
    { 
     cursor: move; 
     background: #999188; 
     width: 800px; 
     line-height: 10px; 
    } 

    #container 
    { 
    } 
    .navigate 
    { 
     border: 1px solid black; 
     background: #CC00FF; 
     color: white; 
     padding: 5px; 
     cursor: hand; 
     font-weight: bold; 
     width: 150px; 
    } 
</style> 
</head> 
<body> 
    <div onclick="showPopUp('w3schools', event);" class="navigate"> 
    W3Schools</div> 
<div onclick="showPopUp('yahoo', event);" class="navigate"> 
    Yahoo</div> 
<div onclick="showPopUp('linkedin', event);" class="navigate"> 
    LinkedIn</div> 
<div onclick="showPopUp('vistex', event);" class="navigate"> 
    Vistex</div> 
<div id="popup"> 
    <div id="header"> 
     <span id="move"></span><span id="close"> 
      <img src="close_red.gif" onclick="closePopUp()" alt="Close" /></span> 
    </div> 
    <div id="container"> 
     <iframe name="frame" id="Page_View" frameborder="0">page cannot be displayed </iframe> 
    </div> 
</div> 

<div id='log'></div> 
<script type="text/javascript"> 

var popUpEle = null; 
var isIE = navigator.appVersion.indexOf("MSIE") !== -1; 

function showPopUp(value, evt) 
{ 
    evt = evt ? evt : window.event; 
    var left = evt.clientX; 
    var top = evt.clientY; 

    popUpEle = document.getElementById('popup'); 
    if (popUpEle) 
    { 
     closePopUp(); 
     var url = "http://www." + value + ".com"; 
     document.getElementById('Page_View').src = url; 

     popUpEle.style.left = left; 
     popUpEle.style.top = top; 
     popUpEle.style.filter = "revealTrans(transition=1, duration=1)"; 
     if (isIE) 
     { 
      popUpEle.filters.revealTrans(transition = 1, duration = 1).Apply(); 
      popUpEle.filters.revealTrans(transition = 1, duration = 1).Play(); 
     } 
     popUpEle.style.display = "block"; 
    } 
} 
function closePopUp() 
{ 
    if (popUpEle) 
    { 
     popUpEle.style.filter = "revealTrans(transition=0, duration=4)"; 
     if (isIE) 
     { 
      popUpEle.filters.revealTrans(transition = 0, duration = 5).Apply(); 
      popUpEle.filters.revealTrans(transition = 0, duration = 5).Play(); 
     } 
     popUpEle.style.display = "none"; 

    } 
} 

var DragHandler = { 

    // private property. 
    _oElem: null, 

    _dragElement: null, 

    // public method. Attach drag handler to an element. 
    attach: function (oElem) 
    { 
     oElem.onmousedown = DragHandler._dragBegin; 
     // callbacks 
     oElem.dragBegin = new Function(); 
     oElem.drag = new Function(); 
     oElem.dragEnd = new Function(); 
     return oElem; 
    }, 
    // private method. Begin drag process. 
    _dragBegin: function (e) 
    { 
     e = window.event || e; 
     var oElem = DragHandler._oElem = this; 


     // saving current mouse position 
     oElem.mouseX = e.clientX; 
     oElem.mouseY = e.clientY; 


     //   if (isNaN(parseInt(oElem.style.left))) { oElem.style.left = '0px'; } 
     //   if (isNaN(parseInt(oElem.style.top))) { oElem.style.top = '0px'; } 

     //   var x = parseInt(oElem.style.left); 
     //   var y = parseInt(oElem.style.top); 

     //   e = e ? e : window.event; 

     //   if (e.pageX || e.pageY) 
     //   { 
     //    oElem.mouseX = e.pageX; 
     //    oElem.mouseY = e.pageY; 
     //   } 
     //   else if (e.clientX || e.clientY) 
     //   { 
     //    oElem.mouseX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; 
     //    oElem.mouseY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; 
     //   } 

     // saving the element which invoked the drag 
     // to capture 'mouseout' event 
     DragHandler._dragElement = document.elementFromPoint(e.clientX, e.clientY); 
     DragHandler._dragElement.onmouseout = DragHandler._dragMouseOut; 

     document.onmousemove = DragHandler._drag; 
     document.onmouseup = DragHandler._dragEnd; 
     return false; 
    }, 

    _dragMouseOut: function (e) 
    { 
     e = window.event || e; 

     //document.getElementById("log").innerHTML += "mouseout!: " + e.clientX + "," + e.clientY + "<br/>"; 

     // calculating move by 
     var oElem = DragHandler._oElem; 
     var moveByX = e.clientX - oElem.mouseX; 
     var moveByY = e.clientY - oElem.mouseY; 

     //if (document.getElementById("log").offsetHeight > 100) 
      //document.getElementById("log").innerHTML = ""; 
     document.getElementById("log").innerHTML += "mouseout x: " + moveByX + ", y:" + moveByY + "<br/>"; 

     // setting position 
     var futureX = (x + moveByX); 
     if (futureX < 0) futureX = 0; 
     var futureY = (y + moveByY); 
     if (futureY < 0) futureY = 0; 
     oElem.style.left = futureX + 'px'; 
     oElem.style.top = futureY + 'px'; 

     oElem.mouseX = e.clientX; 
     if (oElem.mouseX < 0) oElem.mouseX = 0; 
     oElem.mouseY = e.clientY; 
     if (oElem.mouseY < 0) oElem.mouseY = 0; 
    }, 

    // private method. Drag (move) element. 
    _drag: function (e) 
    { 
     e = window.event || e; 
     var oElem = DragHandler._oElem; 
     document.getElementById("log").innerHTML += "mousemove!!!<br/>"; 

     // current element position 
     var x = oElem.offsetLeft; 
     var y = oElem.offsetTop; 

     // calculating move by 
     var moveByX = e.clientX - oElem.mouseX; 
     var moveByY = e.clientY - oElem.mouseY; 

     //if (document.getElementById("log").offsetHeight > 100) 
      //document.getElementById("log").innerHTML = ""; 
     document.getElementById("log").innerHTML += "mouse move x: " + moveByX + ", y:" + moveByY + "<br/>"; 

     // setting position 
     var futureX = (x + moveByX); 
     if (futureX < 0) futureX = 0; 
     var futureY = (y + moveByY); 
     if (futureY < 0) futureY = 0; 
     oElem.style.left = futureX + 'px'; 
     oElem.style.top = futureY + 'px'; 

     oElem.mouseX = e.clientX; 
     if (oElem.mouseX < 0) oElem.mouseX = 0; 
     oElem.mouseY = e.clientY; 
     if (oElem.mouseY < 0) oElem.mouseY = 0; 

     // canceling selection 
     if (!isIE) 
      return false; 
     else 
      document.selection.empty(); 

    }, 
    // private method. Stop drag process. 
    _dragEnd: function() 
    { 
     var oElem = DragHandler._oElem; 
     document.onmousemove = null; 
     document.onmouseup = null; 
     DragHandler._oElem = null; 

     DragHandler._dragElement.onmouseout = null; 
     DragHandler._dragElement = null; 
    } 
} 
    DragHandler.attach(document.getElementById('popup')); 
    </script> 
     </body></html> 
+0

嗨Omeriko,谢谢你的回复。我已经将你的代码包含在mousedown和mousemove处理程序的末尾,并试过了,但没有任何改变。我得到了同样的错误。请你检查一次... – 2012-01-07 06:12:27

+0

嘿,你的脚本在Firefox或Chrome中不起作用。 – Omeriko 2012-01-07 12:21:11

+0

是的Omeriko ..它不工作在IE以外,但它足以在IE中工作..我们的产品只与IE兼容。所以请在IE中检查并告诉我是否有任何错误。或者如果你有任何可用于拖动弹出窗口的代码,请传给我。 – 2012-01-07 13:22:26

0
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<HTML> 
<HEAD> 
<TITLE> New Document </TITLE> 
<META NAME="Generator" CONTENT="EditPlus"> 
<META NAME="Author" CONTENT=""> 
<META NAME="Keywords" CONTENT=""> 
<META NAME="Description" CONTENT=""> 
</HEAD> 
<style> 
    body 
    { 
     margin: 0px; 
     padding: 0px; 
    } 
    iframe 
    { 
     width: 400px; 
     height: 200px; 
    } 
    img 
    { 
     border: none; 
    } 

    .parentDisabled 
    { 
     width: 100%; 
     height: 100% background-color:red; 
     position: absolute; 
     top: 0; 
     left: 0; 
     display: block; 
     border: 1px solid blue; 
    } 
    #popup 
    { 
     position: absolute; 
     width: 400px; 
     height: 200px; 
     border: 2px solid #999188; 
     display: none; 
    } 

    #header 
    { 
     padding-right: 0px; 
     width: 400px; 
     height:20px; 
     background:#d8d8d8; 
     cursor:move; 
    } 

    #close 
    { 
     cursor: hand; 
     width: 15px; 
     position: absolute; 
     right: 0; 
     top: 0; 
     padding: 2px 2px 0px 0px; 
    } 

    #move 
    { 
     cursor: move; 
     background: #999188; 
     width: 400px; 
     line-height: 10px; 
    } 

    #container 
    { 
    } 
    .navigate 
    { 
     border: 1px solid black; 
     background: #CC00FF; 
     color: white; 
     padding: 5px; 
     cursor: hand; 
     font-weight: bold; 
     width: 150px; 
    } 
</style> 
</head> 
<body> 
    <div onclick="showPopUp('w3schools', event);" class="navigate"> 
    W3Schools</div> 
<div onclick="showPopUp('yahoo', event);" class="navigate"> 
    Yahoo</div> 
<div onclick="showPopUp('linkedin', event);" class="navigate"> 
    LinkedIn</div> 
<div onclick="showPopUp('vistex', event);" class="navigate"> 
    Vistex</div> 
<div id="popup"> 
    <div id="header"> 
     <span id="move"></span><span id="close"> 
      <img src="close_red.gif" onclick="closePopUp()" alt="Close" /></span> 
    </div> 
    <div id="container"> 
     <iframe name="frame" id="Page_View" frameborder="0">page cannot be displayed </iframe> 
    </div> 
</div> 

<div id='log'></div> 

</body> 
<script> 
var popUpEle = null; 
var isIE = navigator.appVersion.indexOf("MSIE") !== -1; 

function showPopUp(value, evt) 
{ 
    evt = evt ? evt : window.event; 
    var left = evt.clientX; 
    var top = evt.clientY; 

    popUpEle = document.getElementById('popup'); 
    if (popUpEle) 
    { 
     closePopUp(); 
     var url = "http://www." + value + ".com"; 
     document.getElementById('Page_View').src = url; 

     popUpEle.style.left = left; 
     popUpEle.style.top = top; 
     popUpEle.style.filter = "revealTrans(transition=1, duration=1)"; 
     if (isIE) 
     { 
      popUpEle.filters.revealTrans(transition = 1, duration = 1).Apply(); 
      popUpEle.filters.revealTrans(transition = 1, duration = 1).Play(); 
     } 
     popUpEle.style.display = "block"; 
    } 
} 
function closePopUp() 
{ 
    if (popUpEle) 
    { 
     popUpEle.style.filter = "revealTrans(transition=0, duration=4)"; 
     if (isIE) 
     { 
      popUpEle.filters.revealTrans(transition = 0, duration = 5).Apply(); 
      popUpEle.filters.revealTrans(transition = 0, duration = 5).Play(); 
     } 
     popUpEle.style.display = "none"; 

    } 
} 

var dragApproved=false; 
var DragHandler = { 

    // private property. 
    _oElem : null, 

    // public method. Attach drag handler to an element. 
    attach : function(oElem) { 
     oElem.onmousedown = DragHandler._dragBegin; 
     // callbacks 
     oElem.dragBegin = new Function(); 
     oElem.drag = new Function(); 
     oElem.dragEnd = new Function(); 
     return oElem; 
    }, 

    // private method. Begin drag process. 
    _dragBegin : function(e) { 

     if (!document.all)return; 

     var oElem = DragHandler._oElem = this; 

     if (isNaN(parseInt(oElem.style.left))){ oElem.style.left = '0px'; } 
     if (isNaN(parseInt(oElem.style.top))) { oElem.style.top = '0px'; } 

     var x = parseInt(oElem.style.left); 
     var y = parseInt(oElem.style.top); 

     e = e ? e : window.event; 

     if (e.pageX || e.pageY) 
     { 
     oElem.mouseX = e.pageX; 
     oElem.mouseY = e.pageY; 
     } 
     else if (e.clientX || e.clientY)  { 
     oElem.mouseX = e.clientX + document.body.scrollLeft+ document.documentElement.scrollLeft; 
     oElem.mouseY = e.clientY + document.body.scrollTop+ document.documentElement.scrollTop; 
     } 
     document.onmousemove = DragHandler._drag; 
     dragApproved=true; 
     document.onmouseup = DragHandler._dragEnd; 
     return false; 
    }, 

    // private method. Drag (move) element. 
    _drag : function(e) { 

    if(dragApproved && event.button==1) 
     { 
     var oElem = DragHandler._oElem; 

     var x = parseInt(oElem.style.left); 
     var y = parseInt(oElem.style.top); 

     e = e ? e : window.event; 

     var clientXTmp,clientYTmp; 
     if (e.pageX || e.pageY) 
     { 
     clientXTmp = e.pageX; 
     clientXTmp = e.pageY; 
     } 
     else if (e.clientX || e.clientY)  { 
     clientXTmp = e.clientX + document.body.scrollLeft+ document.documentElement.scrollLeft; 
     clientYTmp = e.clientY + document.body.scrollTop+ document.documentElement.scrollTop; 
     } 

     var tmpX = x + (clientXTmp - oElem.mouseX); 
     var tmpY = y + (clientYTmp - oElem.mouseY); 

     if(tmpX<=0){tmpX = 0;} 
     if(tmpY<=0){tmpY = 0;} 
     //Avoiding scrolling of rigth and bottom of the window 
     if((tmpX+oElem.offsetWidth) > document.body.offsetWidth) 
      { 
      tmpX= document.body.offsetWidth-oElem.offsetWidth; 
      } 
     if((tmpY+oElem.offsetHeight) > document.body.offsetHeight) 
      { 
      tmpY= document.body.offsetHeight-oElem.offsetHeight; 
      } 

     oElem.style.left = tmpX + 'px'; 
     oElem.style.top = tmpY + 'px'; 

     oElem.mouseX = clientXTmp; 
     oElem.mouseY = clientYTmp; 
     return false; 
    } 
    }, 

    // private method. Stop drag process. 
    _dragEnd : function() 
    { 
     dragApproved=false; 
     var oElem = DragHandler._oElem; 
     document.onmousemove = null; 
     document.onmouseup = null; 
     DragHandler._oElem = null; 
    } 
} 

DragHandler.attach(document.getElementById('popup')); 
</script> 
</HTML>