javascript - 通过 Raphael.JS 元素更新 HTML 信息

标签 javascript jquery html css raphael

我正在尝试使用 Raphael.js 以及一些 HTML 标记更新通过点击事件创建的系列或圈子的信息。创建它们时,生成的 html 会保留圆的信息及其 X、Y 和半径的位置,当我移动圆或更改其大小时可以动态更改这些信息,这个 JSFiddle 显示得更清楚:

http://jsfiddle.net/mauricioSanchez/L4mAL/

我有我的事件监听器

    canvasHandler.mouseup(function (e) {

    var mouseX = e.offsetX;
    var mouseY = e.offsetY;
    if (circlePickerSelector) {
        makeCircle(mouseX, mouseY);
        circlePickerSelector = false;
    }       
});

circlePicker.click(function () {
    circlePickerSelector = !circlePickerSelector;

});

这是在第一个 eventListener 中调用的主要函数。它创建了圆圈和 HTML 元素

function makeCircle(mouseX, mouseY) {
    //We call it before our circles are dragged so that their array is waiting to store the information
    // addingArrays(circleCounter);
    var radius;
    var fill;
    var circle = canvas.circle(mouseX, mouseY, 50).attr({
        fill: "hsb(.8, 1, 1)",
        stroke: "none",
        opacity: .5,
    });
    // console.log(circles);
    // We add an ID and a class to the circle
    var ourCircle = $("circle").last();
    ourCircle.attr("class", circleCounter);
    // And then finally push it to our array of circles
    circles.push(circle);
    var handlerPos = [mouseX + 35, mouseY + 35];
    var s = canvas.circle(handlerPos[0], handlerPos[1], 10).attr({
        fill: "hsb(.8, .5, .5)",
        stroke: "none",
        opacity: .5
    });
    //We add an id and a class to our little circle.
    s.node.id = sizerCounter;
    var sizerClass = $('circle').last();
    sizerClass.attr("class", "main-circle sizer");
    var newSizerClass = $(".sizer");
    // console.log(s);
    s.hide();
    //We now assign a handler for each little circle added and a main circle in order to hide them
    var circleClass = $("." + String(circleCounter));
    var sizerID = $("#" + String(sizerCounter));
    circleClass.mouseenter(function () {
        sizerID.toggle();
    });
    circleClass.mouseleave(function () {
        sizerID.hide();
    });
    sizerID.mouseenter(function () {
        $(this).toggle();
    });
    sizerID.mouseleave(function () {
        $(this).hide();
    });
    // console.log(circleClass);
    //We add some resizing and dragging properties
    var start = function () {
        //storing original coordinates
        this.ox = this.attr("cx");
        this.oy = this.attr("cy");
        this.sizer.ox = this.sizer.attr("cx");
        this.sizer.oy = this.sizer.attr("cy")
        this.attr({
            opacity: 1
        });
        this.sizer.attr({
            opacity: 1
        });
    }, move = function (dx, dy) {
            // move will be called with dx and dy
            this.attr({
                cx: this.ox + dx,
                cy: this.oy + dy
            });
            this.sizer.attr({
                cx: this.sizer.ox + dx,
                cy: this.sizer.oy + dy
            });
            //This is the key function to change 
            updateModel(this.attrs.cx, this.attrs.cy, this.node.className.baseVal, this.attrs.r);
        }, up = function () {
            // restoring state
            this.attr({
                opacity: .5
            });
            this.sizer.attr({
                opacity: .5
            });
        }, rstart = function () {
            // storing original coordinates
            this.ox = this.attr("cx");
            this.oy = this.attr("cy");
            this.big.or = this.big.attr("r");
        }, rmove = function (dx, dy) {
            // move will be called with dx and dy
            this.attr({
                cx: this.ox + dy,
                cy: this.oy + dy
            });
            this.big.attr({
                r: this.big.or + (dy < 0 ? -1 : 1) * Math.sqrt(2 * dy * dy)
            });
            updateModel(this.attrs.cx, this.attrs.cy, this.node.className.baseVal, this.attrs.r);
        };
    circle.drag(move, start, up);
    circle.sizer = s;
    s.drag(rmove, rstart);
    s.big = circle;
    //Here we create
    var myCodeList = $(".code-list");
    var htmlString = "<li class='" + circleCounter + "'> <span class='circle-color'> var color = <div class='circle-color-input' contentEditable autocorrect='off'> type a color</div> ; </span> <br> <span class='circle-radius'> This is a test </span> <br> <span class='circle'> This is a test </span> </li>";
    myCodeList.append(htmlString);
    updateList();
    circleCounter++;
    sizerCounter++;     
}

