【问题标题】:File upload dialog box not displaying onclick first time文件上传对话框第一次不显示onclick
【发布时间】:2019-04-03 18:17:49
【问题描述】:

一旦用户点击图片的非透明部分,我们将显示文件上传对话框......我们有2张图片相互重叠,如下所示:--

问题

在上面2张图片中,无论我点击非跨部分,文件上传对话框都会显示....但是如果我们点击重叠部分,它不会显示,但是如果我们第二次点击重叠部分,它会显示文件上传对话框,但是当我们第一次点击时应该会显示......

https://codepen.io/kidsdial/pen/EMQVqK

var target;

let jsonData = {
  "path" : " newyear collage\/",
  "info" : {
    "author" : "",
    "keywords" : "",
    "file" : "newyear collage",
    "date" : "sRGB",
    "title" : "",
    "description" : "Normal",
    "generator" : "Export Kit v1.2.8"
  },
  "name" : "newyear collage",
  "layers" : [
    {
      "x" : 0,
      "height" : 612,
      "layers" : [
        {
          "x" : 0,
          "color" : "0xFFFFFF",
          "height" : 612,
          "y" : 0,
          "width" : 612,
          "shapeType" : "rectangle",
          "type" : "shape",
          "name" : "bg_rectangle"
        },
        {
          "x" : 160,
          "height" : 296,
          "layers" : [
            {
              "x" : 0,
              "height" : 296,
              "src" : "ax0HVTs.png",
              "y" : 0,
              "width" : 429,
              "type" : "image",
              "name" : "mask_image_1"
            },
            {
              "radius" : "26 \/ 27",
              "color" : "0xACACAC",
              "x" : 188,
              "y" : 122,
              "height" : 53,
              "width" : 53,
              "shapeType" : "ellipse",
              "type" : "shape",
              "name" : "useradd_ellipse1"
            }
          ],
          "y" : 291,
          "width" : 429,
          "type" : "group",
          "name" : "user_image_1"
        },
        {
          "x" : 25,
          "height" : 324,
          "layers" : [
            {
              "x" : 0,
              "height" : 324,
              "src" : "hEM2kEP.png",
              "y" : 0,
              "width" : 471,
              "type" : "image",
              "name" : "mask_image_2"
            },
            {
              "radius" : "26 \/ 27",
              "color" : "0xACACAC",
              "x" : 209,
              "y" : 136,
              "height" : 53,
              "width" : 53,
              "shapeType" : "ellipse",
              "type" : "shape",
              "name" : "useradd_ellipse_2"
            }
          ],
          "y" : 22,
          "width" : 471,
          "type" : "group",
          "name" : "user_image_2"
        }
      ],
      "y" : 0,
      "width" : 612,
      "type" : "group",
      "name" : "newyearcollage08"
    }
  ]
};


$(document).ready(function() {

    // upload image onclick

    $('.container').click(function(e) {

        var res = e.target;
        target = res.id;
        console.log(target);
        if (e.target.getContext) {
		// click only inside Non Transparent part
            var pixel = e.target.getContext('2d').getImageData(e.offsetX, e.offsetY, 1, 1).data;
            if (pixel[3] === 255) {
                setTimeout(() => {
                    $('#fileup').click();
                }, 20);
            }
        }

    });

    function getAllSrc(layers) {
        let arr = [];
        layers.forEach(layer => {
            if (layer.src) {
                arr.push({
                    src: layer.src,
                    x: layer.x,
                    y: layer.y
                });
            } else if (layer.layers) {
                let newArr = getAllSrc(layer.layers);
                if (newArr.length > 0) {
                    newArr.forEach(({
                        src,
                        x,
                        y
                    }) => {
                        arr.push({
                            src,
                            x: (layer.x + x),
                            y: (layer.y + y)
                        });
                    });
                }
            }
        });
        return arr;
    }

     function json(data)

        {
            var width = 0;
            var height = 0;

            let arr = getAllSrc(data.layers);

            let layer1 = data.layers;
            width = layer1[0].width;
            height = layer1[0].height;
            let counter = 0;
            let table = [];

            for (let {
                    src,
                    x,
                    y
                } of arr) {

                $(".container").css('width', width + "px").css('height', height + "px").addClass('temp');

                var mask = $(".container").mask({
                    maskImageUrl: 'https://i.imgur.com/' + src,
                    onMaskImageCreate: function(img) {

                        img.css({
                            "position": "absolute",
                            "left": x + "px",
                            "top": y + "px"
                        });

                    },
                    id: counter
                });
                table.push(mask);
                fileup.onchange = function() {

                    let mask2 = table[target];
                    mask2.loadImage(URL.createObjectURL(fileup.files[0]));
                    document.getElementById('fileup').value = "";
                };
                counter++;
            }

        }

json(jsonData);
}); // end of document ready

