【问题标题】:I can't edit text on layer after add new layer using kineticjs使用 kineticjs 添加新图层后,我无法在图层上编辑文本
【发布时间】:2014-11-11 22:24:44
【问题描述】:

我已经制作了这个http://jsfiddle.net/62Wjc/5/,在图层上创建和更改文本,但它是静态的。现在我为动态添加字段+添加图层+更改图层制作脚本。

在我的脚本上有三个函数,分别是:

  1. 函数 CreateTxt 用于使用 KineticJS 创建元素和创建层。
  2. 函数fRField 用于删除元素
  3. 函数ChangeTxt 用于更改图层上的文本。

这是我的脚本:

$(document).ready(function() {

    var nwValue = [];
    var nwLayer = {};
    var nwTxt = {};
    var tulisan = 'Your text here';
    var con = $('#idEditor');
    var cW = con.width();
    var cH = con.height();
    var stage = new Kinetic.Stage({
        container: 'idEditor',
        width: cW,
        height: cH
    });

    $('a[data-selector="get_new_txt"], a[data-selector="get_new_img"]').on('click', function(event){
        var time = new Date().getTime();
        var regexp = new RegExp($(this).data('id'), 'g');
        $('#nF').append($(this).data('fields').replace(regexp, time));
        CreateTxt(time);
        event.preventDefault();
    });

    $('#nF').on('click', 'a[data-selector="removeField"]', function(e) {
        var a = $(this);
        fRField(a);
        e.preventDefault();
    });

    $('#nF').on('keyup', 'input[data-selector="inputName"]', function() {
        var a = $(this);
        ChangeTxt(a);
    });

    function CreateTxt(idV) {
        var iclone = 0;
        nwValue.push(idV);
        $.each(nwValue, function( index, value ){
          nwLayer["layer"+ value] = new Kinetic.Layer();
        });

        stage.add(nwLayer["layer"+ idV]);
        $.each(nwValue, function( index, value ){
          nwTxt["text"+ value] = new Kinetic.Text({
                x: 100,
                y: 100,
                text: "Your text here",
                fontSize:18,
                fill: 'red',
                draggable: true,
                id: 'txt'+ value
            });
        });
        nwLayer["layer"+ idV].add(nwTxt["text"+ idV]);
        nwLayer["layer"+ idV].draw();      
    }

    function fRField(a){
      if(confirm('Are you sure to delete this field ?')) {
        a.prev("input[type=hidden]").value = "1";
        a.closest(".form-inline").remove();
      }
      return false;
    }

    function ChangeTxt(a){
        var dataid = a.attr('data-id');
        var newValue = a.val();
        nwTxt["text"+ dataid].setText(newValue);
        nwLayer["layer"+ dataid].draw();
    }

});

jsfiddle:http://jsfiddle.net/8oLsoo25/5/

添加新文本后,我无法先更改图层上的文本。

【问题讨论】:

    标签: javascript jquery kineticjs


    【解决方案1】:

    您的$.each 呼叫nwValue 正在毁掉您的一切。如果您将nwValue = []; 放在nwValue.push(idV); 上方的CreateTxt 中,则一切正常。换句话说,您正在替换对原始对象的引用。另外,您知道 Kinetic 中的新层意味着 DOM 中的新画布元素吗?

    【讨论】:

    • 谢谢@truefusion 它的作品。当然,我知道。老实说,我昨天刚学了动力学。只是想知道,我上面的脚本是否符合 javascript 和 kinecticjs 的概念?我创建了新图层(画布),因为我不知道如何将 text2 放在 text1 的前面。
    • 哦,我知道,我只需要创建一个包含多个文本的图层,然后使用 .moveToTop() 移动到顶部文本并使用 .moveToBottom() 移动到另一文本底部。谢谢
    • @itx 以下是您可以对代码进行的一些改进:对于初学者,不需要保留对层的外部引用,因为 Kinetic 保留对它们的内部引用,并且可以使用 Kinetic.Stage.getLayers() 检索. Kinetic 还允许我们使用Kinetic.Container.find('#idOfChild')(Layer 继承自 Container,因此它具有 find())通过 ID 查找子级。可以使用Kinetic.Node.setId() 在任何节点(例如图层、文本)上设置 ID。
    猜你喜欢
    • 1970-01-01
    • 2012-12-21
    • 2017-10-05
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2013-02-25
    相关资源
    最近更新 更多