Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 单击按钮时如何触发事件侦听层上的形状?_Javascript_Textarea_Layer_Konvajs - Fatal编程技术网

Javascript 单击按钮时如何触发事件侦听层上的形状?

Javascript 单击按钮时如何触发事件侦听层上的形状?,javascript,textarea,layer,konvajs,Javascript,Textarea,Layer,Konvajs,在KonvaJS中,是否可以在单击一个按钮时使层处于非活动状态(但不可见),然后在单击另一个按钮时使层处于活动状态?我试过“text_overlay.listing(false);”但不起作用。我可以使用“textNode0.listening(false);”停用单个textNodes,这确实会阻止用户编辑该文本,但这些textNodes位于多边形上方,其中一些多边形非常小(例如,欧洲地图上的卢森堡),textarea阻止用户单击下方的多边形(例如,更改其填充颜色). 此外,将有40多个文本节

在KonvaJS中,是否可以在单击一个按钮时使层处于非活动状态(但不可见),然后在单击另一个按钮时使层处于活动状态?我试过“text_overlay.listing(false);”但不起作用。我可以使用“textNode0.listening(false);”停用单个textNodes,这确实会阻止用户编辑该文本,但这些textNodes位于多边形上方,其中一些多边形非常小(例如,欧洲地图上的卢森堡),textarea阻止用户单击下方的多边形(例如,更改其填充颜色). 此外,将有40多个文本节点需要处理,因此禁用1层是最好的

以下是HTML文件的按钮部分:

<script src="js/text-input21.js"></script>
<!-- button events -->
<script>
    // button states on load
    var btnLabelClicked = true;
    var btnColorClicked = false;
    var btnDrawLinesClicked = false;
    //color chip buttons
    var btnViolet = document.getElementById("fillViolet");
    var btnOrange = document.getElementById("fillOrange");
    var btnYellow = document.getElementById("fillYellow");
    //color chip buttons' fill when btnLabelClicked = true
    btnViolet.style.background = disableBtnFill;
    btnOrange.style.background = disableBtnFill;
    btnYellow.style.background = disableBtnFill;

    var buttonID = 'btnLabel';

    function replyClick(clickedID) {
        buttonID = (clickedID);
        if (buttonID === 'btnColor') {
            textNode0.listening(false);
            textNode15.listening(false);
            textNode16.listening(false);
            btnViolet.disabled = false;
            btnViolet.style.background = '#842dce';
            btnOrange.disabled = false;
            btnOrange.style.background = '#ffa500';
            btnYellow.disabled = false;
            btnYellow.style.background = '#ffff00';

            btnLabelClicked = false;
            btnColorClicked = true;
            btnDrawLinesClicked = false;

        } else if (btnColorClicked && (buttonID === 'fillViolet' || buttonID === 'fillOrange' || buttonID === 'fillYellow')) {
            //text_overlay.listening(false);
            textNode0.listening(false);
            textNode15.listening(false);
            textNode16.listening(false);
            newFill = document.getElementById(buttonID).style.background;
        } else if (buttonID === 'btnLabel' || buttonID === 'btnDrawLines' || buttonID === 'btnEraseLines' || buttonID === 'btnExport') {
            //disable color buttons
            btnColorClicked = false;
            btnViolet.disabled = true;
            btnViolet.style.background = disableBtnFill;
            btnOrange.disabled = true;
            btnOrange.style.background = disableBtnFill;
            btnYellow.disabled = true;
            btnYellow.style.background = disableBtnFill;
            if (buttonID === 'btnLabel') {
                textNode0.listening(true);
                textNode15.listening(true);
                textNode16.listening(true);
                btnLabelClicked = true;
                btnDrawLinesClicked = false;
            } else { //buttonID is not btnLabel or any of the color buttons
                textNode0.listening(false);
                textNode15.listening(false);
                textNode16.listening(false);
                btnLabelClicked = false;
                btnDrawLinesClicked = true;
            }
        }
    }
</script>

根据实验,layer.listening()设置层上的侦听,但不设置其内容。这不是直观的,但它是有意义的,因为层实际上是HTML5画布。例如,您可能希望在图层背景上切换鼠标移动的跟踪,但图层子图形仍在持续侦听,因此您需要这样做

您可以使用

然后迭代列表并对每个成员使用setListening()。getChildren()函数可以与className过滤器结合起来创建子对象的子集,因此您可以切换所有文本元素、所有多边形或所有圆等。这非常有趣


作为旁注,不要将此视为批评,您的编码风格似乎并非如此。我的意思是,您对textNode0、textNode15和textNode16的单击事件是重复的——我想每次您意识到需要对其中一个进行更改时,您都必须手动对所有内容进行更改。这让你容易被剪切粘贴或遗漏。最好创建一个标准的myTextNode对象,让它包含您想要在textNode中使用的所有功能,然后在创建每个对象时传入唯一的参数。这样一来,对myTextNode“类”进行更改会同时影响所有节点。这个标签是“JS对象”,但是如果你在谷歌上搜索,你会被信息超载。读一读,了解主题的“方法”。如果您知道所有这些,请原谅我,但是您的textNodes有很多国家。

