Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将JavaScript放在外部文件中。文件不存在';不管用?_.net_Javascript - Fatal编程技术网

.net 将JavaScript放在外部文件中。文件不存在';不管用?

.net 将JavaScript放在外部文件中。文件不存在';不管用?,.net,javascript,.net,Javascript,我在标题中有GridView和复选框,每行有一个: <asp:GridView runat="server"> <Columns> <asp:TemplateField> <HeaderTemplate> <input type="checkbox" onclick="checkAll(this.checked)" /> </HeaderTemplate> <ItemTempla

我在标题中有
GridView
复选框
,每行有一个:

<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>
如果我把它放在
标签中,它就会工作

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

如果我把函数放在文件中

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

它停止工作了!文件在根目录中,名称写得正确

我做错了什么

还有什么我可以改进我的功能吗


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

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

var grid = document.getElementById("<%= gridViewStatement.ClientID %>");
多亏了洛伦夫斯

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

正如洛伦夫所说。您可能可以更改您的ASPX,以便将网格的客户端id传递给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;
    }
}
<input type="checkbox"
  onclick='checkAll(this.checked, "<%= gridViewStatement.ClientID %>")' />

}

+1。与在
中将
ClientID作为参数传递相比,我更喜欢它,因为它将所有JavaScript保持在一起。唯一的问题是它污染了全局名称空间。我可以看到一些解决方案,例如
var serverValues={'gridViewStatement.ClientID':“”,'nextServer.Key':“”然后
var grid=document.getElementById(serverValues['gridViewStatement.ClientID'])服务器值映射的另一个好处是客户端代码现在可以更准确地反映服务器值的来源。当然,缺点是您已经将客户端映射键绑定到服务器端变量名,但原始代码也具有这种依赖性。好主意。我想我将从现在开始使用它,而不是在全局范围内有一个变量列表。谢谢
<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;
    }
}
<input type="checkbox"
  onclick='checkAll(this.checked, "<%= gridViewStatement.ClientID %>")' />
function checkAll(checked, gridId) {
  var grid = document.getElementById(gridId);
  ...
}