Ajax 板


LINE

※ [本文转录自 Web_Design 看板] 作者: TonyQ (沉默是金) 看板: Web_Design 标题: [心得]从 js 到 jQuery 之三:可怕的事件丛林 时间: Sat Aug 9 02:57:09 2008 感谢前两篇各位版友的不吝支持 , 接下来要推出第三篇 , 还请各位版友多多指教、讨论。︿︿ 希望看完这篇 , 你们能了解网页上得事件有哪些 , 以及为什麽事件在跨平台这件事情上是件很棘手的事情. ──────────────────────────────── 继「无所遁形的selector」一文体验到的强大 jquery selector , 暂且让我们放下 jquery 物件的各种attr css 的属性不谈 , 先来谈谈我们之前所讲过 , javascript最重要的触发点:事件. ──────────────────────────────── @事件,网页乐团中的鼓手。 事件掌握着网页上得所有节奏 , 就算你完全不使用任何javascript , 当你浏览网页 , 就起码有读取(onload)跟离开(onunload)正在默默进行 , 当然要奏出美妙乐曲 , 还得要整个乐团的配合 , javascript 就是这整个 事件中的指挥家 , 指挥着各项元素各司其职, 演出一场美妙的狂想曲. 事实上 , 当我看到这个网页时 , 才深深地体会js 的可能性. http://www.nihilogic.dk/labs/mario/mario_small_music.htm @事件听起来是个通用名词,那我们有哪些事件呢? 事件一定绑定(binding)着一个 dom物件, 这是先介绍selector的理由。 基本上大部分事件是所有元素通用的 , 比方说onmouseover , onclick等 , 也有些事件只有某些物件会使用 , 像是 onchange , onsubmit 等 . 底下简单列表 , 将我们今天的各大主角简单列出来 on click 物件被按下 on change 物件内容改变(select,input text等form类型元件专用) on mouseover 滑鼠进入dom元件四周的那一刹那触发 on mouseout 滑鼠离开元件四周时触发 on mousemove 介於over跟out之间的所有移动行为(会频繁触发) on focus 当元件被点选 或者透过tab键取得焦点时触发 on load 在网页最一开始读取完成时执行 , 常用於body或iframe. on keydown 按下键盘按键时 ,主要用於body跟input text. on keyup 放开键盘按键时 还有更多其他种类 可见此网页详细介绍 , http://stuck.myweb.hinet.net/c/js/js_events.htm @这麽多种? 我统统都会用到吗? 我自己常用的是前面七个 , 其中又以 click mouseover mouseout load居多, 各种事件常见的应用情境跟组合虽然非常有趣 , 但还是先留待以後再做介绍, 我们这篇接下来要告诉大家的是 , 「什麽是事件」. @什麽? 前面的介绍还不够详细吗? 乍看之下你似乎知道所有事情 , 但继续耐心看下去 , 你会了解前面介绍的只是事件的一半左右而已 , 接下来我们要教你的仍然是书上所不常提到 , 但是非常有趣的事情. @不是就像click一样 , 按下去就一个事件吗? 没错 , 在某些状况下是这样 , 你不需要了解任何事件的细节 , 就只是在对应的触发时间点执行js 不需要任何其他资讯 . 但是当你想在网页上追踪你的滑鼠游标时 , 当你想知道你按下的键盘按键 究竟是哪一颗按键时 ,或者看完mario之後 , 你可能会有雄心壮志想做个网页版的格斗天王之类的 , 那你就需要一些关於事件的资讯. @事件纪录者的欢喜与忧愁 值得高兴的事情是 , 浏览器早就帮你想到了这件事情 , 於是每个事件必定会伴随着一个纪录事件资讯的物件.(底下以event代称) event物件会纪录是谁触发了这个事件(srcElement), 滑鼠游标移到哪,或者keydown按下的按键是哪一个(keycode)之类的。 许多特效诸如tooltip , dragand drop 都是根据这些资讯做出来的 , 既然如此 , 那为什麽要说忧愁呢? 身为一个有志气的网页设计师, 你应该会想要至少支援Firefox跟ie双平台 , 或者甚至於像笔者我所在的公司有两位同事是mac爱好者 , safari 也是我们 需要考虑的对象. @能跨浏览器当然好呀 , why not? 问题在於这些浏览器对於事件参数的支援都各有一些不同的解读 , 就以取得 event物件来讲好了 , ie 提供 window.event 可取得, firefox则需要透过function传递参数. 而且事件提供的内容来讲 , 更是各家都有所不同 , 像是要透过事件取得被绑定的对象是谁 , ie下是event.target, firefox下是 event.srcElement, 诸如此类的 . 在你撰写程式码时需要时时注意,是否需要写一些 if-else , 以达到不同浏览器一样的效果. @看起来跨浏览器很麻烦... 没错!所以有些人选择只支援 ie体系 , ie only的是非不是我们所关心的 , 我们有更好的选择!就是选用 jQuery当我们的平台媒介! 在jQuery底下 , 常见浏览器有支援的事件元素 , 全部被整合为同样的介面, 而我们所关心的事件物件如何取得 , 则是透过function传入param的方式. 有兴趣的朋友们可以分别用fx跟ie开这个sample页 , 透过mousemove一窥事件的全貌. http://tonyq.org/test/testMousemove.html 左右皆是将事件内容印出来的结果. 左边是jquery element的内容物 , 右边是当前browser的内容物. 可以发现fx跟ie底下右边的资料会有所不同 , 左边则是一致的. 在大部分的状况下 , jQuery 都将 跨平台的问题谨记在心, 除了部份严重issue (ex. ie6 bgirame) 等需特别处理外 , jQuery通常能达到足以令人满意的跨平台效果. (之後应会有机会继续介绍其他跨平台特性的部份。) @一个元素只能绑定一种事件吗? 答案当然是否定的 , 比方说我可能会希望 mouseover移动过inputtext, 时该text自动取得焦点(focus) , text改变时自动做一些检查(change). 很多时候我们会用事件去呼叫别的元素执行事件 , 达到连环事件的效果. @可以在javascript中绑定事件吗? 你可以把 onclick 等参数视为 dom成员中的一种 , 赋予其对应的事件成员一个 function 物件. 比方说 inputNode.onclick=function(){ alert("hi");}; 就是针对inputNode绑定onclick事件. 但是透过 = 指定的话 , 之前绑订的事件会被覆盖 , 如果你希望是附加而非覆盖的话 , 应该要透过 attachEvent的方式进行. 这里又有浏览器相容性的问题 attachEvent是ie only , addEventListener 则是 firefox有支援的 . @天啊怎麽又来了!!难道就没有跨浏览器的好解法? 现在你知道为什麽我们要特地强调跨浏览器平台了吧(耸肩) 别担心 , 要绑定几次都没问题 , jQuery会帮我们处理好一切的. $("#ele").click(function(e){alert("hi");}) .click(function(e){alert("hi");}) .click(function(e){alert("hi");}) .click(function(e){alert("hi");}); 你看 我们这不就绑定了四个事件给ele了吗? ( http://tonyq.org/test/testEventBinding.html ) @咦? $("#ele").click(event).click(event) ...? 这是jquery的有趣特性之一 , 他几乎所有成员都会回传jquery物件本身, 所以我们可以达成这种称之为「method chaining」的效果. 当然你想中规中矩的写成 $("#ele").click(function(e){alert("hi");}); $("#ele").click(function(e){alert("hi");}); 也无妨 , 一切取决於你的习惯. 当物件被click时 , 会按照绑定的顺序依序触发. (当你不想要时 , 可透过 $("#ele").unbind("click") 来解除所有事件.)) @事件真是复杂 , 还有我应该知道的吗? 关於事件其实我们聚焦在基础资料的介绍 , 因为我们认为 你早晚会知道 hover事件 = mouseover + mouseout , 以及原来想要到处都摆个click+ajax的慾望是如此让人兴奋(害怕). 但是还有一件事情我们还没有告诉你 , 那就是事件的相依性. 在能见到的区域中 , body是所有元素的根源 , 相信你不会否认这句话 , 当你在页面上绑定一个元素, (以下例中的 input button) <body > <div> <input type="button" value="button" /> </div> </body> 则当button被click时 , div跟body的onclick也会被触发. 因为button实际上也是div的成员 , div也会把它视为一体的触发 同样的理由 , 所以对body也触发 , 有些时候我们会需要用这个trick 实做一些事情. @那能不能让他不要触发上级的元素呢? 可以 ,对事件方法 return false ; 告诉他我执行到这里就结束. ex. $("[type=button]").click(function(e){return false;}); 相依性最常见的用途在於检查表单资料是否正确填写 , 我们可以透过 $("form").submit( function(e){ if($("#inputdata").val()=="") //如果某个input text是空白 return false; //我就不submit了 } ); @体验时间 我们今天介绍的是 jquery corner这只plug-in , 可以帮你把区块式的元件很轻松的加上圆角的效果 . http://tonyq.org/jqtalk/jq3_jqCorner.html --- 刚刚历经pcman当掉跟差点睡着 的危机, 总算还是顺利写完了 , 祝各位版友周末愉快..需要加班的也能早点休息 :) 最後再补一些注意事项 , 例子大多是针对CLICK写 , 不过其他的事件其实大同小异, 另外 js 使用过度有害网页健康 , 请不要真的作成到处都click +ajax, 以及各种酷炫特效不断充斥 , 大多数状况下这样会导致网页执行起来有笨重的感觉. -- What do you want to have ? / What do you have? 从书本中,你可以发现我的各种兴趣。 从CD中,你可以了解我所喜欢的偶像明星。 或许从文字你很难以了解一个人,但从物品可以。 My PPolis , My past. http://ppolis.tw/user/Tony --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.59.247 ※ 编辑: TonyQ 来自: 220.132.59.247 (08/09 03:01) --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.59.247
1F:→ TonyQ:JQ Corner 官网 http://malsup.com/jquery/corner/ 08/09 03:07
2F:→ awpadam:请问我可以用jquery侦测滑鼠中键滚轮事件吗 08/09 10:30
3F:→ awpadam:我想做出如http://www.plurk.com/browse 08/09 10:31
4F:→ awpadam:上方可以用滚轮卷动的效果 08/09 10:31
5F:→ kosgroup:推 05/04 02:43
6F:推 etman395:推 08/16 02:36
※ 编辑: TonyQ 来自: 61.224.239.208 (12/15 23:58)
7F:推 Ting1024:XDDD 04/07 03:00







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP