【问题标题】:captured onclick function捕获的 onclick 函数
【发布时间】:2010-09-06 21:37:28
【问题描述】:

我有一个页面包含一系列这样的标签

 <a class="IMG" href="#" onclick="openWin(this,'./photos/Snapshot_20100803.jpg');return false;"><img src="./photos/TN_Snapshot_20100803.jpg" alt="./photos/TN_Snapshot_20100803.jpg"/></a> 

openWin 创建一个窗口并在单击拇指时显示图像。该页面还包含一个“下一步”按钮,该按钮调用父页面脚本中的 nextImage 函数。 nextImage 搜索类 IMG 标记并找到以下具有类 IMG 的标记。 但现在我被困住了。我找到了正确的 a 标签并将其放在 var z 中。我可以得到一些东西 ala

cmd = z.onclick;

如果我用 alert(cmd) 显示 cmd,我会看到类似这样的内容

函数点击(事件){ openWin(this, "./photos/Snapshot_20100804.jpg"); 返回假; }

但我不知道我有什么。我似乎无法像使用 indexOf 的字符串一样操作它。

我看到了什么?

如何将其作为字符串进行操作?

有没有什么方法可以定义函数,也许使用 eval() 并在包含 a 标签的页面中的标签上下文中执行它?

我真正想做的是点击我在页面中找到的标签。

【问题讨论】:

  • z.click() 不起作用吗?你会用jQuery吗?
  • @Cipi: JavaScript != jQuery ;-)
  • @cipe 等人:好的,z.onclick() 正是我想要的。但这又引出了另一个问题!当我做类似 var z = document.body.getElementsByTagName("A");我是否获得原位标签的副本或实际参考?如果它是一个副本,我不明白它为什么会起作用,因为 winOpen 依赖于它来找到当前位置。
  • 这是一个NodeList,包含对实际a原位元素的引用:w3.org/TR/DOM-Level-2-Core/core.html#ID-A6C9094
  • @cipi, tj crowder:感谢您的周到回答,这是一个了不起的地方!再一次,我很难接受什么答案。 cipe 建议 z.onclick() 似乎对我有用。 tjc 给了我一些建议,我一定会采纳。

标签: javascript


【解决方案1】:

您在z 中找到的是a 元素的HTMLElement 实例。当您查看其onclick 属性(这是其onclick 属性的反映)时,您会得到一个Function 实例。 Function 实例的 toString 几乎在所有实现上都返回一个包含函数反编译版本的字符串。但是,这是非标准行为,并且在最新的 JavaScript 规范的新“严格”模式中明确禁止。无论如何,反编译处理程序并不是您要解决此问题的方式。 :-)

如果可以修改 HTML,我建议将目标图片编码为数据属性,如下所示:

<a class="IMG" href="#" data-img='./photos/Snapshot_20100803.jpg' onclick="openWin(this,this.getAttribute('data-img'));return false;"><img src="./photos/TN_Snapshot_20100803.jpg" alt="./photos/TN_Snapshot_20100803.jpg"/></a>

然后,在处理“下一个”功能时,您可以简单地找到下一个a 元素(我称之为nextLink)并执行以下操作:

openWin(nextLink, nextLink.getAttribute('data-img'));

更好的是,让openWin 函数读取data-img 属性本身,这样HTML 就可以:

<a class="IMG" href="#" data-img='./photos/Snapshot_20100803.jpg' onclick="openWin(this);return false;"><img src="./photos/TN_Snapshot_20100803.jpg" alt="./photos/TN_Snapshot_20100803.jpg"/></a>

...以及在nextLink 上打开下一个的调用只是:

openWin(nextLink);

稍微缩短页面,不必重复所有this.getAttribute('data-img') 位。

前缀为 data- 的自定义属性从 HTML5 开始有效,并且它们现在适用于所有浏览器,即使是早期的文档类型(只是技术上它们在早期的文档类型中无效;我不知道有任何浏览器关心)。

有点跑题了,如果允许您进行更大的更改,您可以完全放弃a 标签上的onclick,而是通过挂钩任何容器的click 事件来使用事件冒泡所有这些a 元素。这是因为除非被取消,否则点击会沿着树向上传播(从子节点到父节点)直到它被处理,您可以通过查看事件对象来确定实际点击了哪个子节点(这样您就可以获取它的 data-img 属性。)如果您可以/想要引入像 jQueryPrototypeClosure 等这样的库,他们可以显着简化操作。

【讨论】:

  • 哦,我现在明白为什么 eval() 不好了... =D
  • 非常感谢。更多值得深思。实际上,我虽然按照 data-img 标签的方式进行了搜索,但搜索 W3 并没有找到我可以使用的任何东西。火狐 3.0.19 和 IE 8 是否支持数据业务。我已经避免了事件业务,因为我是初学者并且没有该主题的经验;也许是时候深入研究了。
  • @Mike D:我从未发现非标准属性会成为问题的浏览器,当然所有主流属性都可以。 AFAIK,这只是一个验证问题;这对您来说有多大的问题取决于验证是否是您的开发周期的重要组成部分(验证是一件好事(tm))。 (如果是,您现在可以考虑跳转到 HTML5 文档类型;它works just fine(这是一个链接)即使在尚未明确支持 HTML5 内容的浏览器中也是如此。)
  • 我已经改变了一些东西,所以 a 标签包含 onclick="openWin(this) 并且 img 链接作为 data-img= 传递。你是否建议在 openWin(nextLink) 中是 JavaScript对于下一个按钮,openWin 将从 getElementByTagName 获得的正确内容放在那里? openWin 仍然需要执行 getElementByName 才能找到 nextLink,除非以某种方式保留了上下文。
  • @Mike D:听起来你的方向是正确的。既然你已经这样做了,我会让openWin 使用getAttribute 来获取data-img 的值(如果你还没有的话)。 “下一个”功能可以使用 getElementsByTagName,但您可能还想查看 DOM 规范中的 nextSiblingparentNodechildNodes/firstChildw3.org/TR/DOM-Level-2-Core/core.html 玩得开心! (请注意,有许多不同类型的节点;您感兴趣的那种——元素——是nodeType == 1。)
【解决方案2】:

如果你有这样的事情:

var z = 'function onclick(event) { openWin(this,"./photos/Snapshot_20100804.jpg"); return false; }'

您可以轻松执行此操作以执行z 中包含的字符串:

var cmd = "("+z+")();"
eval(cmd);

你可以测试一下HERE

【讨论】:

  • 可以,是的。这只是一个非常非常糟糕的主意。 :-)
  • 为什么?因为他不能确定 z 中包含什么?
  • 避免eval的原因有很多,但在这种情况下,一个很好的理由是您在我的回答中提到的:函数反编译是非标准的。
猜你喜欢
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
相关资源
最近更新 更多