最后这两个函数允许更新 html 和圆的位置:

function updateModel(x, y, _class, r) {
    var len = circles.length;
    for (var i = 0; i < len; i++) {
        if (circles[i].node.className.baseVal == _class) {
            circles[i].attrs.cx = x;
            circles[i].attrs.cy = y;
            circles[i].attrs.r = r;
        }
    }
    updateList();

}

function updateList() {
    //To change that one I have put a class or an id
    var listItems = $('.code-list').find('li.' + circleCounter);
    // console.log(listItems);
    var len = circles.length;
    for (var i = 0; i < circles.length; i++) {
        //We create one reference. This makes looking for one element more effective. Unless we need to search for a particular element
        var currentItem = circles[i];
        var updateStringRadius = "var radius = " + parseInt(currentItem.attrs.r) + ";";
        var updateStringCircle = "circle (" + currentItem.attrs.cx + " ," + currentItem.attrs.cy + ", radius)";
        //This is the div Item for the particular div of each element
        var divItem = $(listItems[i]);
        var radiusItem = divItem.find("span.circle-radius");
        var circleItem = divItem.find("span.circle");
        // console.log(currentItem.attrs.cx);
        radiusItem.text(updateStringRadius);
        console.log($('.circle-radius').html());
        circleItem.text(updateStringCircle);
        // divItem.text(updateString);
        // console.log(divItem);
    }
}

例如,如果您查看 JSfiddle 并创建三个圆圈。创建圆圈后只会更新第一个圆圈的信息,但现在移动或调整大小时不会改变。

最佳答案

我想通了。所以问题出在这个函数中:

function updateList() {
//To change that one I have put a class or an id
var listItems = $('.code-list').find('li.' + circleCounter);
// console.log(listItems);
var len = circles.length;
for (var i = 0; i < circles.length; i++) {
    //We create one reference. This makes looking for one element more effective. Unless we need to search for a particular element
    var currentItem = circles[i];
    var updateStringRadius = "var radius = " + parseInt(currentItem.attrs.r) + ";";
    var updateStringCircle = "circle (" + currentItem.attrs.cx + " ," + currentItem.attrs.cy + ", radius)";
    //This is the div Item for the particular div of each element
    var divItem = $(listItems[i]);
    var radiusItem = divItem.find("span.circle-radius");
    var circleItem = divItem.find("span.circle");
    // console.log(currentItem.attrs.cx);
    radiusItem.text(updateStringRadius);
    console.log($('.circle-radius').html());
    circleItem.text(updateStringCircle);
    // divItem.text(updateString);
    // console.log(divItem);
}

为此,我更改了启动处理程序和查找其子项的方式:

function updateList(){     
 var len = circles.length;
 for (var i = 0; i < circles.length; i++) {
  var currentItem = circles[i];
  var updateStringRadius = "var radius = " + parseInt(currentItem.attrs.r) + ";";
  var updateStringCircle = "circle (" + currentItem.attrs.cx + " ," + currentItem.attrs.cy + ", radius)";
  var divItem = $('.code-list').find('li.circle-' + (i+1))
  var radiusItem = divItem.find("span.circle-radius");
  var circleItem = divItem.find("span.circle");
  radiusItem.text(updateStringRadius);
  circleItem.text(updateStringCircle);
}

我没有正确地遍历元素。我还被建议为了最佳实践将我的类(class)从 class="1"更改为 class="circle-1"。

这是 JSfiddle

关于javascript - 通过 Raphael.JS 元素更新 HTML 信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23280943/

相关文章:

javascript - HTML5 Canvas 触摸操纵杆性能问题

jquery - $().mouseMove <-- jQuery 1.4 中的空选择器

javascript - 在背景上释放鼠标时不关闭的模态实现(但仅在单击背景时)

html - 是一个css变换矩阵,相当于一个transform scale, skew, translate

JavaScript,减少。需要将数组转换为对象的函数

javascript - 如何使用angularjs动态添加行?

JQuery Ajax 基本身份验证 header 无法正常工作

javascript - 如何循环遍历 d3 中的内部值数组并添加相应的子元素?

javascript - MouseOut 函数仅工作 1 次

javascript - 在mysql数据库 Node js中动态插入多行?