|
|
2008年9月28日
很多朋友都在跃跃欲试 打算打造自己的jquery插件, 我是 烦透了了jquery ui的dialog插件,所以突发奇想 自己写一个。先申明 就是随便这么一写,太多的还没有完善,之所以贴出来就是给大家一个参考。
下面大家跟我一起打造一个jquery dialog插件
首先创建一个插件
$.fn.dialog=function(){
}
下面我们首先考虑 当您要现实的信息弹出来的时候,文档上面有一个遮罩层是必需的
那我们来编写一个遮罩层 $.fn.dialog=function(){
this.MaskDiv=function() { var wnd = $(window), doc = $(document); //alert(doc.height()); if(wnd.height() > doc.height()){ //当高度少于一屏 wHeight = wnd.height(); }else{//当高度大于一屏 wHeight = doc.height(); } //创建遮罩背景 $("body").append("<div ID=MaskID></div>"); $("body").find("#MaskID").width(wnd.width()).height(wHeight) .css({position:"absolute",top:"0px",left:"0px",background:"#ccc",filter:"Alpha(opacity=90);",opacity:"0.3",zIndex:"10000"}); }
}
注:这个遮罩函数 也不怎么复杂,这里我就不过多的讲解了,有不懂的加群 来问
遮罩做好以后 我们就需要来写 信息提示显示的位置了,下面我们在写一个 显示位置的函数。
$.fn.dialog=function(){
this.MaskDiv=function() { var wnd = $(window), doc = $(document); //alert(doc.height()); if(wnd.height() > doc.height()){ //当高度少于一屏 wHeight = wnd.height(); }else{//当高度大于一屏 wHeight = doc.height(); } //创建遮罩背景 $("body").append("<div ID=MaskID></div>"); $("body").find("#MaskID").width(wnd.width()).height(wHeight) .css({position:"absolute",top:"0px",left:"0px",background:"#ccc",filter:"Alpha(opacity=90);",opacity:"0.3",zIndex:"10000"}); } this.sPosition=function(obj) { var MyDiv_w = parseInt(obj.width()); var MyDiv_h = parseInt(obj.height()); var width =parseInt($(document).width()); var height = parseInt($(window).height()); var left = parseInt($(document).scrollLeft()); var top = parseInt($(document).scrollTop());
var Div_topposition = top + (height / 2) - (MyDiv_h / 2); //计算上边距 var Div_leftposition = left + (width / 2) - (MyDiv_w / 2); //计算左边距 return Array(Div_topposition,Div_leftposition); }
}
我们这里主要是让信息显示在中间
|
完整代码:
$.fn.dialog=function(){
this.MaskDiv=function() { var wnd = $(window), doc = $(document); //alert(doc.height()); if(wnd.height() > doc.height()){ //当高度少于一屏 wHeight = wnd.height(); }else{//当高度大于一屏 wHeight = doc.height(); } //创建遮罩背景 $("body").append("<div ID=MaskID></div>"); $("body").find("#MaskID").width(wnd.width()).height(wHeight) .css({position:"absolute",top:"0px",left:"0px",background:"#ccc",filter:"Alpha(opacity=90);",opacity:"0.3",zIndex:"10000"}); } this.sPosition=function(obj) { var MyDiv_w = parseInt(obj.width()); var MyDiv_h = parseInt(obj.height()); var width =parseInt($(document).width()); var height = parseInt($(window).height()); var left = parseInt($(document).scrollLeft()); var top = parseInt($(document).scrollTop());
var Div_topposition = top + (height / 2) - (MyDiv_h / 2); //计算上边距 var Div_leftposition = left + (width / 2) - (MyDiv_w / 2); //计算左边距 return Array(Div_topposition,Div_leftposition); } this.MaskDiv(); $("body").append("<div ID=DivDialog style='display:none'><ul><li>提示</li></ul></div>"); var obj=$("body").find("#DivDialog"); obj.width("200px").height("200px"); PosT=this.sPosition(obj); obj.css({position:"absolute",top:PosT[0]+"px",left:PosT[1]+"px",background:"#FFCC66",zIndex:"10001"}).show("slow"); return this; }
|
演示地址:http://www.cnjquery.com/demo/dialog.html
首先我们先写一个jquery的匿名函数
以下为引用的内容: <SCRIPT LANGUAGE="JavaScript"> $(function(){ var alterColor = function(table){ $('tbody tr:odd',table).removeClass('even').addClass('odd'); $('tbody tr:even',table).removeClass('odd').addClass('even'); } alterColor('#cnjquery); }) </SCRIPT> |
这是一个最基本的写法 ,还没有做成 插件形式,主要就是让表格隔行换色。
这里我们可以发现 这个函数几乎没有什么通用性,下面我们来对她进行扩展。
|
以下为引用的内容: <SCRIPT LANGUAGE="JavaScript"> $(function(){
$.fn.alterColor = function(){ $('tbody tr:odd', this).removeClass('even').addClass('odd'); $('tbody tr:even', this).removeClass('odd').addClass('even'); }
$('#cnjquery').alterColor();
}) </SCRIPT>
|
$('#cnjquery').alterColor();
这样样子有点插件的意思了,但是我们会发现一个问题 这样写,不能链式操作,
也就是 $('#cnjquery').alterColor().find("????")等
为什么呢?因为jquery在执行每个方法的时候 都会返回一个jquery对象 也就是我们只要加一个返回值就可以了
|
以下为引用的内容: <SCRIPT LANGUAGE="JavaScript"> $(function(){
$.fn.alterColor = function(){ $('tbody tr:odd', this).removeClass('even').addClass('odd'); $('tbody tr:even', this).removeClass('odd').addClass('even'); return this; //新增代码 }
$('#cnjquery).alterColor().find("tr").click(function(){ alert(1);//可以 链式操作 了。 });
}) </SCRIPT> |
现在我们看到可以链式操作了 到了这里我们的插件算是基本完成了,但是还有一个小小问题
也就是插件的参数都是死的 ,我们没有办法动态修改他的参数,这样应用起来就太不方便了,没有办法还需要继续改造
|
以下为引用的内容: $(function(){ $.fn.alertColor = function(options) { var defaults = { odd : "red", even : "blue" }; var o = $.extend(defaults, options); return this.each(function() { $('tbody tr:odd', this).removeClass(o.even).addClass(o.odd); $('tbody tr:even', this).removeClass(o.odd).addClass(o.even); return this; }) }
$('#cnjquery').alertColor({ odd : "cs"}); // 或者 $('#cnjquery').alertColor({ odd : "red" , even : "blue"}); // 或者 $('#cnjquery').alertColor();
}) |
哈哈哈我们的换色表格插件终于完成了,赶快动作做一下吧。
ThickBox 是基于 jQuery 用 JavaScript 编写的 网页UI对话窗口小部件. 它可以用来展示单一图片, 若干图片, 内嵌的内容, iframed的内容, 或以 AJAX 的混合 modal 提供的内容. 查看实例演示特性:
- ThickBox 是用超轻量级的 jQuery 库 编写的. 压缩过 jQuery 库只15k, 未压缩过的有39k.
- ThickBox 的 JavaScript 代码和 CSS 文件只占12k. 所以压缩过的 jQuery 代码和 ThickBox 总共只有27k.
- ThickBox 能重新调整大于浏览器窗口的图片.
- ThickBox 的多功能性包括(图片,iframed 的内容,内嵌的内容,AJAX 的内容).
- 展示单一图片(single image)
- 展示图片集(multiple images)
- 展示内嵌内容(inline content)
- 展示被iFrame的内容(iframed content)
- 展示AJAX内容(AJAX content)
- 其他:教程本身还自带了一个很酷的JS跳转脚本
- ThickBox 能隐藏 Windows IE 6 里的元素.
- ThickBox 能在使用者滚动页面或改变浏览器窗口大小的同时始终保持居中. 点击图片, 覆盖层, 或关闭链接能移除 ThickBox.
- ThickBox 的创作者决定动画应该因人而异, 所以 ThickBox 不再使用动画了. 这是特性吗? 哦, 有人说是呀.
如何实现 ThickBox :1. ThickBox 要求使用 jQuery JavaScript 库; 正因如此, 你需要外调 jquery.js 文件在你的网页的 head 元素内, 接着还要外调 thickbox.js 文件 (注意: jquery.js 必须放在调用 资源的第一位). 例子如下: <script type="text/javascript" src="path-to-file/jquery.js"></script> <script type="text/javascript" src="path-to-file/thickbox.js"></script> 一旦你外调了 .js 文件, 打开 thickbox.js 并寻找 加载图片的名字 (loadingAnimation.gif). 找到后, 根据它在你 服务器上的位置确定更改它的路径. 2. 在你的网页中外调 ThickBox CSS 文件. 例子如下: <link rel="stylesheet" href="path-to-file/thickbox.css" type="text/css" media="screen" /> 或 <style type="text/css" media="all">@import "path-to-file/thickbox.css";</style> 或, 打开 thickbox.css 文件并复制粘贴样式到你现有的样式表中. 3. 观看例子, 学习使用不同的方法调用 ThickBox 的功能.支持的和经测试过的浏览器: Windows IE 6.0, Windows FF 1.5.0.5, Windows Opera 9.0, Macintosh Safari 1.3.2 & amp; 2.0.3, Macintosh FF 1.5 MIT 许可 http://www.opensource.org/licenses/mit-license.php许可特此批出, 免费, 给任何人提供此软件的拷贝和他相关文档中的("软件"), 使用此软件不受任何限制, 所不受的限制包括: 有权利使用, 拷贝, 修改, 合并, 出版, 分发, 颁发从属许可, 和/或买卖该软件的拷贝.打包下载代码及教程
http://www.blueidea.com/articleimg/2006/08/3912/thickbox.html
(环境:vs2008+jquery1.2.3) 发现.net自带的ajax.net使用webservice输出的是json,其中关键的就是在请求时:Content-Type:application/json;utf-8 所以我们只要在POST时加上一个Content-Type:application/json;utf-8就可以了
$.ajax({ type: "POST", contentType:"application/json;utf-8", url: "/Server/PicLib.asmx/HelloWorld", success: function(msg){ var json = eval('(' + msg + ')'); alert(json.d);} });
var json = eval('(' + msg + ')'); (这个是把返回的字符值转换成json对象,这样子才能够正常的操作json,这里可以用try来捕捉一下错误,因为如果返回的字符串不是标准的json的话就会出错。)
上面的js要成功运行需要对.net做一下设置让“WebService输出JSON” 修改WebService,导入一个属性
<System.Web.Script.Services.ScriptService()>
<System.Web.Script.Services.ScriptService()> _ <System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _ <System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <ToolboxItem(False)> _ Public Class WebService1 Inherits System.Web.Services.WebService
<WebMethod()> _ Public Function HelloWorld(ByVal str As String, ByVal name As String) As String Return str & name End Function
End Class
在webconfig中添加:
<httpHandlers> <remove verb="*" path="*.asmx"/> <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> </httpHandlers>
注意:这个是关键,这样子才能使请求asmx文件时让它输出json格式,刚刚开始时测试了很久都不行。
在vs2008 简体中文版+jquery 1.2.3下通过测试。
在测试过程中“顺便”发现了jq的一个"BUG" 在设置Content-Type时,发现怎么样设置jq总是不理不踩, 查看了一下jq的ajax方法哪一段源码,看到了如下的代码:
if ( s.data ) xml.setRequestHeader("Content-Type", s.contentType);
上面的data是ajax请示的参数,当参数值不为空才设置请求的Content-Type 我不知道这个到底是不是它的bug,在实际使用的时,你会碰到在调用webservice的一个方法,而这个方法是没有参数时,这样子 如果你不想修改jq的源码的话,就在请求时附加一些无用的数据,如:data:"{}",不然jq可是会发“烂咂”(脾气)哦~呵呵
以上的问题还请使用jq的朋友们注意一下。
应朋友们的要求我写了个简单的演示,源码里已写好注释了,请大家查看相关的源码 演示是vs2008(vb)写的,下载源码
使用JQuery中ajax方法访问web服务。 1.ajax方法需要填写:
- JScript code
$.ajax({ type: "POST", //注明 返回Json contentType:"application/json;utf-8", //CollegeDepartWebServices.asmx web服务名 /GetCollegeDepart 方法名 url:"CollegeDepartWebServices.asmx/GetCollegeDepart", //strDepartId 参数名称 collegeId 参数值 data:"{strDepartId:"+collegeId+"}", dataType:"json", success:function(result){ var json=null try { if(result) { //因为返回的是ArrayList 所以循环取出其中的值 $.each(result, function(i, n){ //ddlDepart 为下来菜单。循环的向下拉菜单中添加新的选项 ddlDepart.options[ddlDepart.length]=new Option(n.CollegeDepartTitle,n.CollegeDepartId); }); }
} catch(e) { alert("错误>>"+e.message); return; } }, error:function(data) { alert(data.status+">>> "+data.statusText); } });
---- CollegeDepartWebServices.asmx.cs web服务类
- C# code
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ScriptService] public class CollegeDepartWebServices : System.Web.Services.WebService {
public CollegeDepartWebServices() {
//如果使用设计的组件,请取消注释以下行 //InitializeComponent(); }
[WebMethod] [System.Xml.Serialization.XmlInclude(typeof(CollegeDepartInfo))] public ArrayList GetCollegeDepart(string strDepartId) { CollegeDepartBL.FlushCollegeDepartCache(); if (string.IsNullOrEmpty(strDepartId)) return null;
ArrayList myList = CollegeDepartBL.GetCollegeDepartListByCollegeID(int.Parse(strDepartId)); return myList;
}
}
说明: ArrayList 中 存为对象CollegeDepartInfo 其属性为:stirng CollegeDepartTitle 和 int CollegeDepartId 在javascript中 ddlDepart.options[ddlDepart.length]=new Option(n.CollegeDepartTitle,n.CollegeDepartId); Option的参数就是依据他们的。 最后重要的是: 类上方添加的 [ScriptService] 必须添加,否则ajax无法调用WebService
|