最近开发的项目引用了 jquery-easyui 界面框架,对于界面的布局便利了很多,但也遇到了不少问题。我也很少做总结,今天解决的这个问题搁了好久,实在不行了,才着手处理。

问题现象

为了保持界面表现的统一,对于弹出的消息框,要求使用 jquery 的

$.messager.alert('信息', info, 'info');

于是,对其进行了 简单地封装:

代码

//信息框
function AlertInfo(info) {
$.messager.alert('信息', info, 'info');
return false;
}

//询问框
function AlertQuestion(ask) {
$.messager.alert('询问', ask, 'question');
return false;
}

//警告框
function AlertWarning(warn) {
$.messager.alert('警告', warn, 'warning');
alert(warn);

return false;
}

前端调用:

OnClientClick="return AlertInfo('哦呀');"
//或
οnclick="AlertInfo('哦呀');"

后端调用:

代码

/// <summary>
/// 信息框
/// </summary>
/// <param name="info">The info.</param>
public void AlertInfo(string info)
{
ExecuteScript(string.Format("AlertInfo('{0}')", info));
}

/// <summary>
/// 执行JavaScript 脚本
/// </summary>
/// <param name="scriptBody">The script body.</param>
public void ExecuteScript(string scriptBody)
{
string scriptKey = "somekey";
ClientScript.RegisterStartupScript(typeof(string), scriptKey, scriptBody, true);
}

在实际使用中,发现 使用后端 ClientScript.RegisterStartupScript 所注册的脚本会重复执行,两次。

原因查找

  1. 排除后端代码重复调用;
  2. 排除所封装JS的手误,BUG
  3. 排除所封装后端代码的重复注册BUG
  4. 排除页面的重复载入

最终发现,只要是页面 body 设成了 jqeury-easyui class,就会出现此情况。于是明白是因为JEUI 对页面的重新“渲染”,这必然也对页面后端注册的代码片段:

<script type="text/javascript">
//<![CDATA[
Alert('吐血')
}//]]>
</script>

也进行了重新“渲染”。

解决思路

在原有后端要注册的脚本中 加入 变量 __yltlClientScriptRegistKey,用于标识,所注册的脚本是否被执行过,若已被执行过,则中断。

后端处理代码:

代码

/// <summary>
/// 执行JavaScript 脚本
/// </summary>
/// <param name="scriptBody">The script body.</param>
public void ExecuteScript(string scriptBody)
{
string scriptKey = "somekey";
string interruptedScript = @"if(window.__yltlClientScriptRegistKey == null ||
window.__yltlClientScriptRegistKey == undefined ||
window.__yltlClientScriptRegistKey !='" + scriptKey + "') { " +
"window.__yltlClientScriptRegistKey = '" + scriptKey + "' ;\r\n" +
scriptBody + "\r\n}";
//cdh 2010.0611 加入 拦截片段,
//防止 页面因 UI 库的重复渲染 引起脚本重复执行。
ClientScript.RegisterStartupScript(typeof(string), scriptKey, interruptedScript, true);
}

最终产生的JS段如下:

代码

<script type="text/javascript">
//<![CDATA[
if(window.__yltlClientScriptRegistKey == null ||
window.__yltlClientScriptRegistKey == undefined ||
window.__yltlClientScriptRegistKey !='somekey') {
window.__yltlClientScriptRegistKey = 'somekey' ;
Alert('吐血')
}//]]>
</script>

此记, 希望能给后来者一个线索.

转载于:https://www.cnblogs.com/donhwa/archive/2010/06/11/1756472.html

