2012-03-26 17 views
0

die javascript: alarm Code, der dynamisch erstellt wird funktioniert nur, wenn ich die globale Objektreferenz verwenden, gvo_Z.dynamisch erstellt javascript verliert wert von DIESEM

Aber ich würde es vorziehen, verwenden entweder dieses (oder einen Proxy, um es wie lvo_this).

<div id = "target_div" ></div> 

<script language="javascript" type="text/javascript"> 
    function c_A() 
    { this.om_A = function() 
     { return "got it" ; 
     } ; 
    } ; 

    function c_Z() 
    { this.pvo_A = new c_A() ; 

     this.om_Z = function() 
     { 
      var lvo_this = this ; 

      var lvs_html = "<div onmousedown='javascript:alert(gvo_Z.pvo_A.om_A());' >press me ... WORKS ... uses global reference</div>" ; 
      lvs_html += "<div onmousedown='javascript:alert(lvo_this.pvo_A.om_A());' >press me ... does NOT work ... uses THIS reference</div>" ; 
      document.getElementById("target_div").innerHTML = lvs_html ; 
     } ; 
    } ; 

    var gvo_Z = new c_Z() ; 
    gvo_Z.om_Z() ; 
</script> 
+0

erstellen Sie brauchen nicht „javascript:“ am Anfang des Codes in einem „onfoo“ -Attribut. – Pointy

Antwort

0

eine Funktion zum erstellten Elemente hinzuzufügen. Sie Ihr Element mit einem Namensschild wie diese

<div id = "target_div" ></div> 

<script language="javascript" type="text/javascript"> 
    function c_A() 
    { this.pvs_test = "test" ; 
    } ; 

    function c_Z() 
    { this.pvo_A = new c_A() ; 

     this.om_Z = function() 
    { 
     var lvo_this = this ; 


     var lvs_html = "<div name='yourdiv'>press me ... does NOT work ... uses THIS reference</div>" ; 
     document.getElementById("target_div").innerHTML = lvs_html ; 
document.getElementsByName("yourdiv")[0].onclick = function() { 
alert(lvo_this.pvo_A.pvs_test); 
}; 
    } ; 
    } ; 

    var gvo_Z = new c_Z() ; 
    gvo_Z.om_Z() ; 
</script> 
1

Innerhalb des Gültigkeitsbereichs der Funktion this ist DOMWindow

dieses Versuchen Sie stattdessen:

function c_A() { 
    this.pvs_test = "test"; 
}; 

function c_Z() { 

    var self = this; 

    this.pvo_A = new c_A(); 
    this.om_Z = function() { 

     var lvo_this = self; 

     var lvs_html = "<div onmousedown='javascript:alert(gvo_Z.pvo_A.pvs_test);' >my div</div>"; 
     document.getElementById("target_div").innerHTML = lvs_html; 
    }; 
}; 

var gvo_Z = new c_Z(); 
gvo_Z.om_Z();​ 
0

Wenn Sie das Skript in der Zeichenfolge setzen, wird er ausgeführt wird, wenn es eingeführt wird, nicht mit der aktuelle Kontext. Dies ist zusätzlich zu den anderen Antworten, die korrekt sind, dass Sie Ihren "Proxy" außerhalb der om_Z() -Methode deklarieren müssen.

konstruieren Sie einfach das Skript, indem tatsächlich den relevent Ausdrucks sofort mit der Ausführung:

var lvs_html = "<div onmousedown='javascript:alert(" + lvo_this.pvo_A.pvs_test + ");' >my div</div>" ; 
+0

Bhamlin, danke für die Antwort ... das Beispiel, das ich gepostet habe, wurde vereinfacht ... in Wirklichkeit möchte ich nicht auf die einfache String-Prop von c_A zugreifen, sondern eher eine Methode von c_A ... Ich werde es bearbeiten, um es zu reflektieren . – dsdsdsdsd

+0

Dann können Sie nicht einfach das Skript als String auf das Element setzen, weil Sie jeglichen Kontext verlieren (und deshalb ein globales Objekt benötigen). Ziehen Sie in Betracht, die Aktion an das Element zu binden, nachdem Sie es eingefügt haben - dann sind Sie immer noch im Bereich Ihrer Methoden om_Z() (und c_Z()). – bhamlin

+0

vielleicht Bindung ist der Weg zu gehen ... – dsdsdsdsd

Verwandte Themen