// jq plugin 

(function($) {
    var JQmasks = [];
    $.fn.mask = function(options) {
        // This is the easiest way to have default options.
        var settings = $.extend({
            // These are the defaults.
            maskImageUrl: undefined,
            imageUrl: undefined,
            scale: 1,
            id: new Date().getUTCMilliseconds().toString(),
            x: 0, // image start position
            y: 0, // image start position
            onMaskImageCreate: function(div) {},
        }, options);


        var container = $(this);

        let prevX = 0,
            prevY = 0,
            draggable = false,
            img,
            canvas,
            context,
            image,
            timeout,
            initImage = false,
            startX = settings.x,
            startY = settings.y,
            div;

        container.mousePosition = function(event) {
            return {
                x: event.pageX || event.offsetX,
                y: event.pageY || event.offsetY
            };
        }

        container.selected = function(ev) {
            var pos = container.mousePosition(ev);
            var item = $(".masked-img canvas").filter(function() {
                var offset = $(this).offset()
                var x = pos.x - offset.left;
                var y = pos.y - offset.top;
                var d = this.getContext('2d').getImageData(x, y, 1, 1).data;
                return d[0] > 0
            });

            JQmasks.forEach(function(el) {
                var id = item.length > 0 ? $(item).attr("id") : "";
                if (el.id == id)
                    el.item.enable();
                else el.item.disable();
            });
        };

        container.enable = function() {
            draggable = true;
            $(canvas).attr("active", "true");
            div.css({
                "z-index": 2
            });
        }

        container.disable = function() {
            draggable = false;
            $(canvas).attr("active", "false");
            div.css({
                "z-index": 1
            });
        }

        container.onDragStart = function(evt) {
            if (evt.target.getContext) {
                var pixel = evt.target.getContext('2d').getImageData(evt.offsetX, evt.offsetY, 1, 1).data;

                $(canvas).attr("active", "true");
                container.selected(evt);
                prevX = evt.clientX;
                prevY = evt.clientY;
                var img = new Image();
                evt.originalEvent.dataTransfer.setDragImage(img, 10, 10);
                evt.originalEvent.dataTransfer.setData('text/plain', 'anything');

            }
        };

        container.getImagePosition = function() {
            return {
                x: settings.x,
                y: settings.y,
                scale: settings.scale
            };
        };

        container.onDragOver = function(evt) {

            if (evt.target.getContext) {
                var pixel = evt.target.getContext('2d').getImageData(evt.offsetX, evt.offsetY, 1, 1).data;
                if (pixel[3] === 255) {
                    if (draggable && $(canvas).attr("active") === "true") {
                        var x = settings.x + evt.clientX - prevX;
                        var y = settings.y + evt.clientY - prevY;
                        if (x == settings.x && y == settings.y)
                            return; // position has not changed
                        settings.x += evt.clientX - prevX;
                        settings.y += evt.clientY - prevY;
                        prevX = evt.clientX;
                        prevY = evt.clientY;
                        container.updateStyle();
                    }
                } else {
                    evt.stopPropagation();
                    return false;
                }
            }
        };

        container.updateStyle = function() {
            clearTimeout(timeout);
            timeout = setTimeout(function() {
                //context.clearRect(0, 0, canvas.width, canvas.height);
                context.beginPath();
                context.globalCompositeOperation = "source-over";
                image = new Image();
                image.setAttribute('crossOrigin', 'anonymous');
                image.src = settings.maskImageUrl;
                image.onload = function() {
                    canvas.width = image.width;
                    canvas.height = image.height;
                    context.drawImage(image, 0, 0, image.width, image.height);
                    div.css({
                        "width": image.width,
                        "height": image.height
                    });
                };

                img = new Image();
                img.src = settings.imageUrl;
                img.setAttribute('crossOrigin', 'anonymous');
                img.onload = function() {
                    settings.x = settings.x == 0 && initImage ? (canvas.width - (img.width * settings.scale)) / 2 : settings.x;
                    settings.y = settings.y == 0 && initImage ? (canvas.height - (img.height * settings.scale)) / 2 : settings.y;
                    context.globalCompositeOperation = 'source-atop';
                    context.drawImage(img, settings.x, settings.y, img.width * settings.scale, img.height * settings.scale);
                    initImage = false;
                };
            }, 20);
        };

        // change the draggable image
        container.loadImage = function(imageUrl) {
            console.log("load");
            if (img)
                img.remove();
            // reset the code.
            settings.y = startY;
            settings.x = startX;
            prevX = prevY = 0;
            settings.imageUrl = imageUrl;
            initImage = true;
            container.updateStyle();
        };

        // change the masked Image
        container.loadMaskImage = function(imageUrl, from) {
            if (div)
                div.remove();
            canvas = document.createElement("canvas");
            context = canvas.getContext('2d');
            canvas.setAttribute("draggable", "true");
            canvas.setAttribute("id", settings.id);
            settings.maskImageUrl = imageUrl;
            div = $("<div/>", {
                "class": "masked-img"
            }).append(canvas);

            // div.find("canvas").on('touchstart mousedown', function(event)
            div.find("canvas").on('dragstart', function(event) {

                if (event.handled === false) return;
                event.handled = true;
                container.onDragStart(event);
            });

            div.find("canvas").on('touchend mouseup', function(event) {
                if (event.handled === false) return;
                event.handled = true;
                container.selected(event);
            });

            div.find("canvas").bind("dragover", container.onDragOver);
            container.append(div);
            if (settings.onMaskImageCreate)
                settings.onMaskImageCreate(div);
            container.loadImage(settings.imageUrl);
        };
        container.loadMaskImage(settings.maskImageUrl);
        JQmasks.push({
            item: container,
            id: settings.id
        })
        return container;
    };
}(jQuery));
.temp {}

