gpt4 book ai didi

javascript - 具有重叠 div 的鼠标事件

转载 作者:行者123 更新时间:2023-11-28 09:24:52 24 4
gpt4 key购买 nike

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

最佳答案

你能用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),如果是,那么您不想隐藏删除按钮图像,因为您知道鼠标位于删除图像列表上,并且它不应该隐藏任何内容。

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

您可以使用像 hoverIntent 这样的库并使用 jQuery,这会使事情变得更容易,或者您可以自己编写代码,正如我给您提供的示例一样。基本思想有两部分:

  1. 当鼠标悬停在您感兴趣的区域上方时,为您感兴趣的区域设置一个标志,当鼠标不在它们上方时取消设置。
  2. 从其他鼠标悬停事件处理程序中检查这些标志,以确定是否满足您为操作选择的条件(图像显示、图像隐藏或其他条件)。
  3. 这里是关键,因为事件触发时间略有不同,您需要稍微延迟标志的检查,延迟一小部分一秒(您可以测试这些毫秒值)。因此,您需要将 mouseout 中的处理程序代码延迟 333 毫秒,因为例如 listdel mouseover 甚至可能尚未触发del mouseout 事件触发并执行您的代码。
  4. 另外:为了获得额外积分,这些延迟和条件可用于为您提供更流畅的 UI。当用户通过随机的蜿蜒运动稍微离开您感兴趣的区域来显示图像,但随后又回来(比如 500 毫秒)时,也许您可​​以允许一定的容忍度——如果您延迟了标志的检查,并且 mouseout 处理程序,您可以容忍这种意外退出。但这部分 UI 设计取决于对您有用的部分。

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

关于javascript - 具有重叠 div 的鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14534430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com