2009-06-14 4 views
2

Die init() der Lage ist, den Parameter, um es in diesem Beispiel bestanden zu verwenden:Javascript besseren Weg Knoten von Callback als XSLT zu identifizieren generieren-ID() auf einem anderen Attribut

<body onload="init(this);"> 

testdOnChange() in diesem Beispiel wird eine weitere komplizierte Technik mit XSLT generate-id():

<testd:test 
    testd_id="TESTD_ID_id0x03cc1988" 
    testd_on_load="testdOnChange(testdGetElementById('TESTD_ID_id0x03cc1988'));" 
    /> 

Gibt es eine direktere Technik?

XML-Code 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-Code 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> 

Antwort

1

Diese ziemlich merkwürdig ist suchen, aber wenn ich das richtig verstehe, dann würden Sie in der Lage sein für Ihre individuelle Veranstaltung zu schreiben Handler, so dass sie leicht einen Verweis auf das Element erhalten, an das sie angehängt sind. Das sollte nicht schwer sein; Schließlich sind rufen Sie die benutzerdefinierten Handler selbst, so dass Sie wissen bereits, welches Element es an - man muss nur, dass sich entlang an den Handler übergeben:

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 
    } 
} 

Jetzt können Sie Ihre Ereigniscode vereinfachen:

<xsl:attribute name="testd_on_load">testdOnChange(this);</xsl:attribute> 
+0

In der for-Schleife ist der nodeValue das Skript so ändern zu: var n = result.snapshotItem (i); var s = n.nodeValue; var e = n.ownerElement; Würdest du deine Antwort modifizieren, da ich sie nicht bearbeiten kann? –

+0

Guter Fang - Ich habe die Antwort aktualisiert. – Shog9

Verwandte Themen