2012-03-26 3 views
0

в JavaScript: предупреждение кода, который в настоящее время создается динамически работает только, если я использую глобальную ссылку на объект, gvo_Z.динамически созданное Javascript теряет значение этого

Но я предпочел бы использовать либо это (или прокси к ней, такие как 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

Вам не нужно «JavaScript:» в начале кода в «onfoo» атрибута. – Pointy

ответ

0

добавить функцию в свой созданный элемент. вы можете создать свой элемент с именем тега, как этот

<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

Внутри области видимости функции this является DOMWindow

Попробуйте вместо этого:

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

Если поместить скрипт в строку, он будет выполнять, когда она вставлена, а не с текущий контекст. Это в дополнение к другим ответам, которые правильны, что вам нужно объявить свой «прокси» вне метода om_Z().

Просто построить сценарий на самом деле выполнения Релевент выражение сразу:

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

bhamlin, спасибо за ответ ... пример, который я опубликовал, был упрощен ... на самом деле я не хочу получить доступ к простой строковой опоре c_A, а скорее к методу c_A ... Я отредактирую его, чтобы отразить его , – dsdsdsdsd

+0

Тогда вы не можете просто поместить скрипт в элемент как строку, потому что вы теряете весь контекст (и, следовательно, требуете глобального объекта). Рассмотрите возможность привязки действия к элементу после его вставки - тогда вы все равно будете входить в свои методы om_Z() (и c_Z()). – bhamlin

+0

Возможно, привязка - это путь ... – dsdsdsdsd

Смежные вопросы