JavaScript - 'this.form'返回undefined

时间:2013-05-29 18:52:49

标签: javascript jquery asp.net this undefined

我正在尝试更改网站部分功能。 目前,我有一个在我的表之外的验证按钮。只要用户点击该按钮,就会发生验证。

但是,我正在改变它,以便删除Validate按钮,并将功能移动到位于表内的Link Button。

以下是我的代码:

<table width="100%" cellpadding="4">
<tr>
    <td valign="top">
        //something else here
    </td>
    <td valign="top" align="right">
        <asp:GridView ID="myGridView" runat="server" OnRowDataBound="myGridView_RowDataBound">
        <Columns>
            <asp:TemplateField HeaderText="Column 1">
                <ItemTemplate>
                    // some control
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Column 2">
                <ItemTemplate>
                    // some control
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Column 3">
                <ItemTemplate>
                    // some control
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Column 4">
                <ItemTemplate>
                    <asp:LinkButton ID="lbValidate" runat="server" Text="Validate" OnClientClick="return MyValidation__Submit(this.form)" CausesValidation="true" OnClick="btnValidate_Click"></asp:LinkButton>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        </asp:GridView>
    </td>
</tr>
</table>    
<div style="margin:10px 0px 10px 0px;">
    <asp:Button ID="btnValidate" runat="server" Text="Validate" OnClientClick="return MyValidation__Submit(this.form)"  CommandArgument="Save" CausesValidation="true" OnClick="btnValidate_Click" />
</div>

以下是进行验证的JavaScript块示例:

<script type="text/javascript">
    function MyValidation__Submit(formName) {
        alert("Test   :" + formName);
        // do validations

        var joForm = document.getElementById(formName.id);

        for (var i = 0; i < joForm.elements.length; i++) {
            // do something
        }

        return true;
    }
 </script>

单击“验证”按钮但在LinkBut​​ton上没有时,这非常有效。 为了测试它,我必须放alert("Test :" + formName);行。每当我触发Validate按钮时,系统警报返回一个字符串值“[object HTMLFormElement]”,我认为这是正常的,因为它按照我想要的方式运行。但是,当我尝试触发驻留在表中的Validate LinkBut​​ton时,系统警报返回“undefined”,使我的整个验证代码无用。

有人可以指出我在这里缺少什么吗?我猜它与控件的层次结构有关,因为这是唯一改变的。

谢谢!

修改

这是我能走的最远,但我仍然无法进入表格。 这个返回HTMLDivElement

<asp:LinkButton ID="lbValidate" runat="server" Text="Validate" OnClientClick="return MyValidation__Submit(this.parentNode.parentNode.parentNode.parentNode.parentNode)" CausesValidation="true" OnClick="btnValidate_Click"></asp:LinkButton>

是的,你看对了。它有5 .parentNode

2 个答案:

答案 0 :(得分:0)

我的ASP知识有点简陋,但我相信这是因为当您使用“this.form”作为按钮时,“this”的范围是文档对象。但是当用于LinkBut​​ton时,“this”的范围是GridView。如果您要移动触发器项目,也许最好设置更明确地传递给javascript函数的formName。

答案 1 :(得分:0)

[edit]接受的答案是最后一个例子

你说你正在使用jQuery,所以如果你在页面上只有一个表单元素,为什么不呢?

<script type="text/javascript">
    function MyValidation__Submit() {
        // do validations
        var joForm = $('form').eq(0);
        for (var i = 0; i < joForm.elements.length; i++) {
            // do something
        }
        return true;
    }
 </script>

即使您有多张表格,也可以

<script type="text/javascript">
    function MyValidation__Submit(obj) {
        // do validations
        var joForm = $(obj).parents('form').eq(0);
        for (var i = 0; i < joForm.elements.length; i++) {
            // do something
        }
        return true;
    }
 </script>

并将其命名为

OnClientClick="return MyValidation__Submit(this)"

没有jQuery ,您可以恢复为getElementsByTagName()

<script type="text/javascript">
    function MyValidation__Submit() {
        // do validations

        // getElementsByTagName("form") searches for any <form> elements on the page and returns an array of elements
        // the [0] then selects the first one in the array that was found
        // as long as you've only got one form on the page this should work
        var joForm = document.getElementsByTagName("form")[0];

        for (var i = 0; i < joForm.elements.length; i++) {
            // do something
        }
        return true;
    }
 </script>