当鼠标在 svg 文件中输入 ID 时,事件侦听器不起作用

问题描述 投票:0回答:1

我创建了一个简单的代码来使用 SVG 文件和事件监听器来进行研究和学习。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SVG Mouse Pointer Change</title>
<style>
    #svg5 {
        width: 50%; /* Adjust the width as needed */
        height: auto; /* Maintain aspect ratio */
    }
</style>
<script>
    window.onload = function() {
        var svgObject = document.getElementById('svg5');
        svgObject.addEventListener('load', function() {
            var svgDocument = svgObject.contentDocument;
            var rect = svgDocument.getElementById('rect237');

          // Function to change mouse pointer to crosshair
            function changeCursorToCrosshair() {
                console.log("Mouse entered rect237");
                document.body.style.cursor = 'crosshair';
            }

            // Function to change mouse pointer to default
            function changeCursorToDefault() {
                console.log("Mouse left rect237");
                document.body.style.cursor = 'default';
            }

            // Add event listener for mouse enter
            rect.addEventListener('mouseenter', function() {
                console.log("Mouse entered rect237");
                changeCursorToCrosshair();
            });

            // Add event listener for mouse leave
            rect.addEventListener('mouseleave', function() {
                console.log("Mouse left rect237");
                changeCursorToDefault();
            });

        });
    };
</script>
</head>
<body>

<object id="svg5" type="image/svg+xml" data="./img/simple_pitch.svg"></object>

</body>
</html>

但是,在测试代码时没有任何反应。我添加了一些控制台日志,但没有显示任何内容。我希望有人能让我知道我错过了什么。

谢谢

javascript html svg
1个回答
0
投票

有两件事:

window.load
事件将在触发之前等待
<object>
自己的加载事件。因此,当您处于
window.load
事件处理程序中时,
<object>
的事件处理程序已经触发,并且在其
data
发生变化之前不会再次触发。
这意味着
svgObject
load
事件不会触发,并且您的回调也不会被调用。
因此,删除行
svgObject.addEventListener('load', ...
并直接在
window.onload
事件中调用您的代码。

然后,

document.body.style.cursor = 'crosshair';
将设置
outer
HTML 文档的 cursor 标签的
<body>
,但您悬停的元素是 inner SVG 文档的
<rect>
元素。两个文档都是独立的,
<object>
的内部文档将捕获指针事件,包括光标的设置。
如果你想改变光标,可以将其设置为
svgDocument.documentElement.style.cursor = ...

(显然,您也可以通过简单的
rect { cursor: crosshair }
CSS 规则实现相同的效果,但我知道这只是使用事件的测试。)

© www.soinside.com 2019 - 2024. All rights reserved.