我有一个包含一系列标签的页面
<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标签的页面中的标签上下文中执行它?
我真正想要做的就是点击我在页面中找到的标签。
答案 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
属性。)如果您可以/想要引入类似jQuery,Prototype,Closure等的库,他们可以简化这样做。
答案 1 :(得分:0)
如果你有这样的事情:
var z = 'function onclick(event) { openWin(this,"./photos/Snapshot_20100804.jpg"); return false; }'
您可以轻松执行此操作以执行z
中包含的字符串:
var cmd = "("+z+")();"
eval(cmd);
您可以对其进行测试HERE。