.container {
	background: gold;
  position: relative;
 
}

.masked-img {
	overflow: hidden;	
	position: relative;
}
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<input id="fileup" name="fileup" type="file" style="display:none" >

<div class="container">

</div>

注意:我需要动态解决方案,以便它适用于每个模板,例如:https://codepen.io/kidsdial/pen/YgjEKj 和重叠部分:https://prnt.sc/mztuoa

编辑

下面的代码是针对该问题的,如果我删除下面的代码,那么另一个问题是用户将点击透明部分的图像和文件上传对话框将打开,如video

var pixel = e.target.getContext('2d').getImageData(e.offsetX, e.offsetY, 1, 1).data;
            if (pixel[3] === 255) {
                setTimeout(() => {
                    $('#fileup').click();
                }, 20);
            }

【问题讨论】:

  • 它在我第一次点击我的末端时显示...
  • @ĐàoMinhHạt 能否请您刷新页面并尝试一次......
  • 都适用于 codepen 和 sn-p 版本..
  • 您可以为两张图片使用 2 个 svg,而不是使用一个单一背景,然后可以使用一个容器,其中一个 svg 和另一个重叠,该容器可用于文件上传对话框。
  • 我在 osx btw 上使用 Chrome 72.0.3626.121

标签: javascript jquery


【解决方案1】:

另一种保持布局不变的解决方案是检查不是e.target(即被点击的元素),而是所有适用的(所有边界框都适用于点击位置)画布:

$('.container').click(function(e) {
  // filtering out non-canvas clicks
  if (e.target.tagName !== 'CANVAS') return;

  // getting absolute points relative to container
  const absX = e.offsetX + e.target.parentNode.offsetLeft + e.currentTarget.offsetLeft;
  const absY = e.offsetY + e.target.parentNode.offsetTop + e.currentTarget.offsetTop;

  const $canvasList = $(this).find('canvas');
  // moving all canvas parents on the same z-index
  $canvasList.parent().css({zIndex: 0});

    $canvasList.filter(function() { // filtering only applicable canvases
        const bbox = this.getBoundingClientRect();
        const canvasTop = bbox.top + window.scrollY;
        const canvasLeft = bbox.left + window.scrollX;
        return (
            absX >= canvasLeft && absX <= canvasLeft + bbox.width &&
            absY >= canvasTop && absY <= canvasTop + bbox.height)
    }).each(function () { // checking white in a click position
    const x = absX - this.parentNode.offsetLeft - e.currentTarget.offsetLeft;
    const y = absY - this.parentNode.offsetTop - e.currentTarget.offsetTop;
    const pixel = this.getContext('2d').getImageData(x, y, 1, 1).data;
    if (pixel[3] === 255) {
      $(this).parent().css({zIndex: 2})
      target = this.id;
      console.log(target);
      setTimeout(() => {
        $('#fileup').click();
      }, 20);
    }
  })
});

