1

我需要在另一个上显示图像,而不是使用这些代码,但是当我的鼠标悬停在显示图像的列表 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>
4

1 回答 1

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. 这是关键,因为触发事件的时间略有变化,您需要稍微延迟检查标志,延迟一小部分秒(您可以测试这些毫秒值)。因此,您需要将处理程序代码延迟mouseout333 毫秒,因为例如,当事件触发并且您的代码被执行时,listdel mouseover甚至可能尚未触发。del mouseout
  4. 另外:为了加分,这些延迟和条件可用于为您提供更流畅的 UI。当用户通过他们的随机蜿蜒运动稍微离开感兴趣的区域以供您显示图像,然后在 500 毫秒内返回时,您可能会允许一些容忍度——如果您延迟检查标志和mouseout处理程序,你可以容忍这种意外退出。但是 UI 设计的那部分取决于对您有用的部分。

    此行也可能导致问题: del.style.visibility = "hidden"; 您是否将其设置回visible?如果没有,那么您的 del 将不会显示。不透明度可见性不同。

于 2013-01-26T06:23:07.670 回答