Hinzufügen von Javascript zu einer XML-Datei, die mit XSLT mit einem Greasemonkey-Skript transformiert wurde

Wie folgt meine Frage hier – wie man eine XML-Datei mit XSLT verwandelt, mit einem Greasemonkey-Skript? – Ich stehe vor einem anderen Problem:

Ich möchte einige grundlegende Javascript-Funktionen in meiner XSL-Vorlage verwenden, um die Anzeige von einigen divs zu steuern. Allerdings, egal wie ich diese Javascript-Funktionen enthalten, scheinen sie nicht zu erkennen. Ich habe schon viel untersucht, aber ich kann es nicht scheinen.

  • Warum nicht document.addEventListener ('load', function) Arbeit in einem greasemonkey Skript?
  • Client-Side ajaxComplete Call Generierung von unendlichen iframes
  • Wie kann ich automatisch bestimmte Optionsfelder mit Greasemonkey auswählen?
  • Greasemonkey-Taste klicken
  • Wie importiere ich dieses Greasemonkey-Skript, das CDATA verwendet, auf Chrome?
  • Auf Reddit, wie bekommen Skripte die Anzahl der upvotes und downvotes für einen Kommentar?
  • Ich habe versucht 2 Dinge:

    • Hinzufügen des Javascript in der XSL-Vorlage in einem <script> -Tag
    • Anhängen eines neuen <script> -Tags im Greasemonkey-Skript selbst

    Ich würde es vorziehen, jQuery oder eine externe JS-Datei (die ich auch versuchte) zu benutzen, um es so einfach wie möglich zu halten, aber wenn das das Problem lösen würde, bin ich offen, das Ganze zu ändern!

    In jedem Fall, wenn ich die Funktion anrufe, bekomme ich einen ReferenceError: x is not defined . Ich sehe, dass die Javascript-Code sitzt gut in der letzten HTML-Ergebnis though. Wenn ich Firebug benutze, um ein neues <script> -Tag mit einer einfachen Funktion anzufügen, die "hallo" auf eine einfache HTML-Seite hinweist, dann funktioniert es perfekt. Es ist nur, wenn dies auf einer XSLT-Transformation getan wird, geht es falsch (um der Einfachheit halber bin ich nur mit einer einfachen Funktion, um eine Warnbox zu zeigen).

    Hier sind meine Beispieldaten:

      <?xml version="1.0" encoding="utf-8"?> <Results> <Result> <Listings total="2"> <Res> <Result index="0"> <id>123456</id> <name>My Business</name> <category>Restaurants</category> <phone>9872365</phone> </Result> </Res> <Res> <Result index="1"> <id>876553</id> <name>Some Other Business</name> <category>Restaurants</category> <phone>9834756</phone> </Result> </Res> </Listings> </Result> </Results> 

    Hier ist der erste Versuch, wo ich gerade ein <script> -Tag im <head> -Tag hinzugefügt habe:

     // ==UserScript== // @name _Test XML Renderer // @description stylesheet for xml results // @include * // @grant none // ==/UserScript== var xsl_str = '<?xml version="1.0" encoding="utf-8"?>\n\ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">\n\ <xsl:output method="html"/>\n\ <xsl:template match="/">\n\ <html>\n\ <head><script type="text/javascript">function hello() {alert("hello")};</script></head>\n\ <body>\n\ <table id="results" border="1" cellspacing="0" cellpadding="0">\n\ <thead>\n\ <tr>\n\ <th class="name">id</th>\n\ <th class="name">category ID</th>\n\ <th class="name">name</th>\n\ <th class="name">phone</th>\n\ </tr>\n\ </thead>\n\ <tbody>\n\ <xsl:for-each select="Results/Result/Listings/Res">\n\ <tr>\n\ <td class="small" width="120">\n\ <a href="#" onclick="hello()"><xsl:value-of select="Result/id"/></a>\n\ </td>\n\ <td class="small" width="120">\n\ <xsl:value-of select="Result/category"/>\n\ </td>\n\ <td class="small" width="120">\n\ <xsl:value-of select="Result/name"/>\n\ </td>\n\ <td class="small" width="120">\n\ <xsl:value-of select="Result/phone"/>\n\ </td>\n\ </tr>\n\ </xsl:for-each>\n\ </tbody>\n\ </table>\n\ </body>\n\ </html>\n\ </xsl:template>\n\ </xsl:stylesheet>\n\ '; var processor = new XSLTProcessor (); var dataXSL = new DOMParser ().parseFromString (xsl_str, "text/xml"); processor.importStylesheet (dataXSL); var newDoc = processor.transformToDocument (document); //-- These next lines swap the new, processed doc in for the old one... window.content = newDoc; document.replaceChild ( document.importNode (newDoc.documentElement, true), document.documentElement ); 

    Hier ist mein anderer Versuch, wo ich die "Hallo" -Funktion außerhalb der XSL-Vorlage hinzufüge:

     // ==UserScript== // @name _Test XML Renderer // @description stylesheet for xml results // @include * // @grant none // ==/UserScript== var xsl_str = '<?xml version="1.0" encoding="utf-8"?>\n\ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">\n\ <xsl:output method="html"/>\n\ <xsl:template match="/">\n\ <html>\n\ <head></head>\n\ <body>\n\ <table id="results" border="1" cellspacing="0" cellpadding="0">\n\ <thead>\n\ <tr>\n\ <th class="name">id</th>\n\ <th class="name">category ID</th>\n\ <th class="name">name</th>\n\ <th class="name">phone</th>\n\ </tr>\n\ </thead>\n\ <tbody>\n\ <xsl:for-each select="Results/Result/Listings/Res">\n\ <tr>\n\ <td class="small" width="120">\n\ <a href="#" onclick="hello()"><xsl:value-of select="Result/id"/></a>\n\ </td>\n\ <td class="small" width="120">\n\ <xsl:value-of select="Result/category"/>\n\ </td>\n\ <td class="small" width="120">\n\ <xsl:value-of select="Result/name"/>\n\ </td>\n\ <td class="small" width="120">\n\ <xsl:value-of select="Result/phone"/>\n\ </td>\n\ </tr>\n\ </xsl:for-each>\n\ </tbody>\n\ </table>\n\ </body>\n\ </html>\n\ </xsl:template>\n\ </xsl:stylesheet>\n\ '; var processor = new XSLTProcessor (); var dataXSL = new DOMParser ().parseFromString (xsl_str, "text/xml"); processor.importStylesheet (dataXSL); var newDoc = processor.transformToDocument (document); var script = "function hello() {alert('hello')};"; var newElem = newDoc.createElement('script'); newElem.type = 'text/javascript'; newElem.appendChild(newDoc.createTextNode(script)); newDoc.getElementsByTagName('head').item(0).appendChild(newElem); //-- These next lines swap the new, processed doc in for the old one... window.content = newDoc; document.replaceChild ( document.importNode (newDoc.documentElement, true), document.documentElement ); 

  • Entfernen Sie <b> Tag aus Text
  • Wie kann ich Image-URLs verknüpfen, um auf das Vollbild zu zeigen?
  • Wie kann ich mein erstes Benutzerskript verbessern?
  • Wie können Sie die Dateigröße in JavaScript bestimmen?
  • Parse Greasemonkey Metadaten und / oder greifen Kommentare aus einer Funktion
  • Wie simuliere die Eingabe im Eingabefeld mit jQuery?
  • One Solution collect form web for “Hinzufügen von Javascript zu einer XML-Datei, die mit XSLT mit einem Greasemonkey-Skript transformiert wurde”

    Verwenden Sie nicht onclick . Dies geht dreifach für Usercripts, da es zusätzliche Umfangs- und / oder Sandbox-Konflikte gibt.

    Auch ist es eine schlechte Idee zu versuchen und fügen Sie JS in die XSLT-Datei / Text, und es gibt keine Notwendigkeit für Skript-Injektion in diesem Fall entweder.

    Verwenden Sie das Skript zu tun, was JS Manipulation Sie im Sinn haben. Beispielsweise:

     // ==UserScript== // @name _XML Renderer with javascript functionality // @description Stylesheet and javascript for xml results // @include http://YOUR_SERVER.COM/YOUR_PATH/*.xml // @resource xslFile Q_17998446_transform.xsl // @grant GM_getResourceText // ==/UserScript== var xsl_str = GM_getResourceText ("xslFile"); var processor = new XSLTProcessor (); var dataXSL = new DOMParser ().parseFromString (xsl_str, "text/xml"); processor.importStylesheet (dataXSL); var newDoc = processor.transformToDocument (document); //-- These next lines swap the new, processed doc in for the old one... window.content = newDoc; document.replaceChild ( document.importNode (newDoc.documentElement, true), document.documentElement ); //-- Use JS to smarten-up the new document. var firstCols = document.querySelectorAll ("#results td:first-child"); for (var J = firstCols.length - 1; J >= 0; --J) { var tdNode = firstCols[J]; tdNode.style.cursor = "pointer"; tdNode.addEventListener ("click", clickCellHandler, false); } function clickCellHandler (zEvent) { var cellContents = zEvent.target.textContent.trim (); alert ('The clicked cell contains "' + cellContents + '".'); } 

    Q_17998446_transform.xsl eine Datei ist, die im selben Ordner Q_17998446_transform.xsl ist, von wo aus Sie Ihr Skript installieren (Sie müssen das Skript deinstallieren und neu installieren).

    Q_17998446_transform.xsl enthält das genau:

     <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html"/> <xsl:template match="/"> <html> <head></head> <body> <table id="results" border="1" cellspacing="0" cellpadding="0"> <thead> <tr> <th class="name">id</th> <th class="name">category ID</th> <th class="name">name</th> <th class="name">phone</th> </tr> </thead> <tbody> <xsl:for-each select="Results/Result/Listings/Res"> <tr> <td class="small" width="120"> <xsl:value-of select="Result/id"/> </td> <td class="small" width="120"> <xsl:value-of select="Result/category"/> </td> <td class="small" width="120"> <xsl:value-of select="Result/name"/> </td> <td class="small" width="120"> <xsl:value-of select="Result/phone"/> </td> </tr> </xsl:for-each> </tbody> </table> </body> </html> </xsl:template> </xsl:stylesheet> 


    Wenn Sie dieses Skript auf der entsprechenden XML-Datei ausführen, fügt es einen Klick-Handler zur ersten Tabellenspalte (sans header) hinzu – der "Web 2.0" Weg.

    Wenn eine der ersten Spaltenzellen angeklickt wird, warnt sie beispielsweise:

    Die angeklickte Zelle enthält "876553".

    Lassen Sie uns Javascript Schönheit und nützlich machen.