在这个例子中,init()
能够使用传递给它的参数:
<body onload="init(this);">
testdOnChange()
在这个例子中使用了更复杂的 XSLT generate-id() 技术:
<testd:test
testd_id="TESTD_ID_id0x03cc1988"
testd_on_load="testdOnChange(testdGetElementById('TESTD_ID_id0x03cc1988'));"
/>
是否有更直接的技术可用?
XML 代码 http://emle.sourceforge.net/emle020000/testd1.xml :
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="testd1.xsl" type="text/xsl"?>
<emle xmlns="http://emle.sourceforge.net/emle020000" />
XSLT 代码 http://emle.sourceforge.net/emle020000/testd1.xsl :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:emle="http://emle.sourceforge.net/emle020000" xmlns:testd="http://emle.sourceforge.net/emle020000/testd" xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xml" media-type="application/xhtml+svg+mathml" encoding="UTF-8" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="/emle:emle">
<html>
<head>
<script type="text/javascript">
//<![CDATA[
function init(aThis) {alert("init(" + aThis + ")");
var result = document.evaluate("//@testd_on_load",
aThis.document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i=0; i<result.snapshotLength; i++){
n=result.snapshotItem(i).nodeValue;
eval(n);
}
}
function testdGetElementById(aTestdID){alert("testdGetElementById("+aTestdID+")");
return document.evaluate("//*[@testd_id='" + aTestdID + "']",
document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).
singleNodeValue;
}
function testdOnChange(aNode){alert("testdOnChange("+aNode.nodeName+")");}
//]]>
</script>
</head>
<body onload="init(this);">
<testd:test>
<xsl:attribute name="testd_id">TESTD_ID_<xsl:value-of select="generate-id()"/>
</xsl:attribute>
<xsl:attribute name="testd_on_load">testdOnChange(testdGetElementById(
'TESTD_ID_<xsl:value-of select="generate-id()"/>'));</xsl:attribute>
</testd:test>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
最佳答案
这看起来很奇怪,但如果我理解正确的话,您希望能够编写您的自定义事件处理程序,以便它们可以轻松获得对它们所附加的元素的引用。这应该不难;毕竟,您是自己调用自定义处理程序,所以您已经知道它附加到哪个元素 - 您只需要将其传递给处理程序本身:
function init(aThis) {
var result = document.evaluate("//@testd_on_load",
aThis.document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i=0; i<result.snapshotLength; i++) {
var n = result.snapshotItem(i); // attribute node
var s = n.nodeValue; // script to run
var e = n.ownerElement; // element for context
(new Function(s)).call(e); // run script with `this` set to the context node
}
}
现在您可以简化您的事件代码:
<xsl:attribute name="testd_on_load">testdOnChange(this);</xsl:attribute>
关于Javascript 比另一个属性上的 XSLT generate-id() 更好地识别回调节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/993231/