2017-01-09 2 views
0

私は自分のパス上でjavascriptを学習しています& SVGそして最近、キャンバス空間に様々な任意のSVGパスをドラッグ&ドロップしてさらに操作する、この小さなウィジェットに取り組んでいました。小さなSVGアプリ - javascriptとHTMLのアーキテクチャ

私の以前の質問では、良いマウスハンドラ/リスナを使ってSVGの実際のドラッグ可能なコードをどのようにコード化するかについて非常にまともな回答を得ました。

今、私はJavascriptがHTMLとどのように「話し合っているか」の理解がないためにブロックされていますか?

この例では、次のように表示されています。 - HTML要素から6つのjavascriptオブジェクトを生成しました。 - これらの6つのシェイプがインタラクティブな要素に変わり、今度は をドラッグできますが、そのSelect(elem)関数を使用してそのようなシェイプをダブルクリックしようとするとpathPointsプロパティにアクセスできません。私はまだHTML要素とjsオブジェクトが本当に一緒にリンクされていないか何かを理解していると思います。

  1. 誰かが私に何かを尋ねることができますか?私はここで何が欠けていますか?
  2. このようなことを広義に学ぶにはどうすればいいですか? "javascriptの編成" "htmlからjavascriptへのバインディング"私はあなたが簡単なプログラミングの不一致ではなく、HTMLの欠如を持っているように見える、表面に

var selectedShape = null; 
 

 
var src = document.querySelectorAll(".inventory"); 
 