[原]ASP.NET中使用JQUERY-EASYUI后,解决ClientScript.RegisterStartupScript 所注册脚本执行两次...相关推荐

  1. Asp.net WebForm中应用Jquery EasyUI Layout

    Asp.net WebForm中应用Jquery EasyUI Layout 按照EasyUI文档中的示例,编写layout代码: <body class="easyui-layout ...

  2. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)...

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

  3. IDEA中创建maven项目后解决main文件夹下目录不全的问题

    IDEA中创建maven项目后解决main文件夹下目录不全的问题 参考文章: (1)IDEA中创建maven项目后解决main文件夹下目录不全的问题 (2)https://www.cnblogs.co ...

  4. python参考文献_[zotero/python]库中参考文献条目删除后,清除残留PDF的脚本

    更新:使用 @滏阳河边捉蚯蚓 https://zhuanlan.zhihu.com/p/41297136上获取系统PDF文件和zotero.sqlite文件的代码,在此感谢! 在zotero的libr ...

  5. asp.net中注册脚本的两个方法

    使用Page.ClientScript.RegisterClientScriptBlock RegisterClientScriptBlock方法可以把一个JavaScript函数放在页面的顶部.这说 ...

  6. linux脚本执行过程中被挂起,Linux学习笔记(八)——脚本执行的过程控制

    一.脚本执行过程中的控制 之前的内容中,运行编写好的脚本时都是在命令行上直接确定运行的,并且运行的脚本是实时的,这并不是脚本唯一的运行方式,下面的内容是脚本的其他运行方式.例如在Linux系统中如何控 ...

  7. SSH开发中 使用超链接到action 其excute方法会被执行两次 actual row count: 0; expected: 1...

    由于执行两次excute,所以在做删除操作的时候会出现 Batch update returned unexpected row count from update [0]; actual row c ...

  8. 在asp.net中使用jQuery实现类似QQ网站的图片切割效果

    今天要给大家介绍一个asp.net结合jQuery来切割图片的小程序,原理很简单,大致流程是: 加载原图 --> 用矩形框在原图上选取区域并将选取的顶点坐标和矩形尺寸发送至服务器 --> ...

  9. 在Asp.net中使用JQuery插件之jTip

    jTip 是个轻量级的提示插件.默认支持两个参数: width宽度,default value :250px link 要link的URL 对应的Source code是: 1: var params ...

最新文章

  1. EBioMedicine:西湖大学郑钜圣组-乳制品摄入与肠道微生态、心血管代谢健康的关系...
  2. 如何找出应用程序未使用绑定变量
  3. Android Studio离线打包5+SDK
  4. 已解决:Unable to register authentication agent: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed:
  5. 【PC工具】如何简单粗暴无脑的解方程
  6. 【原创】存储器设计思想——冯诺依曼结构和哈佛结构
  7. 一天搞定CSS:文本text--05
  8. java解析xml文档_Java解析xml文件
  9. linux c程序中获取shell脚本输出
  10. 每天一道LeetCode-----计算二叉树所有根节点到叶子节点的和
  11. 百度网盘不限速被限速_基本API限速
  12. 函数传参之商品价格计算—JS学习笔记2015-6-6(第50天)
  13. 【Python】【数据库】
  14. jquery文档modal_jQuery代码文档小工具
  15. \t转义字符占几个字节?
  16. mysql世界国家数据库_世界国家 的数据库sql
  17. pull时出现错误及解决方法
  18. su、sudo、su - root的区别
  19. 计算机与文秘专业有哪些课程,文秘专业开设的课程有哪些
  20. 计算机视觉论文-2021-07-23

热门文章

  1. iostat linux,iostat 命令详解
  2. 锂电池接线方法图_锂电池制浆工艺(2)——制浆设备种类及特征
  3. dajngo3,vue3前端项目搭建,vue项目结构的介绍
  4. 力扣 每日一题 丢失的数字
  5. 计算机组成原理 第三章 存储系统
  6. 【文献阅读】ResNet-Deep Residual Learning for Image Recognition--CVPR--2016
  7. LeetCode Week 1:第 1 ~ 10 题
  8. 实验7.1 对Point类重载“++”(自增)、“–”(自减)运算符
  9. HRNet的学习笔记
  10. 常用类 (一) ----- Arrays数组工具类