什么形状不要紧的(其实我们看三角型、曲线、直线等好象体积不规则很小,但实际上其X,Y,WIDTH,HEIGHT就是一个“隐性矩形”,是一个很大的面积,可以用document.elementFromPoint(x,y)捕捉的,哪怕XY交接点触及不到“我们可见”的图形)请CSDN高手参与讨论,用最好的办法实现该功能。

解决方案 »

  1.   

    那你取得document的所有对象,取得对象的left,top,right,bottom四个顶点,计算只要一个点在选的矩形内则选中
      

  2.   

    ……,好方法,这样在用document.elementFromPoint(x,y)就减少了许多次循环,比我以前想的要高明:)同志们请继续
      

  3.   

    在判断顶点在不在范围时,objLeft>selRight||objRight<selLeft||objTop>selBottom||objBottom<selTop
    则直接可以不判断
      

  4.   

    也或者可以这样理解,选取区域为A,绘制对象为B,如果B的一个边界点如果在A内则认为选中,同时反过来,如果A的一个边界点如果在B内,我们也可以认为B为选中.这样遍历收集绘制对象数组,都做两个判断,这样是不是会更快一些呢?
      

  5.   

    好了,不能光当言论家、要实践,没人献码?我来:)方法一:<HTML xmlns:v>
    <Meta name='Gemeratpr' content='网络程序员伴侣(Lshdic)2005'>
    <TITLE>区域选择第一种实现方法演示</TITLE>
    <STYLE>v\:*{behavior:url(#default#VML);}</STYLE>
    <BODY oncontextmenu='return false' onselectstart='return false'>
    <v:rect class=keshi style=position:absolute;display:none;z-index:5000 id=rect1 fillcolor=#eeeeee><v:Stroke dashstyle="dashdot"/><v:fill opacity=".5"/></v:rect>
    <script>
    /*区域选择第一种实现方法演示(效率一般,但编写稍简)
    作者:沐缘华(原名:风云舞)
    msn:[email protected]
    Q:21152530
    转载请保留*/
    var xx=0,yy=0
    function document.onmousedown(){
    xx=event.x;yy=event.y;
    rect1.style.left=xx;rect1.style.top=yy;rect1.style.width=0;rect1.style.height=0;rect1.style.display=""
    }
    function document.onmousemove(){
    tempx=event.x;tempy=event.y
    if(tempx-xx<0){rect1.style.left=tempx;rect1.style.width=(xx-tempx)}else{rect1.style.width=(tempx-xx)}
    if(tempy-yy<0){rect1.style.top=tempy;rect1.style.height=(yy-tempy)}else{rect1.style.height=(tempy-yy)}
    }
    function document.onmouseup(){  //关键算法在这里
    rect1.style.display="none"
    var left1=parseInt(rect1.style.left),top1=parseInt(rect1.style.top)
    var width1=parseInt(rect1.style.width),height1=parseInt(rect1.style.height)
    var objs=[],notag="BODY",youbiao=-1
    var text1="",randomcolor='rgb('+Math.round(Math.random()*255)+','+Math.round(Math.random()*255)+','+Math.round(Math.random()*255)+')'
    var jingquedu=10  //精确度10px:该值越低,越精确,但越慢,推荐范围3-15……
    for(r=left1;r<left1+width1;r+=jingquedu){
    for(i=top1;i<top1+height1;i+=jingquedu){
    var tempobj=document.elementFromPoint(r,i)
    if(tempobj.tagName!=notag){
    if(objs[youbiao]!=tempobj){youbiao++;objs[youbiao]=tempobj;tempobj.style.display="none"}
    }
    }}
    for(i=0;i<youbiao+1;i++){objs[i].style.display="";objs[i].fillcolor=randomcolor;text1+=(objs[i].id+",");}
    alert("共选择:"+(youbiao+1)+"个对象\n\n"+text1.substr(0,text1.length-1))
    }
    </script>
    <!--以下代码输出基础形状-->
    <v:oval id=vml8 style="Z-INDEX:3014;LEFT:329;WIDTH:25;POSITION:absolute;TOP:191;HEIGHT:26" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml9 style="Z-INDEX:3015;LEFT:380;WIDTH:72;POSITION:absolute;TOP:206;HEIGHT:42" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml10 style="Z-INDEX:3016;LEFT:389;WIDTH:46;POSITION:absolute;TOP:268;HEIGHT:27" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml11 style="Z-INDEX:3017;LEFT:344;WIDTH:33;POSITION:absolute;TOP:326;HEIGHT:36" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml12 style="Z-INDEX:3018;LEFT:221;WIDTH:36;POSITION:absolute;TOP:381;HEIGHT:51" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml13 style="Z-INDEX:3019;LEFT:338;WIDTH:82;POSITION:absolute;TOP:459;HEIGHT:39" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml14 style="Z-INDEX:3020;LEFT:527;WIDTH:43;POSITION:absolute;TOP:215;HEIGHT:50" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml15 style="Z-INDEX:3021;LEFT:504;WIDTH:54;POSITION:absolute;TOP:294;HEIGHT:51" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml16 style="Z-INDEX:3022;LEFT:644;WIDTH:104;POSITION:absolute;TOP:101;HEIGHT:57" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml17 style="Z-INDEX:3023;LEFT:687;WIDTH:65;POSITION:absolute;TOP:262;HEIGHT:34" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:rect id=vml18 style="Z-INDEX:3024;LEFT:565;WIDTH:63;POSITION:absolute;TOP:356;HEIGHT:76" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:rect id=vml19 style="Z-INDEX:3025;LEFT:658;WIDTH:104;POSITION:absolute;TOP:391;HEIGHT:77" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:rect id=vml20 style="Z-INDEX:3026;LEFT:359;WIDTH:24;POSITION:absolute;TOP:265;HEIGHT:28" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:rect id=vml21 style="Z-INDEX:3027;LEFT:570;WIDTH:41;POSITION:absolute;TOP:141;HEIGHT:51" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:rect id=vml22 style="Z-INDEX:3028;LEFT:507;WIDTH:48;POSITION:absolute;TOP:194;HEIGHT:40" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
      

  6.   

    方法二:使用ttyp的思路完成内部,外围还是需要document.elementFromPoint(x,y),折腾了近一个小时完成。<HTML xmlns:v>
    <Meta name='Gemeratpr' content='网络程序员伴侣(Lshdic)2005'>
    <TITLE>区域选择第二种实现方法演示</TITLE>
    <STYLE>v\:*{behavior:url(#default#VML);}</STYLE>
    <BODY oncontextmenu='return false' onselectstart='return false'>
    <v:rect class=keshi style=position:absolute;display:none;z-index:5000 id=rect1 fillcolor=#eeeeee><v:Stroke dashstyle="dashdot"/><v:fill opacity=".5"/></v:rect>
    <script>
    /*区域选择第二种实现方法演示(效率高,但编写复杂)
    作者:沐缘华(原名:风云舞)
    msn:[email protected]
    Q:21152530
    转载请保留*/
    var xx=0,yy=0
    function document.onmousedown(){
    xx=event.x;yy=event.y;
    rect1.style.left=xx;rect1.style.top=yy;rect1.style.width=0;rect1.style.height=0;rect1.style.display=""
    }
    function document.onmousemove(){
    tempx=event.x;tempy=event.y
    if(tempx-xx<0){rect1.style.left=tempx;rect1.style.width=(xx-tempx)}else{rect1.style.width=(tempx-xx)}
    if(tempy-yy<0){rect1.style.top=tempy;rect1.style.height=(yy-tempy)}else{rect1.style.height=(tempy-yy)}
    }
    function document.onmouseup(){  //关键算法在这里
    rect1.style.display="none"
    var left1=parseInt(rect1.style.left),top1=parseInt(rect1.style.top)
    var width1=parseInt(rect1.style.width),height1=parseInt(rect1.style.height)
    var randomcolor='rgb('+Math.round(Math.random()*255)+','+Math.round(Math.random()*255)+','+Math.round(Math.random()*255)+')'
    var objs=[],youbiao=-1,tempx=[],notag="BODY"
    for(i=0;i<document.body.children.length;i++){
    objs[i]=document.body.children[i]
    tempx[0]=parseInt(objs[i].style.left);tempx[1]=parseInt(objs[i].style.top)
    tempx[2]=parseInt(objs[i].style.width);tempx[3]=parseInt(objs[i].style.height)
     //改变所有包围的元素
    if(tempx[0]>left1&&tempx[1]>top1&&tempx[0]+tempx[2]<left1+width1&&tempx[1]+tempx[3]<top1+height1){objs[i].fillcolor=randomcolor;continue;}
    }
    var jingquedu=3  //精确度3px:该值越低,越精确,但越慢,推荐范围1-10……
    for(r=left1;r<left1+width1;r+=jingquedu){
    var tempobj=document.elementFromPoint(r,top1)  //周边(上条线)触及
    if(tempobj.tagName!=notag){if(objs[youbiao]!=tempobj){youbiao++;objs[youbiao]=tempobj;tempobj.style.display="none"}}
    var tempobj=document.elementFromPoint(r,top1+height1)  //周边(下条线)触及
    if(tempobj.tagName!=notag){if(objs[youbiao]!=tempobj){youbiao++;objs[youbiao]=tempobj;tempobj.style.display="none"}}
    }
    for(i=top1;i<top1+height1;i+=jingquedu){
    var tempobj=document.elementFromPoint(left1,i)  //周边(左条线)触及
    if(tempobj.tagName!=notag){if(objs[youbiao]!=tempobj){youbiao++;objs[youbiao]=tempobj;tempobj.style.display="none"}}
    var tempobj=document.elementFromPoint(left1+width1,i)  //周边(右条线)触及
    if(tempobj.tagName!=notag){if(objs[youbiao]!=tempobj){youbiao++;objs[youbiao]=tempobj;tempobj.style.display="none"}}
    }
    for(i=0;i<youbiao+1;i++){objs[i].style.display="";objs[i].fillcolor=randomcolor;}
    }
    </script>
    <!--以下代码输出基础形状-->
    <v:oval id=vml8 style="Z-INDEX:3014;LEFT:329;WIDTH:25;POSITION:absolute;TOP:191;HEIGHT:26" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml9 style="Z-INDEX:3015;LEFT:380;WIDTH:72;POSITION:absolute;TOP:206;HEIGHT:42" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml10 style="Z-INDEX:3016;LEFT:389;WIDTH:46;POSITION:absolute;TOP:268;HEIGHT:27" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml11 style="Z-INDEX:3017;LEFT:344;WIDTH:33;POSITION:absolute;TOP:326;HEIGHT:36" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml12 style="Z-INDEX:3018;LEFT:221;WIDTH:36;POSITION:absolute;TOP:381;HEIGHT:51" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml13 style="Z-INDEX:3019;LEFT:338;WIDTH:82;POSITION:absolute;TOP:459;HEIGHT:39" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml14 style="Z-INDEX:3020;LEFT:527;WIDTH:43;POSITION:absolute;TOP:215;HEIGHT:50" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml15 style="Z-INDEX:3021;LEFT:504;WIDTH:54;POSITION:absolute;TOP:294;HEIGHT:51" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml16 style="Z-INDEX:3022;LEFT:644;WIDTH:104;POSITION:absolute;TOP:101;HEIGHT:57" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:oval id=vml17 style="Z-INDEX:3023;LEFT:687;WIDTH:65;POSITION:absolute;TOP:262;HEIGHT:34" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:rect id=vml18 style="Z-INDEX:3024;LEFT:565;WIDTH:63;POSITION:absolute;TOP:356;HEIGHT:76" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:rect id=vml19 style="Z-INDEX:3025;LEFT:658;WIDTH:104;POSITION:absolute;TOP:391;HEIGHT:77" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:rect id=vml20 style="Z-INDEX:3026;LEFT:359;WIDTH:24;POSITION:absolute;TOP:265;HEIGHT:28" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:rect id=vml21 style="Z-INDEX:3027;LEFT:570;WIDTH:41;POSITION:absolute;TOP:141;HEIGHT:51" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
    <v:rect id=vml22 style="Z-INDEX:3028;LEFT:507;WIDTH:48;POSITION:absolute;TOP:194;HEIGHT:40" fillcolor="#fd434d" strokecolor="black" strokeweight="1px"/>
      

  7.   

    你所做的工作我不擅长,我只懂简单的javaScrip.其实你的这个工作,如果是在VC++里边的话,根本一点都不复杂的.
      

  8.   

    如果没走错,这里是JS论坛。
    期待高手、有这类代码收藏的朋友回贴共享代码,找到代码最简、效率最高的实现方法或者其他不同于我的代码/思路,如果没有,部分给ttyp,其他分不知送谁了:)