0


我似乎在使用addEventListener即时匿名函数内部时遇到了范围问题。

在事件侦听器内部,我正在创建一个在立即函数之外构造的 Javascript“类”实例(使用构造函数 and prototype)。

为了保持良好的实践,我想使用即时函数来避免全局变量,并addEventListener避免使用内联 Javascript(从而将其与 html 分开)。

那么我怎样才能在没有范围问题的情况下正确地做到这一点,这样做的好做法是什么?


这是我的html:

<html>
    <head>
        <title>asdf</title>
    </head>
    <body>
        <input type = "text" id = "userInput" />
        <input type = "button" id = "submitButton" value = "submit" />

            <script type = "text/javascript" src = "asdf.js" />
    </body>
</html>


...这是我的 Javascript asdf.js不起作用):

// constructor for object-oriented processing of the user input
function Statement(expression)
{
    this.expression = expression;
}
    // instance method
    Statement.prototype.checkSyntax = function()
    {
        var newExp = this.expression;

        return newExp;
    };

// immediate anonymous function
(function()
{   
    var submitButton = document.getElementById("submitButton");

    // event listener for the submit button
    submitButton.addEventListener("onclick", function(event)
    {
        var userInput = document.getElementById("userInput");

        // creating a new object with constructor above
        var expr = new Statement(userInput);

        // calling instance method of the "class" Statement
        alert(expr.checkSyntax() );

        // disable the button after first use
        event.stopImmediatePropagation();
    }, false);

})(); // end of immediate anonymous function
4

2 回答 2

1

我的 Javascript 不起作用

可能存在一些问题,但与(恕我直言不必要的)IEFE 无关:

  • addEventListener需要没有事件名称"on"- 这只是attachEvent.
  • 确保您的 JS 在创建 DOM 元素后执行 - 否则submitButtonnull
  • 我猜你想将一个字符串传递给Statement构造函数,而不是<input>DOM 节点 - 使用userInput.value
于 2013-01-11T03:18:31.857 回答
1

addEventListener接受一个像click, not的论点onclick。但是,较旧的 IEattachEvent需要onclick. 其他一切似乎都很好。

于 2013-01-11T03:15:24.697 回答