我最近有必要在 javascript 中动态地重写一个 javascript 函数。我做这件事的轻松程度,以及它的乐趣,让我感到震惊。
在这里,我有一些 HTML:
<div id="excelExport1234"
onclick="if(somestuff) location.href='http://server/excelExport.aspx?id=56789&something=else'; else alert('not important');"
>Click here to export to excel</div>
而且我无法更改输出的 HTML,但我需要向该链接添加一个额外的参数。我开始考虑它,并意识到我可以这样做:
excelExport = $('excelExport1234');
if (needParam)
eval('excelExport.onclick = ' + excelExport.onclick.toString().replace("excelReport.aspx?id", "excelReport.aspx?extraParam=true&id") + ';');
else
eval('excelExport.onclick = ' + excelExport.onclick.toString().replace("extraParam=true&", "") + ';');
它就像一个冠军!excelExport.onclick 返回一个函数对象,我将其转换为字符串,并对其进行一些字符串操作。由于它现在是“function() { ... }”的形式,我只是返回并将其分配给 dom 对象的 onclick 事件。不得不使用 eval 有点难看,但是 AFAIK 没有一个 javascript 函数构造函数可以接受一串代码并将其很好地转换为对象。
无论如何,我的意思不是我超级聪明(我不是),我的意思是这很酷。而且我知道 javascript 不是唯一可以做到这一点的语言。我听说 lisp 多年来一直为此目的使用宏。除了真正的 grok 宏,你需要真正 grok lisp,我不 grok 它,我只是'有点明白'。
所以我的问题是:你可以(轻松地)用哪些其他语言动态重写函数,你能给我看一个简单的例子吗? 我想看看你还能在哪里做到这一点,以及它是如何做到的!
(另外,我不知道要标记什么,所以我随机猜测)