2012-01-13 2 views
0

Это немного странно. Я пытаюсь вызвать функцию в дочернем объекте из родительского объекта, но, похоже, выходит за пределы области в функции onbeforeunload. Эти вызовы функций работают за пределами onbeforeunload, поэтому он только терпит неудачу при вызове onbeforeunload. Я могу исправить это, сделав объект child глобальным, но я пытался избежать этого. Кто-нибудь знает, почему мой дочерний объект выходит из области действия при вызове onbeforeunload? Заметьте, что я вызываю ту же самую функцию в событии onload windows, и она работает нормально. Вот код:HTA Javascript - почему объект не доступен в onbeforeunload?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 

<head> 
<title>Broken HTA</title>  
<HTA:APPLICATION 
ID="Broken HTA" 
APPLICATIONNAME="Broken HTA" 
BORDERSTYLE = "flat" 
CAPTION="Yes" 
CONTEXTMENU = "no" 
INNERBORDER = "no" 
MAXIMIZEBUTTON = "no" 
MINIMIZEBUTTON = "yes" 
NAVIGABLE = "No" 
SCROLL = "auto" 
SCROLL FLAT = "Yes" 
SELECTION="no" 
SYSMENU="yes" 
SHOWINTASKBAR="yes" 
SINGLEINSTANCE="yes" 
VERSION = "1.0" 
BORDER="thick" 
> 



<script language="javascript" type="text/javascript"> 

var myparent; 

function windowLaunch() 
{ 
    myparent = new parent(); 
    myparent.getchildvalue(); 
    window.onbeforeunload = myparent.getchildvalue; 
    window.resizeTo(500, 610); 
} 

function parent() 
{ 
    this.mychild = new childobject("myinput"); 
    this.getchildvalue = function() 
    { 
     var tmpval = this.mychild.returnvalue(); 
    }; 

} 

function childobject(thename) 
{ 
    this.myprop = thename; 
    this.returnvalue = function() 
    { 
     return (document.getElementById(this.myprop).value); 
    }; 
} 

</script> 
</head> 

<body id="thebody" onload="windowLaunch();"> 
<div id="outerdiv"> 
     <span title="This Input Box">My Input:</span><br /> 
     <input id="myinput" style="width: 290px"/> 
</div> 
</body> 

</html> 
+0

Я сделал некоторые испытания, это не связано с ОМТ, ошибка возникает также со стандартным html-документом. – user1148592

ответ

1

this основан на том, как называется функцией. Вызов myparent.getchildvalue() в порядке, но как только вы назначите myparent.getchildvalue в качестве обработчика, он будет называться вне контекста. Продемонстрировать это можно просто:

var obj = { val: 42, fn: function(){ alert(this.val) } }; 
    ref = obj.fn; 

alert(obj.fn === ref); // true, so expect the following to do the same thing... 

obj.fn(); // 42, so far so good 
ref(); // undefined. uh oh... 

Вы можете обойти эту проблему, обернув:

... 
window.onbeforeunload = function(){ myparent.getchildvalue(); }; 
... 

или связывание:

... 
window.onbeforeunload = myparent.getchildvalue.bind(myparent); 
... 
+0

Как и http://stackoverflow.com/questions/8656774/why-this-is-not-point-to-js-global-scope-in-the-code-example/8656817#8656817 – davin

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