0

在我后面的代码中,我有 -

tbWhatIfBeginDate.Attributes.Add("onchange", "checkDates(" + tbWhatIfBeginDate.ClientID + ", " + tbWhatIfEndDate.ClientID + ")");
tbWhatIfEndDate.Attributes.Add("onchange", "checkDates(" + tbWhatIfBeginDate.ClientID + ", " + tbWhatIfEndDate.ClientID + ")");

这是我的javascript函数-

function checkDates(BeginDateId, EndDateId) {
    if (BeginDateId.value > EndDateId.value) {
        var beginDt = new Date(BeginDateId.value);
        var endDt = new Date(EndDateId.value);

        var newDt = new Date(endDt.getTime() - (24 * 60 * 60 * 1000));

        var y = newDt.getFullYear(),
        m = newDt.getMonth() + 1, // january is month 0 in javascript     
        d = newDt.getDate();

        BeginDateId.value = [pad(m), pad(d), y].join("/");
    }
}

当我通过 Visual Studio 2010 运行时,它可以工作。

当我部署到我的测试服务器时,我收到一条错误消息。“预期对象 - 行:176,字符:1”

第 176 行是 - 输入名称="ctl00$cpMain$tbWhatIfBeginDate" type="text" value="8/1/2012" id="ctl00_cpMain_tbWhatIfBeginDate" onchange="checkDates (ctl00_cpMain_tbWhatIfBeginDate, ctl00_cpMain_tbWhatIfEndDate)" style="width:70px; "

我没有看到错误。

想法?

4

2 回答 2

2

您将 HTML 元素的 id 传递给函数,它们是字符串,但您传递它时不带引号,就好像它是一个已定义的变量一样。在onClick范围内,还没有ctl00_cpMain_tbWhatIfBeginDate定义这样的变量,所以你得到了一个 javascript 错误。这是意料之中的——你还没有声明这样的变量。

在您的函数中,您立即尝试将这些参数视为对象,但同样,您传入了undefined因为具有指定名称的变量不存在。他们也不应该!当您尝试通过 id 引用 DOM 节点时,您必须使用getElementByIdfrom the documentobject 来“获取”相关对象。那么,ID 只是字符串。

因此,您应该传递那些用引号括起来的字符串。为此,您需要修改添加事件的两行:

tbWhatIfBeginDate.Attributes.Add("onchange", "checkDates('" + tbWhatIfBeginDate.ClientID + "', '" + tbWhatIfEndDate.ClientID + "')");
tbWhatIfEndDate.Attributes.Add("onchange", "checkDates('" + tbWhatIfBeginDate.ClientID + "', '" + tbWhatIfEndDate.ClientID + "')");

这样,字符串 id 就会传递给您的函数。然后,需要修改您的函数以根据传递的 id 获取 DOM 对象:

function checkDates(BeginDateId, EndDateId) {
    beginDate = document.getElementById(BeginDateId);
    endDate = document.getElementById(EndDateId);
    if (!beginDate || !endDate)
        return; // <--- add an error message here?
    if (beginDate.value > endDate.value) {
        var beginDt = new Date(beginDate.value);
        var endDt = new Date(endDate.value);
        // existing logic here
    }
}

文档

于 2012-06-18T19:21:45.743 回答
0

你是在 Cassini 服务器和 2003 机器之间来回切换吗?MS 将控件命名更改为 IIS 7 / VS 的最新版本。我会检查您的控件的实际变量名称在呈现的 HTML 中是什么。

于 2012-06-18T19:17:21.973 回答