在佛罗里达州的奥兰多市举行TechEd for Developers 2008会议上,Bill Gates在他的主题发言中宣布了Silverlight 2 Beta 2的发布。
Gates先生提到这次的发布情况:
Silverlight 2 Beta
2将在本周发布,这是微软跨浏览器、跨平台和跨设备插件的最新版本,可基于.NET开发具有丰富媒体体验和交互性的下一代Web应用程序。现在,这个测试
版本已经具有商业的Go Live许可了。NBC Universal将使用Silverlight 2 Beta
2为2008北京奥运会创建具有前所未有的在线体验的报道站点。为了帮助开发人员充分利用Silverlight,微软也发布了Expression
Blend 2.5的6月预览版,及Silverlight Tools beta 2 for Visual Studio 2008。
这次公告最为关键的一个方面就是向开发人员宣布的"Go Live"许可,这意味着现在人们现在就可以创建产品化的Silverlight应用程序了。下面是这次发布版本最新特性的一些详细情况:
* UI框架:Beta 2对动画的支持、错误处理和报告、自动化和可访问性的支持、键盘输入的支持和性能方面都进行了加强。这个版本也为Silverlight和WPF提供了更多的兼容性。
* 丰富的控件:Beta 2包含了一个新的名为视觉状态管理器(Visual State
Manager,VSM)的模板模型,其为控件提供了更为简单的模板化功能。其他一些特性包括,TabControl的引入,TextBox支持文本换行
和滚动条,以及DataGrid添加了额外的Autosize、Reorder、Sort等功能,以及一些性能方面的提升。许多控件目前都已经合并到运行
时的安装包里,就不需要和应用程序打包在一起了。
* 网络支持:Beta 2增强了对跨域访问的支持和安全性,WebClient支持上传,以及支持双向通讯(从服务器"推送"数据给Silverlight客户端)。
* 丰富的基类库:Beta 2增强了线程处理的能力,支持LINQ to JSON,支持ADO.NET Data Services,对SOAP更好的支持,以及一些让网络和数据处理更容易的其他增强。
* Deep Zoom:Beta 2引入了针对Deep
Zoom图像块基于XML的文件格式,以及一个新的MultiScaleTileSource对象来实现把现存的图片块数据库转换为Deep
Zoom。更好的是,针对缩放的事件驱动提醒是Silvelight 2 Beta 2中的又一个增强。
Silverlight 2 Beta 2能在微软下载站点找到。这个测试版的文档也可以下载到,其他的信息则能在Silverlight的官方网站上找到。(开发者在线)
基本的鼠标互动:
拖拽(drag and dropping)、排序(sorting)、选择(selecting)、缩放(resizing)
各种互动效果:
手风琴式的折叠菜单(accordions)、日历(date pickers)、对话框(dialogs)、滑动条(sliders)、表格排序(table sorters)、页签(tabs)、放大镜效果(magnifier)、阴影效果(shadow)
第一部分:鼠标交互
1.1 Draggables:拖拽
所需文件:
ui.mouse.js
ui.draggable.js
ui.draggable.ext.js
用法:文件载入后,可以拖拽class = "block"的层
$(document).ready(function(){
$(".block").draggable();
});
draggable(options)可以跟很多选项
选项说明:http://docs.jquery.com/UI/Draggables/draggable#options
选项实例:http://dev.jquery.com/view/trunk/plugins/ui/tests/draggable.html
1.2 Droppables
所需要文件,drag drop
ui.mouse.js
ui.draggable.js
ui.draggable.ext.js
ui.droppable.js
ui.droppable.ext.js
用法:
$(document).ready(function(){
$(".block").draggable({helper: 'clone'});
$(".drop").droppable({
accept: ".block",
activeClass: 'droppable-active',
hoverClass: 'droppable-hover',
drop: function(ev, ui) {
$(this).append("<br>Dropped!");
}
});
});
选项说明:http://docs.jquery.com/UI/Droppables/droppable#options
选项实例:http://dev.jquery.com/view/trunk/plugins/ui/tests/droppable.html
1.3 Sortables 排序
所需要的文件
jquery.dimensions.js
ui.mouse.js
ui.draggable.js
ui.droppable.js
ui.sortable.js
用法:
$(document).ready(function(){
$("#myList").sortable({});
});
dimensions文档http://jquery.com/plugins/project/dimensions
选项说明:http://docs.jquery.com/UI/Sortables/sortable#options
选项实例:http://dev.jquery.com/view/trunk/plugins/ui/demos/ui.sortable.html
1.4 Selectables 选择
所需要的文件
jquery.dimensions.js
ui.mouse.js
ui.draggable.js
ui.droppable.js
ui.selectable.js
用法:
$(document).ready(function(){
$("#myList").selectable();
});
选项说明:http://docs.jquery.com/UI/Selectables/selectable#options
选项实例:http://dev.jquery.com/view/trunk/plugins/ui/tests/selectable.html
1.5 Resizables改变大小
所需要的文件 ,此例子需要几个css文件
jquery.dimensions.js
ui.mouse.js
ui.resizable.js
用法:
$(document).ready(function(){
$("#example").resizable();
});
CSS文件:http://dev.jquery.com/view/trunk/themes/flora/flora.all.css
选项说明:http://docs.jquery.com/UI/Resizables/resizable#options
选项实例:http://dev.jquery.com/view/trunk ... s/ui.resizable.html
第二部分:互动效果
2.1 Accordion 折叠菜单
所需要的文件:
ui.accordion.js
jquery.dimensions.js
用法:
$(document).ready(function(){
$("#example").accordion();
});
CSS文件:http://dev.jquery.com/view/trunk/themes/flora/flora.all.css
选项说明:http://docs.jquery.com/UI/Accordion/accordion#options
选项实例:http://dev.jquery.com/view/trunk/plugins/accordion/?p=1.1.1
2.2 dialogs 对话框
所需要的文件:
jquery.dimensions.js
ui.dialog.js
ui.resizable.js
ui.mouse.js
ui.draggable.js
用法:
$(document).ready(function(){
$("#example").dialog();
});
CSS文件:http://dev.jquery.com/view/trunk/themes/flora/flora.all.css
选项说明:http://docs.jquery.com/UI/Dialog/dialog#options
选项实例:http://dev.jquery.com/view/trunk/plugins/ui/tests/dialog.html
2.3 sliders 滑动条
所需要的文件
jquery.dimensions.js
ui.mouse.js
ui.slider.js
用法:
$(document).ready(function(){
$("#example").slider();
});
CSS文件:http://dev.jquery.com/view/trunk/themes/flora/flora.all.css
选项说明:http://docs.jquery.com/UI/Slider/slider#options
选项实例:http://dev.jquery.com/view/trunk/plugins/ui/demos/ui.slider.html
2.4 Tablesorter表格排序
所需要的文件
ui.tablesorter.js
用法:
$(document).ready(function(){
$("#example").tablesorter({sortList:[[0,0],[2,1]], widgets: ['zebra']});
});
CSS文件:http://dev.jquery.com/view/trunk/themes/flora/flora.all.css
选项说明:http://docs.jquery.com/Plugins/Tablesorter/tablesorter#options
选项实例:http://tablesorter.com/docs/#Demo
2.5 tabs页签(对IE支持不是很好)
所需要的文件
ui.tabs.js
用法:
$(document).ready(function(){
$("#example > ul").tabs();
});
CSS文件:http://dev.jquery.com/view/trunk/themes/flora/flora.all.css
选项说明:http://docs.jquery.com/UI/Tabs/tabs#initialoptions
选项实例:http://dev.jquery.com/view/trunk/plugins/ui/tests/tabs.html
tabs ext http://stilbuero.de/jquery/tabs_3/rotate.html
第三部分:效果
3.1 Shadow 阴影
实例http://dev.jquery.com/view/trunk/plugins/ui/demos/ui.shadow.html
3.2 Magnifier 放大
实例http://dev.jquery.com/view/trunk/plugins/ui/demos/ui.magnifier.html
jQuery是继prototype之后又一个优秀的Javascrīpt框架。对prototype我使用不多,简单了解过。但使用上 jQuery之后,马上被她的优雅吸引住了。有人使用这样的一比喻来比较prototype和jQuery:prototype就像Java,而jQuery就像ruby.实际上我比较喜欢java(少接触Ruby 罢了)但是jQuery的简单的实用的确有相当大的吸引力啊!在项目里我把 jQuery作为自已唯一的框架类包。使用其间也有一点点心得,其实这些心得,在jQuery的文档上面也可能有讲,不过还是记下来,以备忘罢。
一,找到你了!
还记得$()这个东西吧?prototype还是DWR都使用了这个函数代替document.getElementById()。没错,jQuery也跟风了。为达到document.getElementById()的目的,jQuery是这样写的:
代码
var someElement = $("#myId");
看起来比其他两个框架的要多了一个#,好,看看下面的用法:
代码
$("div p");(1)
$("div.container")(2)
$("div #msg");(3)
$("table a",context);(4)
在prototype里看过这样的写法吗?第一行代码得到所有<div>标签下的<p>元素。第二行代码得到class 为container的<div>元素,第三行代码得到<div>标签下面id为msg的元素。第四行代码得到context为上下文的table里面所有的连接元素。
如果你熟悉CSS,Xpath,你会觉得这些写法很眼熟!对了。正是。看出奥妙了吧。jQuery就是通过这样的方式来找到Dom对象里面的元素。跟CSS的选择器相类似。
二,jQuery对象?
jQuery提供了很多便利的函数,如each(fn),但是使用这些函数的前提是:你使用的对象是jQuery对象。使一个Dom对象成为一个jQuery对象很简单,通过下面一些方式(只是一部分):
代码
var a = $("#cid");(1)
var b = $("<p>hello</p>");(2)
var c = document.createElement("table"); var tb = $(c);
三,代替body标签的onload
这个惯例,也许是除了$()之外,用得最多的地方了。下面一段代码:
代码
$(document).ready(function(){
alert("hello");
});(1)
<body onload="alert('hello');">(2)
上面两段代码是等价的。但代码1的好处是做到表现和逻辑分离。并且可以在不同的js文件中做相同的操作,即$ (document).ready (fn)可以在一个页面中重复出现,而不会冲突。基本上jQuery的很多plugin都是利用这个特性,正因为这个特性,多个plugin共同使用起来,在初始化时不会发生冲突。
不管怎么说,这个惯例可以分离javascrīpt与HTML。推荐使用。
四,事件机制
我大量使用的事件可能就是button的onclick了。以前习惯在input 元素上写onclick = "fn()",使用jQuery可以使 javascrīpt代码与html代码分离,保持HTML的清洁,还可以很轻松地绑定事件,甚至你可以不知道"事件"这个名词。
代码
$(document).ready(function(){
$("#clear").click(function(){
alert("i am about to clear the table");
});
$("form[0]").submit(validate);
});
function validate(){
//do some form validation
}
五,同一函数实现set&get
代码
$("#msg").html();
$("#msg").html("hello");
上面两行代码,调用了同样的函数。但结果却差别很大。
第一行是返回指定元素的HTML值,第二行则是将hello这串字符设置到指定元素中。jQuery的函数大部分有这样的特性。
六,ajax
这是一个ajax横行的时代。多少人,了不了解ajax的都跟着用上一把。呵。使用jQuery实现ajax同样简单异常
代码
$.get("search.do",{id:1},rend);
function rend(xml){
alert(xml);
} (1)
$.post("search.do",{id:1},rend);
function rend(xml){
alert(xml);
} (2)
$("#msg").ajaxStart(function(){
this.html("正在加载。。。。");
});(3)
$("#msg").ajaxSuccess(function(){
this.html("加载完成!");
});(4)
这些都是较常用的方法,get和post用法一样。第一个参数是异步请求的url,第二个为参数,第三个回调方法。
3,4的方法会在指定的Dom对象上绑定响应ajax执行的事件。当然,jQuery的AJAX相关的函数不仅是这些,有兴趣可以去研究再多。
七,渐入淡出
代码
$("#msg").fadeIn("fast");
$("#msg").fadeOut("slow");
没错,上面两行代码已经分别实现了一个id为Msg的jQuery对象的渐入和淡出。做一个像Gmail一样的动态加载通知条,用jQuery就那么简单。两个函数接受的参数除了快慢等,还可以接收整型,作为渐入或淡出的完成时间,单位为MS。
八,plugin
这也是一个插件的时代。
jQuery插件给我的感觉清一色的清洁,简单。如Jtip,要使用它的功能,只需要在你的元素的class上加上Jtip,并引入jtip.js及其样式即可以了。其他事情插件全包。我喜欢jQuery的一个重要原因是发现她已经有了很多很好,很精彩的插件。
写得很烂。可能大家看不出jQuery的好处。嗯,光听是没用的,试用一下吧。你会发觉很有趣。
暂时告一段落吧。待有新的发现再来分享。
Jquery资源:
http://www.visualjquery.com/index.xml 很好的API查询站点
http://jquery.com/demo/thickbox/ 知道lightBox吧,看看Jquery是怎样实现相同的东西
http://www.codylindley.com/blogstuff/js/jtip/ Jtip,实用的提示工具
http://jquery.com/plugins/ 很多牛的插件。
http://15daysofjquery.com/jquery 的15天教程 (转载)
开发第三方插件是我们提高jQuery代码经验的不错的选择,当我们的代码想要重用的时候,我们总是习惯把这些代码封装成一个插件,幸运的是在jQuery中这并不比写代码复杂多少。
添加一个新的全局函数
jQuery的全局函数也就是属于jQuery命名空间的函数,典型的例子就是$.AJAX()这个函数。将函数定义于jQuery的命名空间,我们只需要担心,它是否与其他函数存在冲突。
添加一个全局函数,我们只需如下定义:
jQuery.foo = function() { alert('This is a test. This is only a test.');};
调用的时候可以这样写:
jQuery.foo();
也可以这样写:
$.foo();
定义多个全局函数,如果我们的插件需要多个全局函数,可以如下定义
jQuery.foo = function() { alert('This is a test. This is only a test.');};jQuery.bar = function(param) { alert('This function takes a parameter, which is "' + param + '".');};
同时这两个方法我们可以如下调用
$.foo();$.bar('baz');
当然我们也可以使用$.extend()这个函数扩展来代替以上的定义
jQuery.extend({ foo: function() { alert('This is a test. This is only a test.'); }, bar: function(param) { alert('This function takes a parameter, which is "' + param +'".'); }});
以上效果是相同的,虽然在jQuery命名空间中,我们禁止使用了大量的javaScript函数名和变量名。但是仍然不可避免某些函数或变量名将于其他jQuery插件冲突,因此我们习惯将一些方法封装到另一个自定义的命名空间。
jQuery.myPlugin = { foo: function() { alert('This is a test. This is only a test.'); }, bar: function(param) { alert('This function takes a parameter, which is "' + param + '".'); }};
当然我们仍然可以认为这些函数为全局函数,我们可以如下调用
$.myPlugin.foo();$.myPlugin.bar('baz');
通过这个技巧(使用独立的插件名),我们可以避免命名空间内函数的冲突。
在使用jQuery的过程中,发现一些地方在自己的应用上出问题.查来查去,发现问题可能出自jQuery的代码上.以前也曾经发现过jQuery的bug,不过自己英文不好,不能用英文表达出来提交bug.那就先自己自足吧.
注意:这些bug是否是真的bug还有待考证
jQuery 1.2.6版
所在:$.httpData
BUG语句:if ( xml && data.documentElement.tagName == "parsererror" )
修正:if ( xml && null==data.firstChild)
原因:浏览器兼容性问题,data.documentElement不一定存在,当然后面的也就不对了,虽然整体看还是会正确执行,但是不够严谨
所在: $.fx.step._default
BUG语句: fx.elem.style[ fx.prop ] = fx.now + fx.unit;
增加: if (fx.now<0 && fx.prop.search(/width|height/i)>=0) fx.now=0;
原因:有些插件,比如LavaLamp,会令 now < 0为负值,应该是LavaLamp的BUG,不过在这里处理的话,就一了百了了.
所在: $.browser
语句: 增加一个属性以方便switch($.browser.is)结构的操作
增加: is:(userAgent.match(/.*(webkit|opera|msie|firefox|mozilla)/) || [])[1]
原因: 适应了switch语法