将JavaScript放在外部文件中。文件不起作用?

时间:2009-08-18 21:56:45

标签: .net javascript

我的标题中有GridView CheckBox,每行有另一个:

<asp:GridView runat="server">
<Columns>
<asp:TemplateField>
    <HeaderTemplate>
        <input type="checkbox" onclick="checkAll(this.checked)" />
    </HeaderTemplate>
    <ItemTemplate>
        <input name="checkSelect" type="checkbox" value='<%# Eval("ID") %>' />
    </ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

我想让master复选框(un)检查所有其他人。

所以我有JavaScript功能:

function checkAll(checked) {
    var grid = document.getElementById("<%= gridViewStatement.ClientID %>");
    for (i = 1; grid.rows.length - 1; i++) {
        grid.rows[i].getElementsByTagName("input")[0].checked = checked;
    }
}

如果我把它放在<script>标签内,它的作品

<script type="text/javascript" language="javascript">       
</script>

如果我把功能放在文件中

<script type="text/javascript" language="javascript" src="scripts.js"></script>

它停止工作!在根目录中输入,名称写得正确。

我做错了什么?

P.S。有什么我可以改进我的功能吗?

P.P.S。我使用HtmlCheckBox而不是asp:CheckBox,因为我将每个绑定到列'ID'并获取Request.Form中的ID列表。我是对的吗?

4 个答案:

答案 0 :(得分:4)

你的脚本扼杀了什么,恕我直言:

var grid = document.getElementById("<%= gridViewStatement.ClientID %>");

您正在混合服务器端和客户端代码。由于首先呈现服务器端代码,如果该行存在于ASPX页面内,则<%= gridViewStatement.ClientID %>的值会及时评估,以供JavaScript使用。通过将其放入稍后包含的文件中,您可以确保不会解释该值。

这是一个简短的解决方案:
在ASPX的顶部包括以下几行:

<script type="text/javascript" language="javascript">
    var gridID = "<%= gridViewStatement.ClientID %>";
</script>
<script type="text/javascript" language="javascript" src="scripts.js"></script>

将函数的第一行更改为:

var grid = document.getElementById(gridID);

答案 1 :(得分:2)

您的脚本包含一个引用gridViewStatement.ClientID,它在asp.net页面上作为内联脚本进行评估。如果你把它放在一个外部文件中,这将不会被评估,并且该脚本文本将在客户端的javascript文件中,这不会起作用,因为它没有正确的id

答案 2 :(得分:1)

感谢LorenVS !!

<input type="checkbox" onclick="checkAll('<%= gridViewStatement.ClientID %>', this.checked)" />

function checkAll(grid, checked) {
    var grid = document.getElementById(grid);
    for (i = 1; grid.rows.length - 1; i++) {
        var row = grid.rows[i];
        row.getElementsByTagName("input")[0].checked = checked;
    }
}

答案 3 :(得分:1)

正如LorenVS所说。您可以更改ASPX,以便将网格的客户端ID传递给javascript函数:

<input type="checkbox"
  onclick='checkAll(this.checked, "<%= gridViewStatement.ClientID %>")' />

然后更改您的函数以将网格的客户端ID作为参数:

function checkAll(checked, gridId) {
  var grid = document.getElementById(gridId);
  ...
}

}