Javascript Variablen über Laufzeit speichern ?
Nocturn
- javascript
Moin Moin,
ich versuche momentan festzustellen, ob ein jQuery-PlugIn-Fenster mit dem Namen "Name" geöffnet ist.
Dafür rufe ich querer.run() bei einem OnClick Ereignis auf.
Nun wird beim Aufruf jedesmal beim ersten alert "undefiened" zurückgegeben und beim zweiten das Window-Objekt. Wie kann ich in Javascript dafür sorgen, das beim OnClick die Variable this.windows dauerhaft mit dem Objekt belegt ist und nicht jedesmal wieder durch new windowManager() und this.windows = new Array() ; geleert wird ?
function querer() {
var module ;
var action ;
this.run = function ()
{
this.action = action ;
this.module = module ;
this.windowManager = new windowManager() ;
this.windowManager.openWindow( "#workbench" ) ;
}
}
function windowManager ()
{
this.windows = new Array() ;
this.openWindow = function (bindto) {
alert ( this.windows["name"] ) ;
if ( typeof this.windows["name"] != "object" ) {
this.windows["name"] = jQuery(bindto).window({
x:50,
y:50,
title: "name",
checkBoundary: true
});
}
alert ( this.windows["name"] ) ;
}
}
Hi,
function querer() {
var module ;
var action ;this.run = function ()
{
this.action = action ;
this.module = module ;
Dir ist klar das this.action und this.module nicht die oben mit var definierten Variablen sind?
~~~javascript
> function windowManager ()
> {
> this.windows = new Array() ;
>
> this.openWindow = function (bindto) {
> alert ( this.windows["name"] ) ;
> if ( typeof this.windows["name"] != "object" ) {
> this.windows["name"] = jQuery(bindto).window({
> x:50,
> y:50,
> title: "name",
> checkBoundary: true
> });
> }
> alert ( this.windows["name"] ) ;
> }
> }
this.windows ist so bei jeder Instanz die du mit new windowManager anlegst eine extra Variable.
Du möchtest nun über alle Instanzen von windowManager _ein_ Array windows haben, richtig?
Das würde ich wie folgt umsetzen:
var windowManager = (function(){ // Eine anonyme Funktion, eigentlich nur um ein extra Variablen-Scope zu erhalten in dem "windows" ist.
var windows = [], // new Array() ist unnötig
object = function(){} // Das eigentliche Objekt. Hat keine Konstruktor-Logik, daher leerer Function-Body
;
object.prototype.openWindow = function(bindto){ // Methoden des Objekts nicht über this.[MethodenName] im Function-Body erzeugen, da diese so für jede Instanz einzeln abgelegt werden. Über .prototype angelegte sind nur einmal vorhanden.
[…]
}
return object; // Das objekt zurückgeben. somit wird windowManager dieses Objekt zugewiesen
})()
~~~ // direkter Aufruf der anonymen Funktion
Wie kann ich in Javascript dafür sorgen, das beim OnClick die Variable this.windows dauerhaft mit dem Objekt belegt ist und nicht jedesmal wieder durch new windowManager() und this.windows = new Array() ; geleert wird ?
Indem du nicht jedes Mal einen neuen windowManager erzeugst. Wenn du den Code an dieser Stelle nicht ausführen willst, dann schreibe ihn nicht dorthin. ;)
Beim Erzeugen eines windowManagers initialisierst du ihn mit einer leeren Liste. Wenn du immer neue windowManager-Instanzen erzeugst, bekommst du immer wieder eine neue, leere Fensterliste.
function querer() {
var module ;
var action ;
Sollten diese Variablen nicht eher Parameter der querer-Konstruktorfunktion sein?
this.run = function ()
{
this.action = action ;
this.module = module ;
Wo bekommen action und module Werte zugewiesen?
this.windowManager = new windowManager() ;
Anscheinend willst du eher folgendes:
if (!this.windowManager) {
this.windowManager = new windowManager();
}
Sonst wird der vorhandene windowManager immer wieder mit einem neuen, leeren überschrieben.
Alternative: Du erzeugst this.windowManager *einmal* bereits im querer -Konstruktor, nicht erst in der run-Methode. Die run-Methode greift dann nur auf den vorhandenen windowManager zu.
(Dann musst du die querer-Instanz aber auch wiederverwenden.)
function windowManager ()
{
this.windows = new Array() ;
Dies ist kein Array, sondern ein Hash. Lies dir mal <http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arrays@title=assoziative Arrays (gibt es in JavaScript nicht)> durch.
Du solltest hier besser ein Object-Literal {} verwenden.
Mathias