Javascript лучший способ идентифицировать узел обратного вызова, чем XSLT generate-id () для другого атрибута - PullRequest
2 голосов
/ 14 июня 2009

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>

1 Ответ

1 голос
/ 29 августа 2009

Это выглядит довольно странно, но если я правильно понимаю, вы бы хотели написать свои собственные обработчики событий, чтобы они могли легко получить ссылку на элемент, к которому они присоединены. Это не должно быть сложно; в конце концов, вы сами вызываете пользовательский обработчик, так что вы уже знаете, к какому элементу он присоединен - ​​вам просто нужно передать его самому обработчику:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...