×××××二个简单的js问题××××××

jimu8130 2007-06-22 10:10:17
原以为一点基础的getElementById就可以横行天下了,结果...

废话不说,直接说问题了。
问题描述:
1 看到几行代码
form1.action.value = "delete";
form1.submit();
这是一个按钮的单击前台引发的事件,而且它也有其服务器端单击事件。我查了下,一般都是用form1.action=""来设置要提交到的页面,但是这段代码究竟是什么意思了?
2 相信大家都看到过checkbox和gridview进行多个记录删除,问题一的代码就是这个问题所属代码的一部分。不过我看了下整体的代码,除了用到selectItem=document.getElementById("selectItem")---这个是gridview模版列中itemtemplate的html checkbox的id,其checkbox的value和每条记录的id绑定了,这句js应该是取的所有checkbox的集合,其他地方未对该集合进行操作了,于是乎问题1中的按钮(删除按钮)单击的后台事件中居然用 selectids=Reuquest.Params["selectItem"]
后续的代码就是以逗号来分割字符串从而得到一个字符串数组,而这个字符串数组就是checkbox被选中了的记录的id,于是我就很奇怪,这到底是为什么,为什么Reuquest.Params["selectItem"]得到是选中的记录id集,而不是所有的被选中记录的id集
...全文
326 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimu8130 2007-06-25
  • 打赏
  • 举报
回复
周末上不了网,没看到这么多回复
to belldandy11(路漫漫其修远兮,吾将上CSDN求索):
你说的对,我周末的时候彻底调试了下这些js,然后进行了部分重构,已经可以运行了,selectitem是checkbox的id和name,而你写的有点小错误document.getElementsByName("SelectItem");你少了个“s”,我查了下msdn,上面说byid返回的是第一个匹配的节点,而byname那个是可以返回多个的,在这样的情况下应该用byname。其他你说的解释对我没什么作用,因为在提问题前你那些解释我都已经知道了。不过依然谢谢你的帮助。
to Jinglecat(晓风残月 >> 问题需简洁,错误要详细):
1 没有喝高,我的web方面的知识并不是很全面和丰富,所以这些东西看不出来没什么大不了的。
2 你猜测错了,据我试验,action不是某个hidden,删除了它也没什么关系,这句话似乎是asp常用样的。
3 你猜对了,如同对bed……说的那个是写代码的人的错误,应该是byname,这样得到的应该是个集合,然后判断集合是否null,和其length是否大于0。
4 你说的这个我不知道,难道我是火星人?555555555555。。。
5 你又一次打击我,你说的我们都知道那段,结果我仍然不知道,555555555555555555
6 这段代码确实写的很傻,后来我改了让其比较规范和合理了
7 你不是说了“我们都知道,对于 checkbox 只有其 checked = true,浏览器才会将其 value 提交给服务器,我们也知道,对于具有相同 name 的表单元素,浏览器会将其所有值用 , (逗号)连接,然后比较给服务器”我最终想知道就是这个答案。
8 你批评的在理,我准备批评他了!
9 总的来说,你给的帮助最大,我彻底理解了这段代码。
jimu8130 2007-06-22
  • 打赏
  • 举报
回复
没人来看看么?
jimu8130 2007-06-22
  • 打赏
  • 举报
回复
问题应该是为什么Reuquest.Params["selectItem"]得到是所有选中的记录id集,而不是所有的记录的id集!

--------------------
更正一下,为什么Reuquest.Params["selectItem"]得到是所有选中的checkbox集,而不是所有的checkbox集(不包括那个全选checkbox)!

jimu8130 2007-06-22
  • 打赏
  • 举报
回复
to SassyBoy(my love will get you home):
哥们,如果网上能找到答案,我何必发帖问询了?
to Eray(黑桃六) :
别丧气,谁都有自己擅长的和不擅长的。
to happycharles() :
不好意思,这句话应该是错误的,当时没注意到;问题应该是为什么Reuquest.Params["selectItem"]得到是所有选中的记录id集,而不是所有的记录的id集!因为我给出的那段js代码(其实还不是很完美),并没有对selectItem进行修改,但是通过对其他后台代码的分析在后台使用Reuquest.Params["selectItem"]得到是选中的selectItem集合

纷享刘晨 2007-06-22
  • 打赏
  • 举报
回复
为什么Reuquest.Params["selectItem"]得到是选中的记录id集,而不是所有的被选中记录的id集

这句话没明白。

我的理解,form1.action.value只是自己定义的标识,你叫delete还是叫del都无所谓。
form1.submit()只是为了触发服务器端的事件,然后服务器端根据form1.action.value来判断是什么操作。

对于第二个问题,请楼主再解释一下
SassyBoy 2007-06-22
  • 打赏
  • 举报
回复
呵呵。一直对Javascript发怵。本来打算给LZ点信息来着,发现LZ的JS水平比我高……
Eray(黑桃六)
----------------------
我们都是穿内裤的一撮渺小的人。悲哀ing...
SassyBoy 2007-06-22
  • 打赏
  • 举报
回复
不敢在星星面前献羞。。。
Eray 2007-06-22
  • 打赏
  • 举报
