将画布线绘制到具有相同类名的所有div

时间:2015-08-26 03:57:02

标签: javascript html5 html5-canvas

我正在制作一个文档,通过用户输入构建树型图。我试图将样式的div连接到他们用画布线分支的相对div。 我一直在使用.getBoundingClientRect()来获取位置,但div与内联块是静态的,因此每次添加新的时,整个结构都会发生变化。

所以,这是我尝试每次创建一个新分支时调用的'for循环',以重新绘制所有画布线。

var lines = function(){
    var blocks=document.getElementsByClassName('block');
for (i=1;i<blocks.length-1;i++){
    var blockDiv = blocks[i]
    var offset = blockDiv.getBoundingClientRect();
    var xa = offset.left+40;
    var ya = offset.top+40;
    var blockFrom = blockDiv.parentNode.parentNode.previousSibling;
    var offsets = blockFrom.getBoundingClientRect();
    var yb = offsets.top+40;
    var xb = offsets.left+40;
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext("2d");
    ctx.moveTo(xa,ya);
    ctx.lineTo(xb,yb);
    ctx.stroke();   
  }
} 

这是一个jsfiddle,所以你可以看到div的一般结构。

当调用该函数时,我没有画布线和控制台错误 166 Uncaught TypeError: blockDiv.parentNode.parentNode.previousSibling.getBoundingClientRect is not a function

我对这个很难过,非常感谢你的帮助 我是画布,javascript和编码的新手,所以任何其他建设性的批评也会受到高度赞赏。 :)

Vanilla js只是请!

1 个答案:

答案 0 :(得分:1)

问题在于:

  

基于Gecko的浏览器将文本节点插入到要表示的文档中   源标记中的空格。因此获得了一个节点   例如,使用Node.firstChild或Node.previousSibling可以引用a   空白文本节点而不是作者的实际元素   意图得到。

https://developer.mozilla.org/en-US/docs/Web/API/Node/previousSibling

因此,请更改此行:

var blockFrom = blockDiv.parentNode.parentNode.previousSibling;

到此:

var blockFrom = blockDiv.parentNode.parentNode.previousSibling.previousSibling;