以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 SVG/GML/VRML/X3D/XAML 』  (http://bbs.xml.org.cn/list.asp?boardid=21)
----  svg画直线怎么总是出错?  (http://bbs.xml.org.cn/dispbbs.asp?boardid=21&rootid=&id=37916)


--  作者:zw1213
--  发布时间:9/14/2006 1:48:00 PM

--  svg画直线怎么总是出错?
//画直线
function drawArrow()
{
   arrow=svgDoc.createElement("line");
   arrow.setAttribute("x1",x);
   arrow.setAttribute("y1",y);
   arrow.setAttribute("stroke","blue");
   arrow.setAttribute("stroke-width",3);
}
//鼠标onmousemove 事件
function moveArrow(evt)
{  
   if(shape=="arrow")
   {    
       x1=evt.clientX;
       y1=evt.clientY;
       arrow.setAttribute("x2",x1);
       arrow.setAttribute("y2",y1);
       drawing.appendChild(arrow);
   }
}
//onmouseup事件
function endDrawing()
{
  shape="";
}

鼠标抬起的话,也不停止画,第二次画的时候开始坐标就和前一次结束的位置一样
从结束那点开始画起了。连在一起了

请大家帮忙看一下,怎么回事。


--  作者:daidaixiong
--  发布时间:9/14/2006 5:16:00 PM

--  
你把完整代码发一下吧,包括mousedown的函数,看看可不可以找到毛病。
--  作者:tamefox
--  发布时间:9/15/2006 9:08:00 AM

--  
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat-20030114.dtd">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
 <desc>
  <!-- put a description here -->
 </desc>
 <script type="text/javascript"><![CDATA[
  var x,y,arrow,shape;
  function drawArrow(evt){
       var drawing=document.getElementById('drawing');
     if(evt.detail==2){
       document.getElementById("bg").setAttribute("visibility","hidden");
       return;
     }
        x=evt.screenX;
        y=evt.screenY;
        if(shape=="arrow"){
          arrow.setAttribute("x2",x);
    arrow.setAttribute("y2",y);                    
        }        
        arrow=document.createElement("line");
        arrow.setAttribute("x1",x);
        arrow.setAttribute("y1",y);
        arrow.setAttribute("x2",evt.screenX);
        arrow.setAttribute("y2",evt.screenY);
        arrow.setAttribute("stroke","blue");
        arrow.setAttribute("stroke-width",1);
        drawing.appendChild(arrow);
        shape="arrow";       
     }     
    function moveArrow(evt)
     {  
        if(shape=="arrow")
         {    
     x=evt.clientX;
     y=evt.clientY;
     arrow.setAttribute("x2",x);
     arrow.setAttribute("y2",y);     
        }
     }
    ]]></script>
 <g id="drawing">
 </g>
 <rect id="bg" width="100%" height="100%" fill="none" pointer-events="visible" onclick="drawArrow(evt)"  onmousemove="moveArrow(evt)"/> 
</svg>

--  作者:daidaixiong
--  发布时间:9/15/2006 2:00:00 PM

--  
呵呵,怎么发的人换了。如果代码是一样的话,我做了如下改动
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-flat-20030114.dtd">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
<desc>
  <!-- put a description here -->
</desc>
<script type="text/javascript"><![CDATA[
  var x,y,arrow,shape;
  function drawArrow(evt){
       var drawing=document.getElementById('drawing');
     if(evt.detail==2){
       document.getElementById("bg").setAttribute("visibility","hidden");
       return;
     }
        x=evt.screenX;
        y=evt.screenY;
        if(shape=="arrow"){
          arrow.setAttribute("x2",x);
    arrow.setAttribute("y2",y);                    
        }        
        arrow=document.createElement("line");
        arrow.setAttribute("x1",x);
        arrow.setAttribute("y1",y);
        arrow.setAttribute("x2",evt.screenX);
        arrow.setAttribute("y2",evt.screenY);
        arrow.setAttribute("stroke","blue");
        arrow.setAttribute("stroke-width",1);
        drawing.appendChild(arrow);
        shape="arrow";       
     }     
    function moveArrow(evt)
     {  
        if(shape=="arrow")
         {    
     x=evt.clientX;
     y=evt.clientY;
     arrow.setAttribute("x2",x);
     arrow.setAttribute("y2",y);     
        }
     }
     function mouseup()
     {
        shape="";
     }
    ]]></script>
<g id="drawing">
</g>
<rect id="bg" width="100%" height="100%" fill="none" pointer-events="visible" onmousedown="drawArrow(evt)"  onmousemove="moveArrow(evt)" onmouseup="mouseup()"/>
</svg>
如果原来确实是onclick="drawArrow(evt)",那么改成onmousedown="drawArrow(evt)",因为事件响应的顺序总是先有mousedown,然后才有mouseup,如果将mousedown换成click,来设定初始坐标的话,当执行mousemove以后,就不会响应mouseup事件了。
--  作者:zw1213
--  发布时间:9/15/2006 2:55:00 PM

--  
我的mouseup不响应。
画的时候是用的onmousedown不是click,但mouseup不起作用
不知道是怎么回事?
[此贴子已经被作者于2006-9-17 11:05:44编辑过]

--  作者:daidaixiong
--  发布时间:9/18/2006 8:52:00 AM

--  
要不你还是发一段你比较 完整的代码吧,凭空想象不出来啊
--  作者:zw1213
--  发布时间:9/19/2006 4:28:00 PM

--  
谢谢。问题已经解决了。
我的onmouseup放在<g>里就可以
放到<rect>里就不行。不知道是怎么回事

--  作者:ncepuyuyu
--  发布时间:9/21/2006 5:35:00 PM

--  
因为你的rect的一个属性被设成这个了fill="none"
你把fill随便设成别的,别为空,肯定就行了
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
78.125ms