for (var h = 0; h < src.length; h++) { 
 
    var o = new Draggable(src[h]); 
 
    inventory[h] = o; //not sure:// 
 
} 
 

 

 
function Draggable(elem) { 
 
    this.target = elem 
 
    this.clickPoint = this.target.ownerSVGElement.createSVGPoint() 
 
    this.lastMove = this.target.ownerSVGElement.createSVGPoint() 
 
    this.currentMove = this.target.ownerSVGElement.createSVGPoint() 
 
    this.dpath = this.target.getAttribute("d") 
 
    this.subclass = this.target.getAttribute("subclass") 
 
    this.pathPoints = parsePathToPoints(this.dpath, this.subclass) 
 
    this.target.addEventListener("dblclick", this) 
 
    this.target.addEventListener("mousedown", this) 
 
    this.handleEvent = function(evt) { 
 
    switch (evt.type) { 
 
     case 'mousedown': 
 
     evt.preventDefault() 
 
     this.clickPoint = globalToLocalCoords(evt.clientX, evt.clientY) 
 
     this.target.classList.add("dragged") 
 
     this.target.ownerSVGElement.addEventListener("mousemove", this.move) 
 
     this.target.ownerSVGElement.addEventListener("mouseup", this.endMove) 
 
      //this.target.setAttribute("pointer-events", "all") 
 
      // bummer - tried all I could but if I use the line above - dblclick is no longer recognized/ 
 
     break; 
 
     case 'dblclick': 
 
     evt.preventDefault() 
 
     if (selectedShape) { 
 
      if (selectedShape != this.target) { 
 
      selectedShape.classList.remove("selected") 
 
      this.target.classList.add("selected") 
 
      selectedShape = elem; 
 
      } else { 
 
      return; 
 
      } 
 
     } else { 
 
      selectedShape = elem 
 
      this.target.classList.add("selected") 
 
     } 
 
     Select(this.target); 
 
     break; 
 
    } 
 
    } 
 
    this.move = function(evt) { 
 
    evt.preventDefault() 
 
    var p = globalToLocalCoords(evt.clientX, evt.clientY) 
 
    this.currentMove.x = this.lastMove.x + (p.x - this.clickPoint.x) 
 
    this.currentMove.y = this.lastMove.y + (p.y - this.clickPoint.y) 
 
    this.target.setAttribute("transform", "translate(" + this.currentMove.x + "," + this.currentMove.y + ")") 
 
    }.bind(this) 
 
    this.endMove = function(evt) { 
 
    this.lastMove.x = this.currentMove.x 
 
    this.lastMove.y = this.currentMove.y 
 
    this.target.classList.remove("dragged") 
 
    this.target.setAttribute("pointer-events", "all") 
 
    this.target.ownerSVGElement.removeEventListener("mousemove", this.move) 
 
    this.target.ownerSVGElement.removeEventListener("mouseup", this.endMove) 
 
    }.bind(this) 
 

 
    function globalToLocalCoords(x, y) { 
 
    var p = elem.ownerSVGElement.createSVGPoint() 
 
    var m = elem.parentNode.getScreenCTM() 
 
    p.x = x 
 
    p.y = y 
 
    return p.matrixTransform(m.inverse()) 
 
    } 
 
} 
 

 
function Select(elem) { 
 
    console.log(elem.pathPoints); 
 
} 
 

 
function parsePathToPoints(d, sub) { 
 
    var darray = []; 
 
    var pathPoints = {}; 
 
    switch (sub) { 
 
    case 'circle': 
 
     darray = d.replace(/M|A|Z/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
     pathPoints.p0 = { 
 
     "x": darray[0], 
 
     "y": darray[1] 
 
     }; 
 
     pathPoints.p1 = { 
 
     "x": darray[0] + darray[2], 
 
     "y": darray[1] - darray[3] 
 
     }; 
 
     pathPoints.p2 = { 
 
     "x": darray[7], 
 
     "y": darray[8] 
 
     }; 
 
     pathPoints.p3 = { 
 
     "x": darray[0] + darray[2], 
 
     "y": darray[1] + darray[3] 
 
     }; 
 
     pathPoints.p4 = { 
 
     "x": darray[2], 
 
     "y": darray[3] 
 
     }; // = radius used in the circle path 
 
     return pathPoints; 
 
     break; 
 
    case 'curve4': 
 
     darray = d.replace(/M|Q/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
     for (i = 0, j = 1, o = 9; i < darray.length - 2; i += 2, j += 2, o++) { 
 
     pathPoints["p" + (o - 9)] = { 
 
      "x": darray[i], 
 
      "y": darray[j] 
 
     }; 
 
     }; 
 
     return pathPoints; 
 
     break; 
 
    case 'curve3': 
 
     darray = d.replace(/M|Q/g, "").replace(/,/g, " ").split(" ").map(Number) 
 
     for (i = 0, j = 1, o = 9; i < darray.length; i += 2, j += 2, o++) { 
 
     pathPoints["p" + (o - 9)] = { 
 
      "x": darray[i], 
 
      "y": darray[j] 
 
     }; 
 
     } 
 
     return pathPoints; 
 
     break; 
 
    case 'curve2': 
 
     darray = d.replace(/M|Q/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
     for (i = 0, j = 1, o = 9; i < darray.length; i += 2, j += 2, o++) { 
 
     pathPoints["p" + (o - 9)] = { 
 
      "x": darray[i], 
 
      "y": darray[j] 
 
     }; 
 
     } 
 
     return pathPoints; 
 
     break; 
 
    case 'curve1': 
 
     darray = d.replace(/M|Q/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
     for (i = 0, j = 1, o = 9; i < darray.length; i += 2, j += 2, o++) { 
 
     pathPoints["p" + (o - 9)] = { 
 
      "x": darray[i], 
 
      "y": darray[j] 
 
     }; 
 
     } 
 
     return pathPoints; 
 
     break; 
 
    case 'cubic': 
 
     darray = d.replace(/M|C/g, "").replace(/,/g, " ").split(" ").map(Number); 
 
     for (i = 0, j = 1, o = 9; i < darray.length; i += 2, j += 2, o++) { 
 
     pathPoints["p" + (o - 9)] = { 
 
      "x": darray[i], 
 
      "y": darray[j] 
 
     }; 
 
     } 
 
     return pathPoints; 
 
     break; 
 
    } 
 
} 
 

 
function pointsToPath(pathPoints, pathSubclass) { 
 
    console.log("joining " + pathPoints + "for a " + pathSubclass); 
 
}
html, 
 
body { 
 
    margin: 0; 
 
    padding: 0; 
 
    border: 0; 
 
    overflow: hidden; 
 
    background-color: #fff; 
 
} 
 
svg { 
 
    position: fixed; 
 
    top: 0%; 
 
    left: 0%; 
 
    width: 100%; 
 
    height: 100%; 
 
} 
 
.inventory { 
 
    fill: transparent; 
 
    stroke: black; 
 
    cursor: move; 
 
} 
 
.dragged { 
 
    fill: transparent; 
 
    stroke: green; 
 
    cursor: move; 
 
} 
 
.selected { 
 
    fill: transparent; 
 
    stroke: red; 
 
    cursor: move; 
 
} 
 
path { 
 
    stroke-width: 3; 
 
    stroke: #000; 
 
    stroke-linecap: round; 
 
} 
 
path.fill { 
 
    fill: #3ff; 
 
} 
 
#canvasBackground { 
 
    fill: lightgrey; 
 
} 
 
#inventoryBackground { 
 
    fill: grey; 
 
}
<body> 
 
    <svg id="svg" height="480" width="480" viewbox="0 0 480 580" preserveAspectRatio="xMinYMax meet" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 
 
    <rect id="canvasBackground" width="480" height="480" x="0" y="0" pointer-events="all" /> 
 
    <rect id="inventoryBackground" width="480" height="100" x="0" y="480" pointer-events="all" /> 
 

 
    <g id="inventory"> 
 
     <path class="inventory" subclass="circle" d="M30,530 A35,35 1 1,1 100,530 A35,35 1 1,1 30,530" /> 
 
     <path class="inventory" subclass="curve4" d="M125,500 Q155,490 185,500 Q195,530 185,560 Q155,570 125,560 Q115,530 125,500" /> 
 
     <path class="inventory" subclass="curve3" d="M245,495 Q275,520 280,560 Q245,570 210,560 Q215,520 245,495" /> 
 
     <path class="inventory" subclass="curve2" d="M305,515 Q345,475 385,515 Q345,555 305,515" /> 
 
     <path class="inventory" subclass="curve1" d="M305,550 Q345,580 385,550" /> 
 
     <path class="inventory" subclass="cubic" d="M420,495 C470,530 380,530 425,565" /> 
 
    </g> 
 

 
    <g id="canvas"> 
 
    </g> 
 
    </svg> 
 
</body>

+0

はありませんsrc [h] .getAttribute( "d")あなたに何をしたいですか?もしあなたが正確に何をしたいのですか? –

答えて

0

。これらが呼ばれる方法も、必ずこれらの事を学び、しないようにしたいです知識。 Draggbleオブジェクトのプロパティ、つまりtarget(HTML要素)を渡しています。ただし、pathPointsはあなたのオブジェクトのプロパティとは全く異なります。 、デモンストレーションを検討するには:

...スニップ...

Select(this); 

...スニップ...

function Select(draggable) { 
    console.log(draggable.pathPoints); 
} 

あなたはまだあなたのhtmlへのアクセスを持っているでしょう要素がSelectにある場合は、draggable.targetとしてください。あなたが探していたより深い点を逃した場合は申し訳ありません...

+0

ねえ、そうですね、問題はDraggableファクトリ(またはそれが呼び出されたもの)によって生成されたすべてのシェイプのpathPointsプロパティを "作成している"と思っていましたが、そのようなプロパティを生成されたシェイプオブジェクト私はthis.target.pathPointsを使っていたはずです。ヒントをありがとう! –

関連する問題