【讨论】:

  • 嗨,对不起,我之前没有正确测试,您的代码有小问题,请检查codepen.io/kidsdial/pen/rRZXWd,如果我们在计算机上使用相同的代码,我们无法上传底部图像的图像&在浏览器中运行,比它工作正常.....因为在codepen中空间较小,或者如果我们在浏览器中使用inspect元素,它就不能正常工作,但是如果我们删除inspect元素,它就可以正常工作。 ....
  • @vickeycolors 在那里发布了正确的版本。抱歉,由于时间不够,无法查看您的其他问题。
【解决方案2】:

当您单击第一个数字然后单击第二个(重叠部分)时会发生这种情况,然后像素不是white而是transparent,这就是您看不到文件管理器的原因。

我在这里建议的是使用单个图像/画布,除了检查光标下的颜色像素外,还要检查点击的位置(减去图像的位置)。在这种情况下,您将能够创建任何您想要的逻辑。

【讨论】:

  • 抱歉,我有成千上万个这样的模板,其中包含 2、3、4、8、9 个像 codepen.io/kidsdial/pen/YgjEKj 这样的图像,每次都很难将所有这些模板图像转换为单个图像...... .
【解决方案3】:

现在发生了什么:

当您第一次单击重叠部分时,事件处理程序会使用带有id:1 的画布触发(因为这是在 DOM 中的后期),并且单击在容器之外。

第一次点击后,container.enable 函数被调用,它为画布id:0 分配一个 z-index: 2。

下次单击同一部分时,将调用 canvas id:0 click 处理程序,因为它具有更高的 z-index。

所以解决方法是最初分配 z-index。


刚刚看到在您的情况下可能有 100 张图像 - 在这种情况下管理 z-index 可能会变得很棘手。核心问题是 Canvas 是一个矩形元素 - 因此它也会捕获容器外的点击。

您可以改为将事件处理程序附加到文档,并使用 document.elementsFromPoint() 获取特定事件位置的元素并单独检查容器中是否存在元素。

