Ошибка JavaScript при использовании этого на объекте - PullRequest
0 голосов
/ 06 июня 2011

На моей странице отображается окно с подтверждением.

Если я выберу Да, метод Method1 запускается, но генерируется ошибка о том, что у объекта [Object DOMWindow] нет метода «Method2».

Как я могу решить эту проблему?

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Testes Javascript O.O.</title>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.css" /> 
<link type="text/css" href="http://dev.jtsage.com/cdn/simpledialog/latest/jquery.mobile.simpledialog.css" rel="stylesheet" /> 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script> 
<script type="text/javascript" src="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.js"></script> 
<script type="text/javascript" src="http://dev.jtsage.com/cdn/simpledialog/latest/jquery.mobile.simpledialog.js"></script>
<script type="text/javascript">
var vssMkt = {};

var MsgBoxSimNao = function (parMensagem, parFuncaoSim, parFuncaoNao) {
    /// <sumary>Abre uma caixa de dialogo com uma mensagem e um botao de Sim e outro de Nao.</sumary>
    /// <param name="parMensagem" type="String">Mensagem a ser exibida.</param>
    /// <param name="parFuncaoSim" type="Function">Funcao a ser executada quando clicar no Sim.</param>
    /// <param name="parFuncaoNao" type="Function">Funcao a ser executada quando clicar no Nao.</param>
    $(this).simpledialog({
        'mode': 'bool',
        'prompt': parMensagem,
        'useDialogForceFalse': true,
        'buttons': {
            'Yes': {
                click: parFuncaoSim // Callback func if I press Yes
            },
            'No': {
                click: parFuncaoNao // Callback func if I press No
            }
        }
    })
}

var Obj1 = function () {
    this.Method1 = function () {
        MsgBoxSimNao("Show message?",
            this.Msg1,
            this.Msg2
        );
    }

    this.Method2 = function () {
        alert('Method 2');
    }

    this.Msg1 = function (parMsg) {
        alert('Yes');
        this.Method2();
    }

    this.Msg2 = function () {
        alert('No');
    }
}

function onLoad() {
    vssMkt.test = new Obj1();
    $("#link").click(function () {
        vssMkt.test.Method1();
    });
}

</script>
</head>

<body onLoad="onLoad();">
<div data-role="page">
  <div data-role="header">
    <h1>Javascript error</h1>
  </div>
  <!-- /header -->
  <div data-role="content">
  <a id="link" href="#" data-role="button">Start test</a>
  </div>
  <!-- /content --> 
</div>
<!-- /page -->
</body>
</html>

Ответы [ 3 ]

0 голосов
/ 06 июня 2011

это в javascript не так хорошо определено, как в других языках.это не всегда означает объект, владеющий объектом, это обычно означает текущий вызывающий объект.Так что в этом случае, поскольку он вызывается из глобальной области видимости, он получает глобальный объект, который в JS является окном.

Если вы в порядке, принимая зависимость от функций ES5, вы можете просто изменить Method1, чтобы передать this.Msg1.bind (this), this.Msg2.bind (this).Если вам нужна устаревшая поддержка, я считаю, что либо JQuery, либо плагин JQuery предоставляют идентичные функциональные возможности.

Я не уверен, но я также думаю, что передача функции () {this.Msg1 ()} вместо this.Msg1 также закроется и правильно вызовет функцию.

0 голосов
/ 06 июня 2011

Отредактировано

Извините, первый ответ был неверным.

Ваша проблема в конструкторе.Поскольку вы передаете методы другим функциям для их вызова, они должны хранить ссылку на экземпляр в закрытии.

> var Obj1 = function () {
>     this.Method1 = function () {
>         MsgBoxSimNao("Show message?",
>             this.Msg1,
>             this.Msg2
>         );
>     }

Чтобы сохранить ссылку на экземпляр, измените его на:

var Obj1 = function () {

    // Reference to the instance
    var obj = this;

    this.Method1 = function () {
        MsgBoxSimNao("Show message?",
            this.Msg1,
            this.Msg2
        );
    }

В вызове у вас есть:

>     this.Method1 = function () {
>         MsgBoxSimNao("Show message?",
>             this.Msg1,
>             this.Msg2
>         );
>     }

, поэтому this.Msg1 и this.Msg2 передаст ссылки на эти функции, когда Method1 вызывается.Когда они вызываются из MsgBoxSimNao , они вызываются без какой-либо квалификации, поэтому когда Msg1 вызывается:

>     this.Msg1 = function (parMsg) {
>         alert('Yes');
>         this.Method2();
>     }

в функции this установлен на глобальный объект.Измените метод, чтобы сохранить ссылку на экземпляр:

this.Msg1 = function (parMsg) {
    alert('Yes');
    obj.Method2();
}

obj ссылается на экземпляр, и будет вызван его Method2 .Есть и другие способы сделать это, но это самый простой (для меня в любом случае).

Не проверено, но должно работать.

0 голосов
/ 06 июня 2011

Посмотрим, решит ли это проблему:

var Obj1 = function () {
    Method1 : function () {
        MsgBoxSimNao("Show message?",
            this.Msg1,
            this.Msg2
        );
    },

    Method2 : function () {
        alert('Method 2');
    },

    Msg1 : function (parMsg) {
        alert('Yes');
        this.Method2();
    },

    Msg2 : function () {
        alert('No');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...