Javascript JS对象内部的回调不处理JQuery事件

Javascript JS对象内部的回调不处理JQuery事件,javascript,jquery,jquery-ui-dialog,Javascript,Jquery,Jquery Ui Dialog,更新:在帮助下,我找到了问题所在。是if(!actions)对函数引用做了一些操作。删除“!”后,成功了。这是我的一个错误,因为我想首先检查它是否有引用。我的新问题是那是什么!运算符对函数执行什么操作,使其求值为true,然后更改引用,从而使函数失败(在这种情况下,未检测到调试器中的错误) 原件: 我创建了一个javascript函数,它封装了一些变量,并在单击jQueryUI对话框按钮时执行回调。下面是函数的javascript: function LoginControl(parentDiv

更新:在帮助下,我找到了问题所在。是if(!actions)对函数引用做了一些操作。删除“!”后,成功了。这是我的一个错误,因为我想首先检查它是否有引用。我的新问题是那是什么!运算符对函数执行什么操作,使其求值为true,然后更改引用,从而使函数失败(在这种情况下,未检测到调试器中的错误)

原件: 我创建了一个javascript函数,它封装了一些变量,并在单击jQueryUI对话框按钮时执行回调。下面是函数的javascript:

function LoginControl(parentDiv, usernameInput, passwordInput, action)
{
    var that = this;
    var container = parentDiv;
    var user = usernameInput;
    var password = passwordInput;
    var actions = action;

    that.init = function()
    {
        container.dialog(
            {
                modal:true,
                show:false,
                buttons: {"Login":Login, Cancel:Close }
            }
        );
    };

    var Login = function (evt) {
        if (!actions)
            actions();
    };

    var Close = function()
    {
        container.dialog("close");
        if(!actions)
            actions();
    };

    that.show = function(evt)
    {
        container.dialog("open");
    };
}
问题出在Login/Close函数中,它在该函数中执行actions函数。当它执行时,调试器向我发出以下警告:“忽略具有[LenientThis]的get或set属性,因为“this”对象不正确。”。未执行该函数。这是HTML(我省略了外部jquery源文件,但我使用的是jquery 2.0.3和jquery UI 1.1.3。我无法理解这一点,对此一直感到困扰。我尝试过使用“调用”、“绑定”和“应用”方法,但都没有用。请提供帮助和建议。谢谢

<html>
<head lang="en">
    <script type="text/javascript">
        function onAction()
        {
            alert("Hello!");
        }

        $(document).ready(function() {
            var loginCtrl = new LoginControl($("#login"), $("#username"), $("#pass"), onAction);

            loginCtrl.init();
            loginCtrl.show();
        });
    </script>
</head>
<body>
<div id="login">
    <form>
        <label for="username">User Name:</label> <input type="text" id="username" /><br>
        <label for="pass">Password:</label><input type="password" id="pass" />
    </form>
</div>
</body>
</html>

函数onAction()
{
警惕(“你好!”);
}
$(文档).ready(函数(){
var loginCtrl=新登录控制($(“#登录”)、$(“#用户名”)、$(#通过”)、onAction);
loginCtrl.init();
loginCtrl.show();
});
用户名:
密码:
您需要将
Login
Close
更改为
that.Login=
that.Close=
。它们当前是函数内部的变量,外部不可见。还需要将
按钮:{“Login”:Login,Cancel:Close}
更改为
按钮:{“Login”:that.Login,Cancel:that.Close}

这不起作用。产生了相同的结果。当我在调试器中检查actions变量时,它将其显示为一个函数。当它执行时,手表显示它的返回值为undefined,这是在您建议的更改之前已经执行的。出于好奇,我决定在LoginCo中创建onAction函数control函数,并调用它而不是actions变量。这很有效。但当我在init中将操作分配给onAction函数时,它又回到了原点。此时,我认为这是一个范围问题,但我忘记了如何纠正它。我忘了添加,您需要将
var actions=action;
更改为
that.actions=ac操作
,然后调用action作为
that.actions();
。您能将这些操作与答案中的更改一起尝试吗?我做了您建议的修改,但产生了相同的结果。您能将其复制粘贴到控制台并查看得到的结果吗?-->
函数f1(act){var that=this;that.acts=act;console.log(that.acts);that.callActs=function(){that.acts();}}};function f2(){console.log(“这里的f2”);}var f1=new f1(f2);f1.callActs();
@stn9000上一条注释中的代码有什么发现吗?