163邮箱可以通过多选邮件,拖动到左侧的文件夹列表,实现邮件归类的功能 function clkAll(myTable,ck)
{ var tb = document.getElementById(myTable); var objs1 = tb.getElementsByTagName('TR'); for(var i=1; i<objs1.length; i++) { if (objs1[i].getElementsByTagName('TD').item(0).getElementsByTagName('INPUT').length>0) objs1[i].getElementsByTagName('TD').item(0).getElementsByTagName('INPUT').item(0).checked = ck.checked; } lastCheck=null; RefreshRowStates(tb); RefreshRowColor(tb); } 后台GridView调用js: <asp:TemplateField>
<HeaderTemplate> <input id="Checkbox2" type="checkbox" onclick="clkAll('grvProjList',this)" runat="server" /> </HeaderTemplate> <ItemTemplate> <asp:CheckBox ID="chbox" runat="server" /> </ItemTemplate> 2。点击GridView每行,实现选中当前行,按住shift实现多选 在JS里,事件有个Bubble过程,大致就是元素的事件(click等) 会先触发当前元素的事件,然后触发上级元素事件 <body onclick="alert('1')">
点击文本框将依次提示 2 ,1<input onclick="alert('2')"> </body> 因此,点击GridView每行,实现选中当前行,只要考虑对TR元素进行onclick事件处理即可 完整的js代码如下: function clk(obj,event)
{ var el = event.target?event.target:event.srcElement; if (el.type != "checkbox" && el.tagName != "A") { obj.getElementsByTagName('TD').item(0).getElementsByTagName('INPUT').item(0).checked = ! obj.getElementsByTagName('TD').item(0).getElementsByTagName('INPUT').item(0).checked } mov(obj); if (event.shiftKey && lastCheck!=null) { var tag = 0; lastCheck.childNodes[0].childNodes[0].checked = obj.childNodes[0].childNodes[0].checked; mov(lastCheck); mou(lastCheck); for(var i=1; i<obj.parentNode.childNodes.length; i++) ![]() if (obj.parentNode.childNodes[i] == obj || obj.parentNode.childNodes[i] == lastCheck) { tag ++; continue; } if (tag == 1) { obj.parentNode.childNodes[i].childNodes[0].childNodes[0].checked = obj.childNodes[0].childNodes[0].checked; mov(obj.parentNode.childNodes[i]); mou(obj.parentNode.childNodes[i]); } if (tag ==2) break; } } else { lastCheck=obj; } RefreshRowStates(obj.parentNode.parentNode); } 第一个判断触发事件的元素是不是checkBox或者链接元素 前者是因为本身就是选中事件,后者是因为链接应该是进行其他操作而不是选择当前行 第二个链接是用来实现对按住shift进行多选的实现 毕竟一个个点太麻烦了 163邮箱的shift多选逻辑我没看大明白 于是按照windows的shift多选大致做的: 记住按shift之前的点击行,按住shift点击新行后,两者之间的所有行按照最后点击新行的新状态copy 其中的mov和mou是前文提到的刷新选中颜色的函数 RefreshRowState先不用管 是后面用来统计选中状态的 就是“您选择了**条数据” 后台的代码变成了 protected void grvProjList_RowDataBound(object sender, GridViewRowEventArgs e)
{ if (e.Row.RowType == DataControlRowType.DataRow) { if ((e.Row.RowIndex % 2) == 0) { e.Row.Attributes.Add("originalcolor", System.Drawing.ColorTranslator.ToHtml(grvProjList.RowStyle.BackColor)); e.Row.Attributes.Add("onmouseout", "mou(this,'" + System.Drawing.ColorTranslator.ToHtml(grvProjList.RowStyle.BackColor) + "')"); } else { e.Row.Attributes.Add("originalcolor", System.Drawing.ColorTranslator.ToHtml(grvProjList.AlternatingRowStyle.BackColor)); e.Row.Attributes.Add("onmouseout", "mou(this,'" + System.Drawing.ColorTranslator.ToHtml(grvProjList.AlternatingRowStyle.BackColor) + "')"); } e.Row.Attributes.Add("onmouseover", "mov(this)"); e.Row.Attributes.Add("onclick", "clk(this,event)"); e.Row.Attributes["style"] = "Cursor:hand"; } } 对于按住Ctrl实现多选,没有必要实现,因为不同于windows的单击单选, gridView本来就是按住ctrl的效果了(单击增加、删除选择) (责任编辑:admin) |