【讨论】:

    【解决方案4】:

    加载时您没有为图像指定z-index。所以,当点击重叠的部分时,第二张图片会得到z-index: 2,这时就可以点击打开文件上传了。

    第二次单击“重叠”部分时,实际上是单击第二张图片,而不是第一张图片的空白区域。

    相应地调整您的z-index 并尝试一下。干杯!

    【讨论】:

    • 如果我修复了 z-index,那么它可能适用于这个模板,我有很多像 codepen.io/kidsdial/pen/YgjEKj 这样的模板,修复 z-index 会动态提供解决方案吗?
    【解决方案5】:

    这里我只是在做 preand 而不是 append 并且我删除了 z-index。我认为这绝对可以正常工作。

     div.find("canvas").bind("dragover", container.onDragOver);
     container.prepend(div);
    

    var target;
    
    let jsonData = {
      "path" : " newyear collage\/",
      "info" : {
        "author" : "",
        "keywords" : "",
        "file" : "newyear collage",
        "date" : "sRGB",
        "title" : "",
        "description" : "Normal",
        "generator" : "Export Kit v1.2.8"
      },
      "name" : "newyear collage",
      "layers" : [
        {
          "x" : 0,
          "height" : 612,
          "layers" : [
            {
              "x" : 0,
              "color" : "0xFFFFFF",
              "height" : 612,
              "y" : 0,
              "width" : 612,
              "shapeType" : "rectangle",
              "type" : "shape",
              "name" : "bg_rectangle"
            },
            {
              "x" : 160,
              "height" : 296,
              "layers" : [
                {
                  "x" : 0,
                  "height" : 296,
                  "src" : "ax0HVTs.png",
                  "y" : 0,
                  "width" : 429,
                  "type" : "image",
                  "name" : "mask_image_1"
                },
                {
                  "radius" : "26 \/ 27",
                  "color" : "0xACACAC",
                  "x" : 188,
                  "y" : 122,
                  "height" : 53,
                  "width" : 53,
                  "shapeType" : "ellipse",
                  "type" : "shape",
                  "name" : "useradd_ellipse1"
                }
              ],
              "y" : 291,
              "width" : 429,
              "type" : "group",
              "name" : "user_image_1"
            },
            {
              "x" : 25,
              "height" : 324,
              "layers" : [
                {
                  "x" : 0,
                  "height" : 324,
                  "src" : "hEM2kEP.png",
                  "y" : 0,
                  "width" : 471,
                  "type" : "image",
                  "name" : "mask_image_2"
                },
                {
                  "radius" : "26 \/ 27",
                  "color" : "0xACACAC",
                  "x" : 209,
                  "y" : 136,
                  "height" : 53,
                  "width" : 53,
                  "shapeType" : "ellipse",
                  "type" : "shape",
                  "name" : "useradd_ellipse_2"
                }
              ],
              "y" : 22,
              "width" : 471,
              "type" : "group",
              "name" : "user_image_2"
            }
          ],
          "y" : 0,
          "width" : 612,
          "type" : "group",
          "name" : "newyearcollage08"
        }
      ]
    };
    
    
    $(document).ready(function() {
    
        // upload image onclick
    
        $('.container').click(function(e) {
    
            var res = e.target;
            target = res.id;
            console.log(target);
            if (e.target.getContext) {
    		// click only inside Non Transparent part
                var pixel = e.target.getContext('2d').getImageData(e.offsetX, e.offsetY, 1, 1).data;
                if (pixel[3] === 255) {
                    setTimeout(() => {
                        $('#fileup').click();
                    }, 20);
                }
            }
    
        });
    
        function getAllSrc(layers) {
            let arr = [];
            layers.forEach(layer => {
                if (layer.src) {
                    arr.push({
                        src: layer.src,
                        x: layer.x,
                        y: layer.y
                    });
                } else if (layer.layers) {
                    let newArr = getAllSrc(layer.layers);
                    if (newArr.length > 0) {
                        newArr.forEach(({
                            src,
                            x,
                            y
                        }) => {
                            arr.push({
                                src,
                                x: (layer.x + x),
                                y: (layer.y + y)
                            });
                        });
                    }
                }
            });
            return arr;
        }
    
         function json(data)
    
            {
                var width = 0;
                var height = 0;
    
                let arr = getAllSrc(data.layers);
    
                let layer1 = data.layers;
                width = layer1[0].width;
                height = layer1[0].height;
                let counter = 0;
                let table = [];
    
                for (let {
                        src,
                        x,
                        y
                    } of arr) {
    
                    $(".container").css('width', width + "px").css('height', height + "px").addClass('temp');
    
                    var mask = $(".container").mask({
                        maskImageUrl: 'https://i.imgur.com/' + src,
                        onMaskImageCreate: function(img) {
    
                            img.css({
                                "position": "absolute",
                                "left": x + "px",
                                "top": y + "px"
                            });
    
                        },
                        id: counter
                    });
                    table.push(mask);
                    fileup.onchange = function() {
    
                        let mask2 = table[target];
                        mask2.loadImage(URL.createObjectURL(fileup.files[0]));
                        document.getElementById('fileup').value = "";
                    };
                    counter++;
                }
    
            }
    
    json(jsonData);
    }); // end of document ready
    
    // jq plugin 
    
    (function($) {
        var JQmasks = [];
        $.fn.mask = function(options) {
            // This is the easiest way to have default options.
            var settings = $.extend({
                // These are the defaults.
                maskImageUrl: undefined,
                imageUrl: undefined,
                scale: 1,
                id: new Date().getUTCMilliseconds().toString(),
                x: 0, // image start position
                y: 0, // image start position
                onMaskImageCreate: function(div) {},
            }, options);
    
    
            var container = $(this);
    
            let prevX = 0,
                prevY = 0,
                draggable = false,
                img,
                canvas,
                context,
                image,
                timeout,
                initImage = false,
                startX = settings.x,
                startY = settings.y,
                div;
    
            container.mousePosition = function(event) {
                return {
                    x: event.pageX || event.offsetX,
                    y: event.pageY || event.offsetY
                };
            }
    
            container.selected = function(ev) {
                var pos = container.mousePosition(ev);
                var item = $(".masked-img canvas").filter(function() {
                    var offset = $(this).offset()
                    var x = pos.x - offset.left;
                    var y = pos.y - offset.top;
                    var d = this.getContext('2d').getImageData(x, y, 1, 1).data;
                    return d[0] > 0
                });
    
                JQmasks.forEach(function(el) {
                    var id = item.length > 0 ? $(item).attr("id") : "";
                    if (el.id == id)
                        el.item.enable();
                    else el.item.disable();
                });
            };
    
            container.enable = function() {
                draggable = true;
                $(canvas).attr("active", "true");
                div.css({
                   
                });
            }
    
            container.disable = function() {
                draggable = false;
                $(canvas).attr("active", "false");
                div.css({
                    
                });
            }
    
            container.onDragStart = function(evt) {
                if (evt.target.getContext) {
                    var pixel = evt.target.getContext('2d').getImageData(evt.offsetX, evt.offsetY, 1, 1).data;
    
                    $(canvas).attr("active", "true");
                    container.selected(evt);
                    prevX = evt.clientX;
                    prevY = evt.clientY;
                    var img = new Image();
                    evt.originalEvent.dataTransfer.setDragImage(img, 10, 10);
                    evt.originalEvent.dataTransfer.setData('text/plain', 'anything');
    
                }
            };
    
            container.getImagePosition = function() {
                return {
                    x: settings.x,
                    y: settings.y,
                    scale: settings.scale
                };
            };
    
            container.onDragOver = function(evt) {
    
                if (evt.target.getContext) {
                    var pixel = evt.target.getContext('2d').getImageData(evt.offsetX, evt.offsetY, 1, 1).data;
                    if (pixel[3] === 255) {
                        if (draggable && $(canvas).attr("active") === "true") {
                            var x = settings.x + evt.clientX - prevX;
                            var y = settings.y + evt.clientY - prevY;
                            if (x == settings.x && y == settings.y)
                                return; // position has not changed
                            settings.x += evt.clientX - prevX;
                            settings.y += evt.clientY - prevY;
                            prevX = evt.clientX;
                            prevY = evt.clientY;
                            container.updateStyle();
                        }
                    } else {
                        evt.stopPropagation();
                        return false;
                    }
                }
            };
    
            container.updateStyle = function() {
                clearTimeout(timeout);
                timeout = setTimeout(function() {
                    //context.clearRect(0, 0, canvas.width, canvas.height);
                    context.beginPath();
                    context.globalCompositeOperation = "source-over";
                    image = new Image();
                    image.setAttribute('crossOrigin', 'anonymous');
                    image.src = settings.maskImageUrl;
                    image.onload = function() {
                        canvas.width = image.width;
                        canvas.height = image.height;
                        context.drawImage(image, 0, 0, image.width, image.height);
                        div.css({
                            "width": image.width,
                            "height": image.height
                        });
                    };
    
                    img = new Image();
                    img.src = settings.imageUrl;
                    img.setAttribute('crossOrigin', 'anonymous');
                    img.onload = function() {
                        settings.x = settings.x == 0 && initImage ? (canvas.width - (img.width * settings.scale)) / 2 : settings.x;
                        settings.y = settings.y == 0 && initImage ? (canvas.height - (img.height * settings.scale)) / 2 : settings.y;
                        context.globalCompositeOperation = 'source-atop';
                        context.drawImage(img, settings.x, settings.y, img.width * settings.scale, img.height * settings.scale);
                        initImage = false;
                    };
                }, 20);
            };
    
            // change the draggable image
            container.loadImage = function(imageUrl) {
                console.log("load");
                if (img)
                    img.remove();
                // reset the code.
                settings.y = startY;
                settings.x = startX;
                prevX = prevY = 0;
                settings.imageUrl = imageUrl;
                initImage = true;
                container.updateStyle();
            };
    
            // change the masked Image
            container.loadMaskImage = function(imageUrl, from) {
                if (div)
                    div.remove();
                canvas = document.createElement("canvas");
                context = canvas.getContext('2d');
                canvas.setAttribute("draggable", "true");
                canvas.setAttribute("id", settings.id);
                settings.maskImageUrl = imageUrl;
                div = $("<div/>", {
                    "class": "masked-img"
                }).append(canvas);
    
                // div.find("canvas").on('touchstart mousedown', function(event)
                div.find("canvas").on('dragstart', function(event) {
    
                    if (event.handled === false) return;
                    event.handled = true;
                    container.onDragStart(event);
                });
    
                div.find("canvas").on('touchend mouseup', function(event) {
                    if (event.handled === false) return;
                    event.handled = true;
                    container.selected(event);
                });
    
                div.find("canvas").bind("dragover", container.onDragOver);
                container.prepend(div);
                if (settings.onMaskImageCreate)
                    settings.onMaskImageCreate(div);
                container.loadImage(settings.imageUrl);
            };
            container.loadMaskImage(settings.maskImageUrl);
            JQmasks.push({
                item: container,
                id: settings.id
            })
            return container;
        };
    }(jQuery));
    .temp {}
    
    .container {
    	background: gold;
      position: relative;
     
    }
    
    .masked-img {
    	overflow: hidden;	
    	position: relative;
    }
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    
    <input id="fileup" name="fileup" type="file" style="display:none" >
    
    <div class="container">
    
    </div>

    【讨论】:

    • 感谢 sn-p,现在当我第一次点击时:@9​​87654325@ 正在打开,但我无法拖动上传的图像.....
    • 问题是关于点击事件。我是这么回答的。我会检查拖动问题。
    • 实际上之前拖动是可以的,请检查有问题的代码sn-p.....
    • 您能否在您的问题 sn-p.我看到它不起作用。
    • 请点击重叠部分->上传图片,然后点击第一张图片->上传图片,再次点击overlapped part->第一次点击不允许上传图片......跨度>
    【解决方案6】:

    这里另一种可能的解决方案是为不同的图像使用不同的“白色”。 只需稍微更改第一张图像的白色,例如rgb(255, 255, 254) 并通过颜色区分它们。用户不应该注意到这种差异。 这可以通过画布自动化:

    让我们为 14 个(来自聊天讨论)图像添加配置(这可以生成,但在当前情况下不需要):

    const colors = [
      "254, 255, 255",
      "255, 254, 255",
      "255, 255, 254",
      "254, 255, 254",
      "254, 254, 255",
      "255, 254, 254",
      "254, 254, 254",
      "253, 254, 254",
      "254, 253, 254",
      "254, 254, 253",
      "253, 254, 253",
      "253, 253, 254",
      "254, 253, 253",
      "253, 253, 253",
      "253, 255, 253"
    ]
    

    让我们在插件中再添加一个方法:

          onImageLoad: function (context, width, height, id) {
            const imageData = context.getImageData(0, 0, width, height);
            for (let i = 0; i < imageData.data.length; i += 4) {
              // is this pixel the old rgb?
              if (imageData.data[i] === 255 &&
                imageData.data[i + 1] === 255 &&
                imageData.data[i + 2] === 255
              ) {
                const color = colors[parseInt(id)].split(', ');
                // change to your new rgb
                imageData.data[i] = parseInt(color[0]);
                imageData.data[i + 1] = parseInt(color[1]);
                imageData.data[i + 2] = parseInt(color[2]);
              }
            }
            context.putImageData(imageData, 0, 0);
          },
    

    在这里调用它:

          image.onload = function() {
            canvas.width = image.width;
            canvas.height = image.height;
            context.drawImage(image, 0, 0, image.width, image.height);
            if (settings.onImageLoad)
              settings.onImageLoad(context, image.width, image.height, canvas.id);
            div.css({
              "width": image.width,
              "height": image.height
            });
          };
    

    所以现在我们可以通过颜色来判断点击图片的id:

    $('.container').click(function(e) {
    
      var res = e.target;
      target = res.id;
      console.log(target);
      if (e.target.getContext) {
        var pixel = e.target.getContext('2d').getImageData(e.offsetX, e.offsetY, 1, 1).data;
        console.log(pixel);
        const color = `${pixel[0]}, ${pixel[1]}, ${pixel[2]}`;
        const id = colors.indexOf(color);
        console.log(id, 'clicked')
        if (pixel[3] === 255) {
          setTimeout(() => {
            $('#fileup').click();
          }, 20);
        }
      }
    
    });
    

    这里你唯一要做的就是在一个共享画布中绘制所有图像,这样就不会留下重叠,你应该没问题。

    UPD:工作示例:https://codepen.io/extempl/pen/moGPQL

    【讨论】:

    • 所以对于第一张图片,我是否需要使用rgb(255, 255, 254),对于第二张图片:rgb(255, 255, 253),对于第三张:rgb(255, 255, 252) 等等?我在一些模板中有 8 张图片:codepen.io/kidsdial/pen/YgjEKj,重叠部分:prnt.sc/mztuoa
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多