存储的上下文在JQuery变量中不起作用

时间:2010-06-18 16:40:31

标签: jquery jquery-selectors

以下工作正常:

    $(function() {
        EnableDisableButtons();
        $('#TextBox1').keyup(function() {
            EnableDisableButtons();
        });
    });

    function EnableDisableButtons() {
        var len = $('#TextBox1').val().length;
        if (len == 0) {
            $("#Button1").attr("disabled", "disabled");
        }
        else {
            $("#Button1").attr("disabled", "");
        }
    }

但以下内容根本不起作用:

    var txt = $('#TextBox1');

    $(function() {
        EnableDisableButtons();
        txt.keyup(function() {
            EnableDisableButtons();
        });
    });

    function EnableDisableButtons() {
        var len = txt.val().length;
        if (len == 0) {
            $("#Button1").attr("disabled", "disabled");
        }
        else {
            $("#Button1").attr("disabled", "");
        }
    }

它抛出的错误是“'txt.val()。length'为null或不是对象”。任何人都可以帮助我。

感谢

3 个答案:

答案 0 :(得分:4)

var txt = $('#TextBox1');

这必须进入$()调用中的函数。否则,您在DOM准备好之前尝试选择文本框。

答案 1 :(得分:3)

由于<script>块位于<head>标记中,因此在解析文档之前它正在执行。

因此,当您编写txt = $('#TextBox1')时,文本框实际上还不存在。

要解决此问题,您需要在文档加载后设置txt变量(在#(function() { ... })内。

例如:

var txt;

$(function() {
    txt = $('#TextBox1');

    EnableDisableButtons();
    txt.keyup(function() {
        EnableDisableButtons();
    });
});

TextBox1看起来像ASP.Net服务器端控件 如果是这样,您应该将$('<%= TextBox1.ClientID %>, since ASP.Net assigns its own unique IDs to server-side controls. Alternatively, in ASP.Net 4.0, you can add ClientIDMode =“Static”替换为文本框。

此外,您应该为文本框指定一个有意义的名称。

答案 2 :(得分:1)

执行var txt = $('#TextBox1');时,该元素尚不存在(DOM未完全加载)。

执行:

var txt;

$(function() {
    text = $('#TextBox1');
    EnableDisableButtons();
    txt.keyup(function() {
        EnableDisableButtons();
    });
});

或将脚本放在HTML文档的末尾。

传递给$()的函数在加载DOM时执行,即所有元素都存在。实际上,这样做的目的是确保您可以访问的所有元素都在那里。