JS-Code nachladen, der dann ausgeführt wird

denyo85

Mitglied
Hi!

Ich möchte per AJAX-Request eine Seite nachladen, in der auch folgender HTML-Code enthalten ist:

Code:
<script type="text/javascript">
mein JS-Code
</script>

Nur wird mein JS-Code nicht ausgeführt. Weiß jemand dafür eine Lösung bzw. ob das überhaupt möglich ist?

MfG Denyo
 
Hi,

wie lädst du denn den Code rein ?
AFAIK musst du den geladenen Code erstmal
in ein Element schieben
Code:
$element.innerHTML = meinCode

Grüße
 
Ich habe einen Content-Bereich, dessen Inhalt ich per DOJO (dojo.xhrRequest) nachlade, also per HttpXmlRequest. Die nachgeladen HTML-Seiten enthalten den o.g. JS-Code, wird jedoch nicht ausgeführt.

Der Code, den du schreibst, müsste ja auch in den <script>-Teil sein, der ja nicht ausgeführt wird. Oder?
 
Hi,

ne, der muss dort nicht rein.
Ich weiß jetzt nicht genau, wie Dojo funktioniert,
aber du musst das, was der Request zurückgibt(also
html+dein javascript) in ein schon vorhandenes(im DOM
registriertes) Element einfügen(zb .innerHTML)

Folgender "Code" sollte helfen:
Code:
request = new DojoRequest( 'http://meineSeite.tld/lademir=x/';
request.onComplete = complete;
function complete( pHtml ){
    getElementById( 'meinElementDasEsbereitsGibt' ).innerHTML = pHtml;
}
Afaik wird erst dann dein javascript in dem <script> ausgeführt,wenn es einem Element
zugewiesen wird, das bereits Bestandteil des DOM ist.

Grüße,
MArc
 
Ich erledige dies mit folgender Funkion in dem ich den JS Code einfach vom übrigen html extrahiere und dann den JS Code über eval ausführe.

Rückgabe Wert ist dann ein Array , der erste wert ist der HTML String der 2. dann alle JavaScripte die enthalten waren.

Code:
function parseScript(sInnerHTML) {
    var s = sInnerHTML;
                
    var scriptTagPattern  = /<script[^>]+>((\r|\n|.)*?)<\/script>/gi;
    var scriptCodePattern = /<script[^>]+>((\r|\n|.)*?)<\/script>/mi;
                
    var tags = s.match(scriptTagPattern);
    var code = "";

    for(var i = 0 ; i < tags.length;i++) {
        code += tags[i].match(scriptCodePattern)[1];
    }
                
    s = s.replace(scriptTagPattern,"");   // js_Code entfernen
                
    s = s.replace(/(\r|\n)/g,"");         // noch die Zeilenumbrüche entfernen
    s = s.replace(/(\s)(\1{2,})/gi,"$1"); // entstandene Leerzeichen entfernen die überflüssig sind
                
    return [s,code];
};

am Beispiel :
HTML:
<html>
    <head>
        <script type="text/javascript">
            function parseScript(sInnerHTML) {
                var s = sInnerHTML;
                
                var scriptTagPattern  = /<script[^>]+>((\r|\n|.)*?)<\/script>/gi;
                var scriptCodePattern = /<script[^>]+>((?:\r|\n|.)*?)<\/script>/mi;
                
                var tags = s.match(scriptTagPattern);
                var code = "";

                for(var i = 0 ; i < tags.length;i++) {
                    code += tags[i].match(scriptCodePattern)[1];
                }
                
                // Ergebnis Kosmetik
                s = s.replace(scriptTagPattern,"");   // js_Code entfernen
                
                s = s.replace(/(\r|\n)/g,"");         // noch die Zeilenumbrüche entfernen
                s = s.replace(/(\s)(\1{2,})/gi,"$1"); // entstandene Leerzeichen entfernen die überflüssig sind
                
                return [s,code];
            };
            
            window.onload = function () {
                var parsed = parseScript(document.getElementById('script_parser').innerHTML);
                alert(parsed[0]+"     "+parsed[1]);

                // eval(parsed[1]) würde nun js code ausführen sind aber 2 Funktionen
                // die aufgerufen müssten dann nochmal seperat
            };
        </script>
    </head>
    <body>
        <div id="script_parser">
            <script type="text/javascript">
                function hallo_welt(){
                    alert("hallo welt wie geht es dir");
                }
            </script>
            
            <div class="yellowbox">ich bin fett und gelb
                oo            
                <script type="text/javascript">
                function hallowelt(){
                    alert("hallo welt wie geht es dir");
                }
            </script>
            </div>
        </div>
    </body>
</html>
 
Zuletzt bearbeitet:
also speziell für DOJO gibt es eine einfache lösung: einfach den script-type "text/javascript" durch "dojo/method" ersetzen und es funktioniert problemlos. zumindest wenn der HTML-Code mit einer ContentPane nachgeladen wurde.
 

Neue Beiträge

Zurück