gpt4 book ai didi

javascript - 无法将函数作为值传递给 setAttribute

转载 作者:行者123 更新时间:2023-12-02 19:55:26 28 4
gpt4 key购买 nike

我有一些有效的 SVG 代码,可以通过在形状上设置属性来处理鼠标事件:

function plot() {
...
shape.setAttributeNS(null, "onmouseover", "popup_on (evt,"+sindex+","+month+")");
shape.setAttributeNS(null, "onmouseout", "popup_off(evt,"+sindex+")");
}

但是,我需要更改此代码,因为 popup_onpopup_off 不再是静态函数,并且需要大量上下文,具体取决于调用它们的位置。我通过定义一个闭包并将函数名称作为属性值传递来处理此问题:

function plot(popup_on, popup_off) {
...
shape.setAttributeNS(null, "onmouseover", popup_on + "(evt,"+sindex+","+month+")");
shape.setAttributeNS(null, "onmouseout", popup_off + "(evt,"+sindex+")");
}

但是,这不起作用 - 弹出代码永远不会被触发。如果我检查 Firebug 或 Dragonfly 中的“形状”属性,它们似乎是正确的。 'shape' 具有 'onmouseover' 和 'onmouseout' 属性,该属性的值是 popup_onpopup_off 函数的完整源文本:

onmouseover=function popup_on(evt, sindex, month) {
...
}

但这些函数实际上并未运行。知道我做错了什么吗?谢谢。

更新

感谢您的所有反馈。马克的回答不起作用; “function”被标记为语法错误。 'popup_on' 和 'popup_off' 不是字符串 - 它们实际上是闭包中的函数。不过,Sime 和 Erik 的答案确实有效,但有一个问题。

如果我将代码更改为:

shape.addEventListener("mouseover", function() {popup_on (evt, sindex, month);}, false);

然后,当 firebug 尝试执行 popup_on(当鼠标点击时)时,它会提示“evt”未定义。如果我将 evt 更改为 window.evtevt || window.evt,那么我就不会收到此错误,但我仍然无法访问弹出处理程序中的事件:

   // popup handler in closure
o["popup_on"] = function(evt, sindex, month) {
// both evt and window.evt are undefined on entry
evt = evt || window.evt;
// so evt is still undefined, but...
...
// I need to do this
var upright = (evt.clientY >= cy);

知道为什么吗?谢谢。

更新2

好的 - 已修复。答案是:

shape.addEventListener("mouseover", function(evt) {popup_on (evt, sindex, month);}, false);
shape.addEventListener("mouseout", function(evt) {popup_off(evt, sindex);}, false);

最佳答案

为什么不使用 shape.addEventListener("mouseout", function() {...}, false) 呢?请参阅here举一些例子。

如果您希望在函数中将事件对象命名为“evt”,您可以命名它(您可以给它任何您想要的名称),如下所示:shape.addEventListener("mouseout", function(evt ) {...}, false)

否则,事件变量在监听器函数内默认命名为“event”,而不是“evt”。这是一些困惑的根源。

关于javascript - 无法将函数作为值传递给 setAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8707192/

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