HTA Javascript - почему объект находится вне области действия в onbeforeunload? - PullRequest
0 голосов
/ 14 января 2012

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

<!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>

1 Ответ

1 голос
/ 14 января 2012

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);
...
...