我们在创建自定义的服务器端控件或是用户控件时,经常需要用到一些客户端js脚本,通常将其作为资源嵌入,并在页面后台代码中添加引用,但是如若用到一些通用的js库(比如JQuery)时,就免不了产生一个疑问:

如果使用此控件的页面也需要用到该库时怎么办?

在控件中引入,在页面中也引入,不就会造成页面中引入两次同一个或是两个版本的js库吗?这不仅逻辑不通,而且可能浪费资源。

如是不在控件中引入,但要求页面中必须引入,那么拿给别人使用时免不了让他一头雾水,甚至某一天你自己都忘了这回事,对着一堆js错误挠头。

本文将演示整个编写流程,并提供正确的做法演示:

首先建立一个名为"客户端脚本引用测试"的网站项目(注意是网站项目):

接着在解决方案中添加一个服务器控件项目,名为"测试服务器控件":

修改测试服务器控件项目中的ServerControl1.cs中的代码,设置Text属性的DefaultValue:

更改RenderContents事件实现内容为下面的代码用以输出基本的客户端呈现外观:

output.Write(string.Format(@"<div id=""ZDC""color: #54857D; font-weight: bold; border: 1px solid #CADBDB; background-color: #E8F3FF; text-align: center; line-height: 72px; width: 360px; height: 72px"">
    {0}</div>
<button id=""ZDCS"" name=""Abutton1"">隐现控件</button>",Text));

接下来将JQuery脚本及智能感知注释文件添加到自定义控件项目中:

修改JQuery脚本的属性,将生成操作改为嵌入的资源:

新建一个act.js,写入下面代码:

/// <reference path="jquery-1.2.6-vsdoc.js" />
$(function() {
    $("#ZDCS").toggle(function() {
        $("#ZDC").hide("fast");
    }, function() {
        $("#ZDC").show("slow");
    });
});

将其文件属性中的生成操作也设为嵌入的资源

打开AssemblyInfo.cs:

在文件最下面添加下面的代码:

[assembly: WebResource("测试服务器控件.jquery-1.2.6.min.js", "application/x-javascript")]

[assembly: WebResource("测试服务器控件.act.js", "application/x-javascript")]

然后在ServerControl1.cs中添加下面的代码:

protected override void CreateChildControls()
{
    Page.ClientScript.RegisterClientScriptInclude("JQuery", Page.ClientScript.GetWebResourceUrl(this.GetType(), "测试服务器控件.jquery-1.2.6.min.js"));
    Page.ClientScript.RegisterClientScriptInclude("ZDC", Page.ClientScript.GetWebResourceUrl(this.GetType(), "测试服务器控件.act.js"));
    base.CreateChildControls();
}

这样既可完成脚本注册,注意,图中圈出的"JQuery"用于标识脚本,是防止重复引入脚本的关键。

接下来回到网站项目中,添加对引用控件项目的引用:

编译一下,然后就可以从工具箱中找到新增的自定义控件了:

将其添加入网站的默认页面:

编译并运行:

点击按钮就可以看到JQuery的隐藏、显示效果。

查看源代码可以看到有两个引用脚本,引用的正是我们在控件中设置的JQuery和act.js:

打开第一个引用地址,就可以看到我们在控件中嵌入的1.2.6版本JQuery代码:

现在我们假设在页面中的某个功能需要用到1.3.2版JQuery库,而控件中的是1.2.6版,让我们看看如何来将其替代:

首先建立一个JS文件夹,并添加1.3.2版JQuery库:

然后在页面的Page_Load事件中添加脚本引用代码:

if (!IsPostBack)
{
    ClientScript.RegisterClientScriptInclude("JQuery", "/JS/jquery-1.3.2.min.js");
}

还是注意一定要把标识"JQuery"写对,否则你将会看到两个版本的JQuery都载入你的页面。

编译并运行,JQuery效果仍然正常运行,查看源代码:

可以看到第一个脚本引用变成了我们所设的1.3.2版本的文件Url,而不是之前的/WebResource.axd?…………什么的了,打开该路径,看到的也的确是1.3.2版JQuery:

OK,演示到此完毕,我们在此达成了这样的效果:页面中没有引入JQuery时就用控件内嵌的JQuery文件,页面中引入了JQuery就只使用页面中的JQuery。

这样做的好处显而易见:即不会产生错误,也不会浪费资源,还可以随时使用最新版的JQuery库。

本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2009/06/10/1500074.html,如需转载请自行联系原作者

防止自建控件与页面间重复引入客户端js脚本的方法相关推荐

  1. 关于用户自定义控件与引用该控件的页面之间的javascript脚本冲突

    前几天为客户做WEB系统的时候,需要在每个页面的header 上面加个"退出系统"的连接:而且要有确认对话框.一般就是通过添加" this.LinkButton.Attr ...

  2. html页面时间段开始结束,使用layui日期控件laydate对开始和结束时间进行联动控制的方法...

    1.在页面先引入laydate.js文件 2.html页面控件如下: 3.html页面js代码如下: //年月选择器 laydate.render({ elem: '#begin_time' ,typ ...

  3. 基于 J a v a S c r i p t 与 D B G R I D控件的 B / S结构客户端联想式录入技术的设计与实现

    基于 J a v a S c r i p t 与 D B G R I D控件的 B / S结构客户端 联想式录入技术的设计与实现 赵成勇, 周  南, 邱小彬 ( 中国农业大学网络中心, 北京 1 0 ...

  4. C#Winform的DataGridView控件使用详解1—七种DataGridViewColumn类型使用方法

    C#Winform的DataGridView控件使用详解1-七种DataGridViewColumn类型使用方法 DataGirdView控件Column类型 DataGridViewButtonCo ...

  5. DLL+ ActiveX控件+WEB页面调用例子

    因项目需要,开始学习并研究VC.DLL及ActiveX控件,网上资料找了很多,但没一个可用的或者说没一个例子可理解并运行的.没办法,自己研究吧.功夫不负有心人,终有小成了,呵呵,现在把自己学习总结了一 ...

  6. lodop打印html内容,Lodop打印控件在页面如何使用

    Lodop打印控件部署到web服务器简单,在页面的使用方法也简单,是非常容易和方便使用的打印控件. 客户端本地打印角色(即用户访问网站后 用自己链接的打印机进行客户端本地打印),步骤很少,部署简单: ...

  7. 15 ArcGIS JS API 4.17更改测量控件黄白相间的默认样式

    问题描述 在使用ArcGIS API for JavaScript 4.17开发项目时,有一个需求是需要在地图上添加距离测量和面积测量的控件,这其实很简单,直接调用ArcGIS JS API自带的测量 ...

  8. 第十四篇 表单控件 - 购物车页面

    上一篇内容 已经简单的介绍了表单控件以及表单控件的绑定,有登录界面输入的用户信息(userInfo)是否需要启动 "记住" 功能,"记住" 是一个记录登录状态, ...

  9. java fx border_JavaFx UI控件与代码间的绑定方法

    JavaFx初探一,UI控件的使用,具体内容如下 方式一:使用纯代码直接new view控件,这样就不涉及到与fxml文件之间的交互了 方式二:使用fxml编写界面文件,用可视化工具scene bui ...

最新文章

  1. 详细分析 apache httpd 反向代理的用法
  2. 什么是单点登录(SSO)
  3. 程序员面试宝典(Java)Beta6.0免费下载
  4. 百田公司:与神策数据携手,筑就爆款游戏背后的 4 个数据砝码
  5. python三维数组怎么表示_python – numpy中的三维数组
  6. C#学习笔记(十三):I/O操作
  7. 全局数据 GetGlobalDataSet
  8. java draw 方法调用_java,_Java,在构造器里调用多态方法,java - phpStudy
  9. SCCM2012升级SP1系列之配置管理SCCM2012④配置SCCM2012补丁分发
  10. LC-871 最小加油次数
  11. initramfs文件解压方法
  12. 计算两经纬度坐标间的距离
  13. 时间轮定时器-Timewheel
  14. epub电子书格式转换(E-book Conversion翻译) -- calibre
  15. HTML+CSS 学习笔记
  16. 20210526一日总结
  17. BUUCTF题目:easyre
  18. Xilinx GTX/GTH时钟篇(7系列)
  19. 潮玩艺术盛会来杭州了
  20. 一键GHOST的使用方法

热门文章

  1. 剑指 Offer JZ35 复杂链表的复制
  2. c语言将两个文件合成一个,keil中怎么把两个c程序怎么同时同时编译生成一个hex文件...
  3. datetime插入数据_量化学习:聚宽jqdatasdk对接vnpy的数据服务
  4. 【疑点】当子元素全部浮动时,怎么解决父元素塌陷的问题?
  5. Vmware虚拟机里面的linux系统ping不通宿主机的解决方法(注意同时安装vmware和vbox虚拟机)
  6. Centos7安装完毕后无法联网的解决方法
  7. scrapy爬虫学习系列七:scrapy常见问题解决方案
  8. Field ‘id‘ doesn‘t have a default value错误解决方法
  9. 【Windows 10 v1703】解决桌面出现Removable Storage Devices的问题
  10. ASP.NET Core 异常处理与日志记录