3

我想在 DOM 完全加载后为对象设置值。OnBlur问题是,在从文本框中调用一个和OnFocus事件后,我得到一个空指针异常。我究竟做错了什么?

javascript:

$(document).ready(function () {
    var sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last()
});

var tempThursdayHrs = 0.0;
function BlurThursdayHrs(sender, args) { sumThursdayHrs.text(tempThursdayHrs + sender.get_value()); }
function FocusThursdayHrs(sender, args) { tempThursdayHrs = sumThursdayHrs.text() - sender.get_value(); }

标记:

<telerik:RadNumericTextBox ID="txtThursdayHrs" runat="server" NumberFormat-DecimalDigits="1"
        Width="25px" MinValue="0" Type="Number" DbValue='<%# Eval("ThursdayHrs") %>'>
        <ClientEvents OnBlur="BlurThursdayHrs" OnFocus="FocusThursdayHrs" />
</telerik:RadNumericTextBox>

错误:

Microsoft JScript 运行时错误:“sumThursdayHrs”未定义

4

4 回答 4

3

正如您在标题中所说,这些值是在一个函数中设置的(准备好的事件处理函数)。但是 JavaScript 具有函数作用域,并且当您sumThursdayHrs使用var关键字声明为本地(不是说“私有”)变量时,它在外部是未定义的。两种可能:

  • 使 sumThursdayHrs 成为全局变量(删除“var”)(并最终在外部声明它)。请注意,应尽可能避免使用全局变量,以防止命名冲突和 co
  • 或将所有使用它的函数置于同一范围内。当心,那么这些函数也将不再全局可用,因此您需要在相同的上下文中设置模糊/焦点处理程序(正如 Patrick Scott 建议的那样)。
于 2012-04-17T21:15:57.683 回答
2

如果您已经在使用 jquery,为什么不将事件与 jquery 绑定?

$('span[id$="txtThursdayHrs"]:first').on("focus", FocusThursdayHrs)
          .on("blur", BlurThursdayHrs);

另外,在 doc ready 函数中声明这些函数,这样他们就可以sumThursdayHrs在同一个地方访问或使用匿名函数,而不是调用函数

前任:

$(document).ready(function () {
    var sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last();
    var tempThursdayHrs = 0.0;
    $('span[id$="txtThursdayHrs"]:first').on("focus", function() {
        sumThursdayHrs.text(tempThursdayHrs + $(this).val());
    })
    .on("blur", function() {
        tempThursdayHrs = sumThursdayHrs.text() - $(this).val();
    });
});

或者移动sumThursdayHrs到一个全局对象......为了理智,我建议不要把它放在窗口中。

而是定义一个全局命名空间来保存您的应用程序特定的全局变量。这称为全球减排。

前任。

var MyApp = {};
$(document).ready(function () {
    MyApp.sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last();
    //...

--

MyApp.tempThursdayHrs = 0.0;
function BlurThursdayHrs(sender, args) { MyApp.sumThursdayHrs.text(MyApp.tempThursdayHrs + sender.get_value()); }
function FocusThursdayHrs(sender, args) { MyApp.tempThursdayHrs = MyApp.sumThursdayHrs.text() - sender.get_value(); }
于 2012-04-17T21:05:41.010 回答
1

该错误是由于范围界定:

$(document).ready(function () {
    // sumThursdayHrs is a *local* variable to the function
    var sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last()
});

// ... so this will fail because it is trying to use
// window.sumThursdayHrs (the property sumThursdayHrs on the window object),
// which is not set and thus the Reference Error
function BlurThursdayHrs(sender, args) {
    sumThursdayHrs.text(tempThursdayHrs + sender.get_value());
}

“简单修复”(可能有效也可能无效)是:

$(document).ready(function () {
    // Set the "global variable" sumThursdayHrs
    // "window." isn't technically required, but it is to show a point.
    window.sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last()
});

快乐编码。

于 2012-04-17T21:14:50.807 回答
0

我不确定您提供的代码示例是否在同一个包中,但如果您在 中定义了一个变量$(document).ready(),请知道该变量在闭包内。在它之外,它将是未定义的。

那么为什么不这样做:

$(document).ready(function () {
    var sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last();

    var tempThursdayHrs = 0.0;

    function BlurThursdayHrs(sender, args) {
        sumThursdayHrs.text(tempThursdayHrs + sender.get_value());
    }

    function FocusThursdayHrs(sender, args) {
        tempThursdayHrs = sumThursdayHrs.text() - sender.get_value();
    } 
});

在上面的代码中,它应该获取您想要的值,因为一切都在$(document).ready()闭包内。此外,您已将一个 jquery 对象 , 分配给$('span[id*="lblThursdayHrs"]')一个变量,因此它必须在 jquery 环境内部而不是外部使用... 总之一句话,如果您使用的是 jquery,请将其保留在 jquery 环境中。

你所做的是,你已经与 jquery 签订了一份合同,你将通过var sumThursdayHrs = $('span[id*="lblThursdayHrs"]').last(). 一旦你使用$(something)了,就是这样,它必须在jquery环境中使用。

于 2012-04-17T21:27:15.377 回答