非常感谢!想象我像海绵一样吸收信息——我对这一点太陌生了,我从来没有听过干湿对比(太有趣了,顺便说一句)。我会直接加入你的getChildren建议,然后跑去正确地学习对象。我也有将近40个形状需要处理——同一主题的变体——我试图找到一种使用数组避免重复的方法,但它不起作用(同样,我是个新手)。谢谢你的指导!在对象方面,主要需要知道的是如何使用“new”和函数来创建对象,然后如何在对象内部使用“this”。我建议您也找到如何将对象作为参数传递的方法-这样您就可以创建文本对象,如
var textDef1={x:10,y:20,宽度:100,高度:80,text:'x'..)
这会使一个没有方法的“哑”对象,然后通过
var TextObject1=新的myTextObjectClass(textDef1)将其传递到myTextObject函数中
这使您可以添加方法等。方法是myTextObject中的一个函数。
var text_overlay = new Konva.Layer({
    listening: true
});

stage.add(text_overlay);

var textNode0 = new Konva.Text({
    text: 'X',
    x: 80, // centered between Ireland & Great Britain
    y: 125,
    width: 150,
    height: 15,
    fontFamily: 'Arial, Helvetica, "sans-serif"',
    fontSize: 14,
    align: 'center',
    listening: true
});

var textNode15 = new Konva.Text({
    text: 'X',
    x: 230, // Luxembourg
    y: 225,
    width: 100,
    height: 15,
    fontFamily: 'Arial, Helvetica, "sans-serif"',
    fontSize: 14,
    align: 'center',
    listening: true
});

var textNode16 = new Konva.Text({
    text: 'X',
    x: 175, // France
    y: 290,
    width: 100,
    height: 15,
    fontFamily: 'Arial, Helvetica, "sans-serif"',
    fontSize: 14,
    align: 'center',
    listening: true
});

text_overlay.add(textNode0);
text_overlay.add(textNode15);
text_overlay.add(textNode16);
text_overlay.draw();

console.log(text_overlay.getZIndex());

textNode0.on('click', () => {
    // create textarea over canvas with absolute position

    // first we need to find its position
    var textPosition = textNode0.getAbsolutePosition();
    var stageBox = stage.getContainer().getBoundingClientRect();

    var areaPosition = {
        x: textPosition.x + stageBox.left,
        y: textPosition.y + stageBox.top
    };

    // create textarea and style it
    var textarea = document.createElement('textarea');
    document.body.appendChild(textarea);

    textarea.value = textNode0.text();
    textarea.style.textAlign = 'center';
    textarea.style.resize = 'none';
    textarea.style.position = 'absolute';
    textarea.style.left = areaPosition.x + 'px'; //positioning needs work
    textarea.style.top = areaPosition.y + 'px';
    textarea.style.width = textNode0.width();
    textarea.style.background = 'transparent';
    textarea.style.border = 1; // final border = 0
    textarea.style.outline = 'none';
    textarea.style.fontFamily = 'Arial, Helvetica, "sans-serif"';
    textarea.style.fontSize = 14;

    textarea.focus();

    textarea.addEventListener('keydown', function (e) {
        // hide on enter
        if (e.keyCode === 13) {
            textNode0.text(textarea.value);
            text_overlay.draw();
            document.body.removeChild(textarea);
        }
    });
})

textNode15.on('click', () => {
    // create textarea over canvas with absolute position

    // first we need to find its position
    var textPosition = textNode15.getAbsolutePosition();
    var stageBox = stage.getContainer().getBoundingClientRect();

    var areaPosition = {
        x: textPosition.x + stageBox.left,
        y: textPosition.y + stageBox.top
    };

    // create textarea and style it
    var textarea = document.createElement('textarea');
    document.body.appendChild(textarea);

    textarea.value = textNode15.text();
    textarea.style.textAlign = 'center';
    textarea.style.resize = 'none';
    textarea.style.position = 'absolute';
    textarea.style.left = areaPosition.x - 20 + 'px'; //positioning needs work
    textarea.style.top = areaPosition.y - 20 + 'px';
    textarea.style.width = textNode15.width();
    textarea.style.background = 'transparent';
    textarea.style.border = 1; // final border = 0
    textarea.style.outline = 'none';
    textarea.style.fontFamily = 'Arial, Helvetica, "sans-serif"';
    textarea.style.fontSize = 14;

    textarea.focus();

    textarea.addEventListener('keydown', function (e) {
        // hide on enter
        if (e.keyCode === 13) {
            textNode15.text(textarea.value);
            text_overlay.draw();
            document.body.removeChild(textarea);
        }
    });
})

textNode16.on('click', () => {
    // create textarea over canvas with absolute position

    // first we need to find its position
    var textPosition = textNode16.getAbsolutePosition();
    var stageBox = stage.getContainer().getBoundingClientRect();

    var areaPosition = {
        x: textPosition.x + stageBox.left,
        y: textPosition.y + stageBox.top
    };

    // create textarea and style it
    var textarea = document.createElement('textarea');
    document.body.appendChild(textarea);

    textarea.value = textNode16.text();
    textarea.style.textAlign = 'center';
    textarea.style.resize = 'none';
    textarea.style.position = 'absolute';
    textarea.style.left = areaPosition.x - 45 + 'px'; //positioning needs work
    textarea.style.top = areaPosition.y - 20 + 'px';
    textarea.style.width = textNode16.width();
    textarea.style.background = 'transparent';
    textarea.style.border = 1; // final border = 0
    textarea.style.outline = 'none';
    textarea.style.fontFamily = 'Arial, Helvetica, "sans-serif"';
    textarea.style.fontSize = 14;

    textarea.focus();

    textarea.addEventListener('keydown', function (e) {
        // hide on enter
        if (e.keyCode === 13) {
            textNode16.text(textarea.value);
            text_overlay.draw();
            document.body.removeChild(textarea);
        }
    });
})

// add the layer to the stage
stage.add(text_overlay);
// get all children
var children = layer.getChildren();