捕获onclick功能

时间:2010-09-06 13:16:44

标签: javascript

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

 <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的标记。 但是现在我被卡住了。我找到了正确的标签并将其放在var z中。我可以得到一些东西

cmd = z.onclick;

如果我显示带警报的cmd(cmd),我会看到类似这样的内容

function onclick(event){     openWin(this,“./ photos /Snapshot_20100804.jpg”);     返回false; }

但我不知道我拥有什么。我似乎无法操纵它,好像它是使用indexOf的字符串。

我哼了什么东西?

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

我是否有某种方法可以使用eval()定义函数并在包含a标签的页面中的标签上下文中执行它?

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

2 个答案:

答案 0 :(得分:2)

您在z中找到的是a元素的HTMLElement实例。当您查看其onclick属性(它是onclick属性的反映)时,您将获得Function个实例。几乎所有实现上的toString实例的Function都返回一个包含该函数的反编译版本的字符串。但是,这是非标准行为,在最新的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开始有效,它们可以与所有浏览器一起使用,即使现在还有早期的doctypes(从技术上讲,它们在早期的doctypes中无效;我不知道任何关心的浏览器。)

偏离主题,如果您允许进行更大的更改,则可以完全抛弃onclick标签上的a,而是通过挂钩{{1}来使用事件冒泡任何容器的事件都包含所有这些click元素。这是因为除非取消,否则点击会从树上移动(从孩子到父母),直到 处理完毕,你可以通过查看事件对象来找出实际点击的孩子(这样你就可以了)获取其a属性。)如果您可以/想要引入类似jQueryPrototypeClosure等的库,他们可以简化这样做。

答案 1 :(得分:0)

如果你有这样的事情:

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

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

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

您可以对其进行测试HERE