具有重叠div的鼠标事件

时间:2013-01-26 06:16:17

标签: javascript mouseevent

我需要在另一个上显示图像,而不是使用这些代码,但是当我的鼠标位于显示图像的列表的lisdel上时,它会消失,因为它接收到mouseout事件。这很难解释,但尝试调试它并将鼠标移动到您将看到的图像中。

<script>
    var mouseOverListDel = false;
    // Detect if the browser is IE or not.
    // If it is not IE, we assume that the browser is NS.
    var IE = document.all ? true : false

    // If NS -- that is, !IE -- then set up for mouse capture
    if (!IE) document.captureEvents(Event.MOUSEMOVE)

    // Set-up to use getMouseXY function onMouseMove
    document.onmousemove = getMouseXY;

    // Temporary variables to hold mouse x-y pos.s
    var tempX = 0
    var tempY = 0

    // Main function to retrieve mouse x-y pos.s

    function getMouseXY(e) {
        if (IE) { // grab the x-y pos.s if browser is IE
            tempX = event.clientX + document.body.scrollLeft
            tempY = event.clientY + document.body.scrollTop
        } else {  // grab the x-y pos.s if browser is NS
            tempX = e.pageX
            tempY = e.pageY
        }
        // catch possible negative values in NS4
        if (tempX < 0) { tempX = 0 }
        if (tempY < 0) { tempY = 0 }
        // show the position values in the form named Show
        // in the text fields named MouseX and MouseY
        var txbX = document.getElementById('TextBox1');
        var txbY = document.getElementById('TextBox2');
        txbX.value = tempX;
        return true
    }


    function getPosition(element) {
        var xPosition = 0;
        var yPosition = 0;

        while (element) {
            xPosition += (element.offsetLeft - element.scrollLeft + element.clientLeft);
            yPosition += (element.offsetTop - element.scrollTop + element.clientTop);
            element = element.offsetParent;
        }
        return { x: xPosition, y: yPosition };
    }



    function handleFileSelect(evt) {
        var files = evt.target.files; // FileList object

        // Loop through the FileList and render image files as thumbnails.
        for (var i = 0, f; f = files[i]; i++) {

            // Only process image files.
            if (!f.type.match('image.*')) {
                continue;
            }

            var reader = new FileReader();

            // Closure to capture the file information.
            reader.onload = (function (theFile) {
                return function (e) {
                    // Render thumbnail.
                    var span = document.createElement('span');

                    span.innerHTML = ['<img class="thumb" src="', e.target.result,
                                      '" title="', escape(theFile.name), '"/>'].join('');
                    span.style.height = "65px";
                    span.style.width = "90px";
                    document.getElementById('list').insertBefore(span, null);

                    var del = document.createElement('del');
                    del.style.visibility = "hidden";
                    del.innerHTML = ['<img class="thumbdel" src="http://s7.postimage.org/fc6w3qjp3/del.png',
                                      '" title="', escape(theFile.name + "del"), '"/>'].join('');
                    document.getElementById('listdel').insertBefore(del, null);
                    del.addEventListener("click", function () { delClick(del, span) }, false);

                    del.addEventListener('mouseover', function () { opacityOn(del) }, false)
                    del.addEventListener('mouseout', function () { opacityOn(del) }, false);
                    span.addEventListener('mouseover', function () { opacityOn(del) }, false);
                    span.addEventListener('mouseout', function () { opacityOff(del) }, false);
                };
            })(f);

            // Read in the image file as a data URL.
            reader.readAsDataURL(f);
        }
    }

    function delClick(imgDel, img)
    {
        var listImg = document.getElementById('list');
        listImg.removeChild(img);

        var listDelImg = document.getElementById('listdel');
        listDelImg.removeChild(imgDel);
    }

    function opacityOn(imgDel)
    {
        imgDel.style.visibility = "visible";
    }

    function opacityOff(imgDel)
    {
            imgDel.style.visibility = "hidden";
    }


    document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>

1 个答案:

答案 0 :(得分:0)

你可以使用CSS吗?喜欢:

.listDel {
    background: none;
}

.listDel :hover {
    background: URL("URL to image");
}

如果您想要在javascript中显示图像的复杂条件,为什么不这样想:

var listdel = document.getElementById('listdel');
listdel.addEventListener('mouseover', 
    function () { window.mouseOverListDel = true; }
    , false);
listdel.addEventListener('mouseout', 
    function () { 
         setTimeout( 
             function () {  window.mouseOverListDel = false; }
             , 333
         );
    }
    , false);

然后在你的opacityOn函数中(可能还隐藏了删除按钮图像?)检查是否设置了该标志(mouseOverListDel),如果是,那么你不想隐藏del按钮图像,因为您知道鼠标位于删除图像列表之上,并且它不应该隐藏任何内容。

即使我还没有完全理解你的细节,这种模式也会有所帮助。基本上,您希望继续显示图像,即使本地鼠标离开该图像的边界,但它仍处于该图像的“用户相关”位置 - 即,它仍“看起来非常接近该图像”,因此它如果我们继续显示图像会很有帮助,如果我们不显示图像则无益。

您可以使用像hoverIntent这样的库并使用jQuery来简化这一过程,或者您可以自己编写代码,就像我给您举例说明的那样。基本思想包括两个部分:

  1. 当鼠标悬停在你感兴趣的区域时设置一个标志,当鼠标悬停在它们上面时取消设置。
  2. 检查其他鼠标在事件处理程序上的这些标记,以确定是否满足您为操作选择的条件(图像显示,图像隐藏或其他任何内容)。
  3. 这是紧要关头因为事件发生时间略有不同,你需要延迟稍微检查一下标志,只需要一小部分一秒钟(您可以测试这些毫秒值)。因此,您需要将mouseout中的处理程序代码延迟333毫秒,因为listdel mouseover甚至可能尚未在del {{1}时触发事件触发并执行您的代码。
  4. 此外:对于额外的积分,这些延迟和条件可用于为您提供更流畅的用户界面。当用户通过他们的随机曲折动作略微离开您感兴趣的区域以显示图像时,也许你会允许一些宽容,但是如果你延迟检查标志,那么它会在500毫秒内回来 - {{ 1}}处理程序,你可以容忍这种意外退出。但是,UI设计的这一部分取决于对你有用的东西。

    此行也可能导致问题: mouseout 你有没有把它设置回mouseout?如果没有,那么您的del将不会显示。不透明度与可见性不一样