回复
呵呵。一直对Javascript发怵。本来打算给LZ点信息来着,发现LZ的JS水平比我高……
SassyBoy 2007-06-22
  • 打赏
  • 举报
回复
没用过。为什么不baidu一下呢?
jimu8130 2007-06-22
  • 打赏
  • 举报
回复
给出那个按钮的前台js代码
function delete_click()
{
var is_checked;
//debugger
is_checked=false;
var SelectAll = document.getElementById("SelectAll");
var SelectItem = document.getElementById("SelectItem");
if(SelectItem!=null)
{
if(SelectItem[0]!=null)
{
for(i=0;i<SelectItem.length;i++)
{
if(SelectItem[i].checked)
{
is_checked=true;
}
}
}
else
{
if(SelectItem.checked)
{
is_checked=true;
}
}
}
if(is_checked)
{
if(window.confirm("您确定要删除吗?"))
{
frmAppeal.action.value = "DELETE";
frmAppeal.submit();
return true;
}
else
{
return false;
}
}
else
{
alert("请选中要删除的信息!");
return false;
}
}
chuxue1342 2007-06-22
  • 打赏
  • 举报
回复
只能顶!
belldandy11 2007-06-22
  • 打赏
  • 举报
回复
hehe
Jinglecat 2007-06-22
  • 打赏
  • 举报
回复
1。
LZ 你喝高了吧,分析不出来?
我来看看哈

2。
frmAppeal.action.value = "DELETE";
===========
我猜想这里的 action 应该是一个 input hidden 吧
可不是 <form action="some.aspx" >的 action

3。
var SelectItem = document.getElementById("SelectItem");
if(SelectItem[0]!=null) {
//
} else {
if(SelectItem.checked) {
//
}
=======
到底 id 为 SelectItem 的是什么 html 元素?
我想不会是某个 checkbox 吧,更不可能是 n 个的checkbox.id="SelectItem" ,那岂不乱套了
而且,看上面的代码,写此代码的coder并不确定每次返回的 SelectItem 对象是一个数组类型
【 if(SelectItem[0]!=null) 】

4。
Reuquest.Params["selectItem"]
==========
实际上,上面等价于 Request.Form["selectItem"],
地球人知道访问 Request.Form 应该使用客户端表单元素的 name,而不是 id

5。
于是乎问题1中的按钮(删除按钮)单击的后台事件中居然用 selectids=Reuquest.Params["selectItem"]
后续的代码就是以逗号来分割字符串从而得到一个字符串数组,而这个字符串数组就是checkbox被选中了的记录的id
===========
根据 4,我认为 selectItem 是这些 checkbox 共同享有的 name,
猜想下面的代码会得出什么值,
我们都知道,对于 checkbox 只有其 checked = true,浏览器才会将其 value 提交给服务器,
我们也知道,对于具有相同 name 的表单元素,浏览器会将其所有值用 , (逗号)连接,然后比较给服务器

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack) {
Response.Write(Request.Params["chk"]); // 1,3
}
}
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<input type="checkbox" name="chk" value="1" checked="checked" />
<input type="checkbox" name="chk" value="2" />
<input type="checkbox" name="chk" value="3" checked="checked" />
<input type="checkbox" name="chk" value="4" />
<input type="submit" />
</div>
</form>
</body>
</html>

6。
回头来看 3, 那么 delete_click() 函数前面那一打代码到底干什么?
————确定是否至少有一个 checkbox.checked = true, 如果没有就不执行 submit
注意观察, 对 selectItem 对象的处理,只影响到 is_checked 变量, 而后
if(is_checked) {
// ...
}
else {
// ...
}

7。
那么到底 是否 selectedItem 是所有的checkbox的 id 呢? 我也想不通了,看 selectedItem,
所示,6分析的判断是否有选中 checkbox 好像会有问题的

8。
结论:
a. 一堆垃圾代码,典型的意大利面条!
b. 我必须承认,此 coder 典型的 phper/asper,很是了解 html form 原理, 佩服,佩服!
c. 然而,此 coder 好像又是初学者,delete_click() 里面一堆的冗余代码,如那个 for 循环,应该用 break;


9。
不知道对了没?
belldandy11 2007-06-22
  • 打赏
  • 举报
回复
我觉得你的那个JS代码有问题
var SelectItem = document.getElementById("SelectItem");
如果是getElementById 那么得到的应该是一个控件对象
而你在之后又用到了if(SelectItem[0]!=null)
很明显 你这里的SelectItem是一个集合
所以
var SelectItem = document.getElementById("SelectItem");
应该改成
var SelectItem = document.getElementByName("SelectItem");

你的gridview中模板列里的checkbox的name属性应该是 name="SelectItem"

这样,你才能取gridview里的所有checkbox放到一个集合里面,之后才是判断他们的选中状态

至于你JS里的
var SelectAll = document.getElementById("SelectAll");
我想应该是表示全选checkbox
定义这个对象 是为了之后方便处理
只要 SelectAll.checked 就知道gridview里的checkbox全选中了

SassyBoy 2007-06-22
  • 打赏
  • 举报
回复
证明lz的问题不简单,hoho :)

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