Flash开发者学习jQuery指南(译)
偶然在nettuts+中看到本年度的热门文章,有这篇。想来flash和jQuery都比较熟悉,就翻了下,内容很浅显,但还是有收获。个人觉得,前端无限可能,另外,仅仅是jQuery或许还不够,angularJS是我近期看到的一个好东西……
或许你和大多数flash开发者一样正准备在web应用中使用HTML5,这几乎就免不了碰上jQuery。jQuery是非常风靡的Javascript库,大部分流行的网站都使用它。
背景
如果你了解AS3,基本就已经掌握一些JavaScript了,这两种语言非常相似。这诱使我们迫不及待的想一头扎进去写代码——不过,有几个重要的概念需要提前搞懂,其中之一就是DOM。
当网页加载时,浏览器将单调的HTML转换成一个树状结构,这被称作DOM(Document Object Model)。JavaScript的DOM,像极了ActionScript 的显示列表(Display List),另外如果你还是个Flex的开发者,你还能发现MXML和HTML之间的相似之处。
在Flash中,我们可以通过display list 访问特定的显示对象,像stage.getChildAt(3).getChildAt(0),不过,这样写有些傻,取而代之的是我们经常赋予显示对象以实例名称(在Flash IDE中的做法),或者将他们的引用存储在变量、数组或者对象属性中,比如dialogBox.okButton = new simpleButton().
在JavaScript中,我们能够完全通过JS构建DOM然后告诉浏览器将其渲染,不过一般我们不这么做,更多的是通过HTML定义DOM,用少量的JS代码进行功能上的增强。因此,Javascript有花样繁多的方法访问DOM中的元素。
这里面最简单的是 document.getElementById()。假如我们有这样一个HTML文件:
<!DOCTYPE html> <html> <head> <title>Example Page</title> </head> <body> <div> <span id="example"> <!-- 这里 --> <p>Here's some example text.</p> </span> </div> </body> </html>
那么,document.getElementById(“example”)将会把注释出来的(PS:木办法,这里高亮不出来)的span从DOM中取出来。然后我们可以像下面这样加上两个p标签:
var newPara = document.createElement("p"); var newTextNode = document.createTextNode("More example text that we created on the fly."); newPara.appendChild(newTextNode); document.getElementById("example").appendChild(newPara);
这样,DOM就会更新,这与下面这段HTML代码是等价的:
<!DOCTYPE html> <html> <head> <title>Example Page</title> </head> <body> <div> <span id="example"> <p>Here's some example text.</p> <p>More example text that we created on the fly.</p> </span> </div> </body> </html>
如果要访问这两个p元素怎么办?我们不能直接通过document.getElementById()访问,因为他们没有ID,但我们可以使用document.getElementByTagName(“p”)得到一个包含有他们的数组。
如果我们有了另外一个span,像这样:
<div> <span id="example1"> <p>Here's some example text.</p> <!-- 这里 --> <p>More example text that we created on the fly.</p> <!-- 这里 --> </span> <span id="example2"> <p>A second span.</p> <p>We don't care about these paragraphs.</p> </span> </div>
如果我们只想得到注释中的p标签,就应该使用
document.getElementById(“example1”).getElementsByTagName(“p”)来调用。所有这些DOM都在树状结构中的某一级上运行,就像每个Flash DisplayObjectContainer都有一个getChildAt()方法一样。
有够简单易懂吧!不过,还有些问题。首先,你或许听到也不会感到意外,和IE有关。(那些和IE有关的日子啊,呵呵)
跨浏览器兼容
Impressivewebs.com有一个关于IE的getElementById()问题的略述。基本上是这样的,如果你有一个如下的HTML元素:
<span name="exampleName"></span>
那么,在IE7中,document.getElementById(“exampleName”)将会返回span(其他浏览器使用 document.getElementsByName(“exampleName”)[0]返回)。
这意味着,如果要跨浏览器(假设我们不改变HTML),我们需要如下编码:
var theSpan; if (usingIE) { //假定已判断为IE,不解释
var temp = document.getElementById("exampleId"); //这里会返回有 "exampleId"的元素, 所以必须: if (temp.getAttribute("id") == "exampleId") { theSpan = temp; } } else { theSpan = document.getElementById("exampleId"); }
更加广泛的做法,我们将其写成一个可复用的函数:
function getElById(id) { if (usingIE) { var temp = document.getElementById(id); if (temp.getAttribute("id") == id) { return temp; } } else { theSpan = document.getElementById(id); } }
现在好极了!可不幸地是,像这样操蛋的小差异比比皆是。如果你是直接从Flash背景中过来的这可能会惊倒你,在Flash中所谓“兼容问题”仅仅意味着Flash Player在一些平台上会有些小慢而已。
jQuery解决了这些。他用自身的一系列方法堵上了不同浏览器之间的缝隙,IE6以上浏览器用户都可以看到一致的界面。
这还仅仅是jQuery让JavaScript易用的一方面。
简化语法
回头看下这段HTML片段,假设我们要从DOM中获取注释里的p元素
<div> <span id="example1"> <p>Here's some example text.</p> <p>More example text that we created on the fly.</p> </span> <span id="example2"> <p>A second span.</p> <p>We don't care about these paragraphs.</p> </span> </div>
使用jQuery,我们这么写就行了:
jQuery("#example1 p")
#example1 等于说 “从ID是example1的元素中取元素”,p等于说“从子元素中取出所有的p元素”,它返回一个“jquery对象”,它是一个JavaScript对象,包含JS DOM的两个p元素自身加上一些jQuery特定的属性和方法。
还可以将代码在缩短一些,用$代替jQuery--没啥玄机,$就是一个短的变量名称。和原生的JS代码比较一下:
//regular JS, without cross-browser compatibility: document.getElementById("example1").getElementsByTagName("p") //jQuery, with cross-browser compatibility built in: $("#example1 p")
不光能让代码简洁,jQuery还与CSS保持一致性。我们可以用几乎相同的选择器在jQuery()内部来改变段落的样式:
#example1 p {color:red}
这仅仅是一个简单不过的例子,我也不打算深入下去,我相信你会看到CSS和jQuery使用相同选择器的好处。
选个区就行了
我曾提到,$()有额外的方法和属性来返回jQuery对象,这让编码大大简化。
例如,我们可以给p元素添加上鼠标点击事件侦听器和处理函数。
$("#example1 p").click(function() { alert("You clicked a paragraph!"); });
或者,让他们不可见
$("#example1 p").hide();
抑或,在上面跑点普通的JavaScript
var allText = ""; $("#example1 p").each(function() { allText += $(this).text(); });
jQuery提供了一个简单一致的方法,大大提高了效率。
Tweens and Transitions
因为Flash本身就是做动画用的,所以它内置了大量的动画功能--不管是用Flash IDE还是用Tween类,更不用说各种tween的类库了。
Javascript就不一样了,动画性先天不足。不过,少量的动画过渡也是现代web应用值得期待的部分:如果我在帖子里提交了一个新评论,他能滑过来;如果我删除了购物车中的某一项,能够变红再消失。如果没有了这些,web应用也会暗泽无光。
jQuery增添了少量的过渡动画。
例如,我们想让上面的一些段落在被点击时淡出:
$("#example1 p").click(function() { $(this).fadeOut(); });
如果不想使用默认效果,可以通过一个duration和callback传给fadeOut()方法。
有时想做一个稍微猛一点儿的,可以用animate()方法,本质上是补间动画。
虽然不能像Greensock,但可远远比从头写方便多了。
就说这些。
UI部件
HTML只内置了少量的UI组件,比如按钮,文本框。HTML5定义了一少部分新玩意儿,像弹出日历拾取器和颜色拾取器(目前仅支持Opera)。
对于要创建一个丰富、现代的web应用这是远远不够的。没有tabs,没有进度条,甚至没有一个简单的对话窗口(alert和prompt就算了吧)。
jQuery UI,是建立在jQuery之上的一个可选库,增添了这些附加部件,方法和事件与普通的jQuery语法保持一致。把他想象成为Keith Peter的AS3 MinimalComps吧。这里是DEMO。
每个部件都可以自定义主题。
学习资源
1、jQuery for Absolute Beginners
2、More Things I Learned from the jQuery Source (FQ吧,骚年)
3、本人推荐《锋利的jQuery》