Gridview 中动态嵌入和执行 js 代码
2011-08-07 15:22
351 查看
使用GridView, 有时会需要在 删除、更新、修改、页面跳转前做数据的验证或计算,但js代码在一开始时写不进去的,
如<button onclick= "sampe()">、 <a Href= onclick= "sampe()">、<input type=text onblur= "sampe()">,
这些对gridView编程时都是不存在的,只有在页面解析时才会出现的控件,或嵌入到GridViewRow的控件,在解析后出现N个,
这些控件的没有可操控的id,或id(client)在解析后重复,不能在js中使用document.getElementById("id").value找到。
即使可以在后台使用XX.clientID定位到控件,也很难嵌入需要的js代码和响应事件(click)。
而在前台,gridview会解析成table,可以经常看到类似这样的代码
而我们就是要响应
<td><a href="javascript:__doPostBack('ctl00$Body$gvDetail','Edit$7')">修改</a></td>
中的事件<a onclick="validate()">
或<td style="width:80px;"><input name="ctl00$Body$gvDetail$ctl08$ctl01" type="text" title="试卷成绩" /></td>
中的事件<input onblur="validate()">
1、首先通过写js脚本将'<a'替换为 '<a onclick="validate()" '
2、后台在数据绑定是调用替换脚本 injectJavascript(id);
注意:js只能嵌到,<td>....</td>之间,
因为在C#中使用 GridView.Rows[index].Cells[index].ClientID,而不能使用GridView.Rows[index].ClientID
至于为什么,没有找到,经验不足啊。
sample :
js脚本
后台 C#
参考:http://www.cnblogs.com/ltenai/archive/2007/06/27/797179.
http://blog.csdn.net/hanxcloveyou/article/details/3057505
如<button onclick= "sampe()">、 <a Href= onclick= "sampe()">、<input type=text onblur= "sampe()">,
这些对gridView编程时都是不存在的,只有在页面解析时才会出现的控件,或嵌入到GridViewRow的控件,在解析后出现N个,
这些控件的没有可操控的id,或id(client)在解析后重复,不能在js中使用document.getElementById("id").value找到。
即使可以在后台使用XX.clientID定位到控件,也很难嵌入需要的js代码和响应事件(click)。
而在前台,gridview会解析成table,可以经常看到类似这样的代码
<tr style="background-color:LightSkyBlue;"> <td><span>15</span> </td> <td>408109070115</td> <td>张三</td> <td style="width:80px;"> </td> <td style="width:80px;"> </td> <td style="width:70px;"> </td> <td style="width:120px;"> </td> <td><a href="javascript:__doPostBack('ctl00$Body$gvDetail','Edit$7')">修改</a></td> </tr> ………… <tr style="background-color:LightSkyBlue;"> <td><span>7</span></td> <td>408109070107</td> <td>李斯</td> <td style="width:80px;"> <input name="ctl00$Body$gvDetail$ctl08$ctl00" type="text" title="平时成绩" /></td> <td style="width:80px;"><input name="ctl00$Body$gvDetail$ctl08$ctl01" type="text" title="试卷成绩" /></td> <td style="width:70px;"><input name="ctl00$Body$gvDetail$ctl08$ctl02" type="text" title="总成绩" /></td> <td style="width:120px;"><input name="ctl00$Body$gvDetail$ctl08$ctl03" type="text" title="备注" /></td> <td><a href="javascript:__doPostBack('ctl00$Body$gvDetail$ctl08$ctl04','')">保存</a> <a href="javascript:__doPostBack('ctl00$Body$gvDetail','Cancel$6')">取消</a></td> </tr>
而我们就是要响应
<td><a href="javascript:__doPostBack('ctl00$Body$gvDetail','Edit$7')">修改</a></td>
中的事件<a onclick="validate()">
或<td style="width:80px;"><input name="ctl00$Body$gvDetail$ctl08$ctl01" type="text" title="试卷成绩" /></td>
中的事件<input onblur="validate()">
那么这些事件怎么动态嵌入到html中呢?
解决方案:1、首先通过写js脚本将'<a'替换为 '<a onclick="validate()" '
2、后台在数据绑定是调用替换脚本 injectJavascript(id);
注意:js只能嵌到,<td>....</td>之间,
因为在C#中使用 GridView.Rows[index].Cells[index].ClientID,而不能使用GridView.Rows[index].ClientID
至于为什么,没有找到,经验不足啊。
sample :
js脚本
function injectJavascript(id) //在id控件中的<a>注入onclick事件的js { var oldHtml = window.document.getElementById(id.id).innerHTML; //获取控件下的Html //注释:这个地方为什么要用双id(id.id)我也没有弄太明白,没有深究,有时间再看看 // 使用时用单id提示 can't read property 'innerHTML' of null(chrome自带的js调试器) // 这应该视情况而定的吧,也许跟我传入的id有关 var arrayHtml = oldHtml.split('<a'); //拆分字符串 var script = "alert("嵌入成功");" //真正需要执行的脚本或js的自定义函数,也许可使用外部脚本,没有试过 var injection = arrayHtml[0]; //拼接 for (var i = 1; i < arrayHtml.length; i++) { if (arrayHtml[i].indexOf('onclick') == -1) { //嵌入的事件 injection += " <a onclick=\"" + script + "\" " + arrayHtml[i]; //嵌入事件的相应代码 } else { injection += " <a " + arrayHtml[i]; } } window.document.getElementById(id.id).innerHTML = injection; //注入Html }
后台 C#
//嵌入的位置千奇百样,根据自己的需要在合适的地方嵌入 protected void gv_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.Pager) { //对换页的页号嵌入控件js脚本 string script = "<script>injectJavascript(" +e.Row.Cells[0].ClientID + ");</script>"; //注意这传入的id。如果id无效会出现js脚本中注释的错误 if (!Page.ClientScript.IsStartupScriptRegistered("click")) { Page.ClientScript.RegisterStartupScript(this.GetType(), "click", script); } } }
参考:http://www.cnblogs.com/ltenai/archive/2007/06/27/797179.
http://blog.csdn.net/hanxcloveyou/article/details/3057505
相关文章推荐
- 关于动态执行代码(js的Eval)
- html嵌入js代码显示而不执行的
- 关于动态执行代码(js的Eval)
- 关于动态执行代码(js的Eval)实例详解
- 如何在net中实现动态执行代码(js的eval)的功能?
- 关于js动态插入script 标签后页面JS代码执行失败的解决方法
- 简易 Javascript DOM 包 | 元素水平垂直居中 | 动态执行 JS 代码 | 获取指定元素
- html文件中js代码执行顺序
- 根据响应时间动态调整执行线程数的代码
- js 代码执行时间
- 动态执行 VB.NET 和 C# 代码
- node.js 动态执行脚本
- 动态投放广告的js代码
- js调试工具console.log()方法查看js代码的执行情况
- JS动态添加与删除select中的Option对象(示例代码)
- firefox浏览器下href执行js代码
- 关于在服务器端执行JS代码
- 动态将Js代码写入到Head标签中
- 一段动态滚动公告栏的js代码