2009-06-15 9 views
1

Ich versuche, ein Widget-Framework mit jQuery einzurichten, also muss ich Java-Skript importieren, indem ich das Widget xhtml analysiere und in die Framework-Seite einfüge. Das Problem ist, dass dies zu einer Verschmutzung des Namensraums führen kann. Ist es möglich, Java-Script zur Laufzeit in einen Namespace zu laden?Importieren Sie Javascript dynamisch mit jQuery?

Vielleicht gibt es eine bessere Methode, die ich übersehe?

Danke, Pete

Antwort

1

AS Josh Stodola zur Laufzeit die Erstellung der Variable erwähnt ist nicht das Problem

var holdsWidgetUUID = "widgetUUIDValue"; 
eval(holdsWidgetUUID + "= (" + data + ")"); 
alert(eval(holdsWidgetUUID)); 

Oder wenn Sie bevorzugen

var UUID = "widgetUUID"; 
var holdsWidgetUUID = "widgetUUIDValue"; 
window["widgets"] = new Array(); 
window["widgets"][holdsWidgetUUID] = data; 
alert(window["widgets"][holdsWidgetUUID]); 

Das Problem das geladene JavaScript ist immer ein wie dynamicvariablename.methodname aufrufbar zu arbeiten sein()

ich eine funktionierende Lösung, wenn Sie eine bestimmte Codierung der Praxis auf dem im Lieferumfang enthaltenen Javascript erzwingen. Vielleicht bringt dich das in die richtige Richtung.

Dies ist ein Widgets Javascript (works.js). Beachten Sie, dass es sich um eine Javascript- "Klasse" mit intern definierten Feldern und Methoden handelt. Welche von selbst hält Namespace Verschmutzung gering und ermöglicht es uns, die die gewünschte Form Aufruf x.getInfo erreichen()

function() { 
    this.type = 1; 
    this.color = "red"; 
    this.getInfo = function() { 
     return this.color + ' ' + this.type + ' widget'; 
    }; 
} 

Und das ist die Datei, die zur Laufzeit in einem Namespace

<html> 
<head> 
    <title>Widget Magic?</title> 
    <script type='text/javascript' src='jquery.js'></script> 
    <script type='text/javascript'> 
    var UUID = "widgetUUID"; 
    var holdsWidgetUUID = "widgetUUIDValue"; 
    window["widgets"] = new Array(); 
    $.get("works.js", function(data) { 
     window["widgets"][holdsWidgetUUID] = eval("(" + data + ")"); 
     $(document).ready(function() { 
     window["widgets"][holdsWidgetUUID] = new (window["widgets"][holdsWidgetUUID])(); 
     alert(window["widgets"][holdsWidgetUUID].color); 
     alert(window["widgets"][holdsWidgetUUID].getInfo()); 
     }); 
    }); 
    </script> 
</head> 
<body> 
    <p>Just some stuff</p> 
</body> 
</html> 
+0

Diese Erklärung hat mir enorm geholfen, danke! Diese Methode ist großartig für mich, da ich die Widget-API angeben kann. – slypete

-2

Die Javascript Sie laden, sollte sich eindeutige Namespaces verwenden bereits.

+1

Im Idealfall enthält. Und der Himmel sollte auch grün sein. Aber es ist nicht. Dies ist keine sehr hilfreiche Antwort! –

1

Sie können so etwas tun ...

var myOtherFramework = null; 

$.get("myScript.js", function(data) { 
    myOtherFramework = eval("(" + data + ")"); 
}); 

Und dann darauf verweisen, wie ...

myOtherFramework.funcName(); 
+0

Das ist eine Art von was ich tue; Es wird jedoch nicht funktionieren, da ich den Namen des var myOtherFramwork zur Laufzeit definieren muss. Zum Beispiel muss der Namespace des Javascript die UUID der Widget-Instanz sein. Das weiß ich leider erst zur Laufzeit. – slypete

+0

Nun, das ist so einfach: eval ("placeUUIDhere = (" + data + ")"); –

Verwandte Themen