常用的JavaScript自定义函数

常用的JavaScript自定义函数
常用的JavaScript自定义函数

常用的JavaScript自定义函数

JavaScript自定义函数在平时的开发过程中比较实用,这里介绍的是个最常用的十个JavaScript自定义函数主要涉及添加事件与移除事件等等。

(10)addEvent

网上最流行的版本是Scott Andrew的,据说javascript界曾举行一场比赛(此事件我们可以在Pro Javascript Techniques第100页看到)或浏览PPK的网站,征求添加事件与移除事件的函数,他就是其获奖者。下面就是他的实现:

1.function addEvent(elm, evType, fn, useCapture) {

2.if (elm.addEventListener) {

3. elm.addEventListener(evType, fn, useCapture);//DOM2.0

4.return true;

5. }

6.else if (elm.attachEvent) {

7. var r = elm.attachEvent('on' + evType, fn);//IE5+

8.return r;

9. }

10.else {

11. elm['on' + evType] = fn;//DOM 0

12. }

13.}

下面是Dean Edwards 的版本

14.// addEvent/removeEvent written by Dean Edwards, 2005

15.// with input from Tino Zijdel

16.// https://www.360docs.net/doc/8217030689.html,/weblog/2005/10/add-event/

17.function addEvent(element, type, handler) {

18.//为每一个事件处理函数分派一个唯一的ID

19.if (!handler.$$guid) handler.$$guid = addEvent.guid++;

20.//为元素的事件类型创建一个哈希表

21.if (!element.events) element.events = {};

22.//为每一个"元素/事件"对创建一个事件处理程序的哈希表

23. var handlers = element.events[type];

24.if (!handlers) {

25. handlers = element.events[type] = {};

26.//存储存在的事件处理函数(如果有)

27.if (element["on" + type]) {

28. handlers[0] = element["on" + type];

29. }

30. }

31.//将事件处理函数存入哈希表

32. handlers[handler.$$guid] = handler;

33.//指派一个全局的事件处理函数来做所有的工作

34. element["on" + type] = handleEvent;

35.};

36.//用来创建唯一的ID的计数器

37.addEvent.guid = 1;

38.function removeEvent(element, type, handler) {

39.//从哈希表中删除事件处理函数

40.if (element.events && element.events[type]) {

41. delete element.events[type][handler.$$guid];

42. }

43.};

44.function handleEvent(event) {

45. var returnValue = true;

46.//抓获事件对象(IE使用全局事件对象)

47.event = event || fixEvent(window.event);

48.//取得事件处理函数的哈希表的引用

49. var handlers = this.events[event.type];

50.//执行每一个处理函数

51.for (var i in handlers) {

52.this.$$handleEvent = handlers[i];

53.if (this.$$handleEvent(event) === false) {

54. returnValue = false;

55. } }

56.return returnValue;

57.};

58.//为IE的事件对象添加一些“缺失的”函数

59.function fixEvent(event) {

60.//添加标准的W3C方法

61.event.preventDefault = fixEvent.preventDefault;

62.event.stopPropagation = fixEvent.stopPropagation;

63.return event;

64.};

65.fixEvent.preventDefault = function() {

66.this.returnValue = false;

67.};

68.fixEvent.stopPropagation = function() {

69.this.cancelBubble = true;

70.};

功能非常强悍,解决IE的this指向问题,event总是作为第一个参数传入,跨浏览器就更不在话下。

另,我还珍藏了一个HTML5工作组的版本:

71.var addEvent=(function(){

72.if(document.addEventListener){

73.return function(el,type,fn){

74.if(el.length){

75.for(var i=0;i

76. addEvent(el[i],type,fn);

77. }

78. }else{

79. el.addEventListener(type,fn,false);

80. }

81. };

82. }else{

83.return function(el,type,fn){

84.if(el.length){

85.for(var i=0;i

86. addEvent(el[i],type,fn);

87. }

88. }else{

89. el.attachEvent('on'+type,function(){

90.return fn.call(el,window.event);

91. });

92. }

93. };

94. }

95.})();

(9)addLoadEvent()

我以前讨论过这函数,不细说,就是慢了一点,各大类库基本无视它,自行实现domReady版本。下面是Simon Willison 的实现:

96.var addLoadEvent = function(fn) {

97. var oldonload = window.onload;

98.if (typeof window.onload != 'function') {

99. window.onload = fn;

100. }else {

101. window.onload = function() {

102. oldonload();

103. fn();

104. }

105. }

106.}

(8) getElementsByClass()

我有收集癖,手头上拥有许多版本,最后集思广益自己实现了一个。下面是我的实现:107.var getElementsByClassName = function (searchClass, node,tag) { 108.if(document.getElementsByClassName){

109.return document.getElementsByClassName(searchClass)

110. }else{

111. node = node || document;

112. tag = tag || "*";

113. var classes = searchClass.split(" "),

114. elements = (tag === "*" && node.all)? node.all : node.getEle mentsByTagName(tag),

115. patterns = [],

116. returnElements = [],

117. current,

118. match;

119. var i = classes.length;

120.while(--i >= 0){

121. patterns.push(new RegExp("(^|\\s)" + classes[i] + "(\\s| $)"));

122. }

123. var j = elements.length;

124.while(--j >= 0){

125. current = elements[j];

126. match = false;

127.for(var k=0, kl=patterns.length; k

128. match = patterns[k].test(current.className);

129.if (!match) break;

130. }

131.if (match) returnElements.push(current);

132. }

133.return returnElements;

134. }

135.}

(7)cssQuery()

别名为getElementsBySeletor,由Dean Edwards最先实现,Prototype.js,JQuery等类库都有相应实现,其中JQuery把它整合到$()选择器中,名声盖过其前辈。不过IE8等新锐浏览器已经实现querySelector与querySelectorAll方法,待到

IE6与IE7报废之日,它就无用了。无忧里有它的实现原理讲解。由于太长,就不粘出来了,具体可到原作者网站看看。

(6)toggle()

用来显示或隐藏一个DOM元素。

136.function toggle(obj) {

137. var el = document.getElementById(obj);

138.if ( el.style.display != 'none' ) {

139. el.style.display = 'none';

140. }

141.else {

142. el.style.display = '';

143. }

144.}

(5)insertAfter()

DOM只提供了insertBefore,我们很有必要自己实现insertAfter。不过我认为insertAdjacentElement是更好的选择,现在除了火狐其他浏览器都实现这个方法。下面是Jeremy Keith的版本:

145.function insertAfter(parent, node, referenceNode) {

146. parent.insertBefore(node, referenceNode.nextSibling);

147.}

(4)inArray()

用于判断检查数组中是否存在某个值,下面方法取自Prototype类库。

148.Array.prototype.inArray = function (value) {

149.for (var i=0,l = this.length ; i

150.if (this[i] === value) {

151.return true;

152. }

153. }

154.return false;

155.};

(3) getCookie(), setCookie(), deleteCookie()

做BBS与商业网站的应该经常用到,无理由每次都要让用户输入密码登录吧。我们需要借助cookie实现自动登录功能。

156.function getCookie( name ) {

157. var start = document.cookie.indexOf( name + "=" );

158. var len = start + name.length + 1;

159.if ( ( !start ) && ( name != document.cookie.substring( 0, name.

length ) ) ) {

160.return null;

161. }

162.if ( start == -1 ) return null;

163. var end = document.cookie.indexOf( ';', len );

164.if ( end == -1 ) end = document.cookie.length;

165.return unescape( document.cookie.substring( len, end ) );

166.}

167.function setCookie( name, value, expires, path, domain, secure ) {

168. var today = new Date();

169. today.setTime( today.getTime() );

170.if ( expires ) {

171. expires = expires * 1000 * 60 * 60 * 24;

172. }

173. var expires_date = new Date( today.getTime() + (expires) );

174. document.cookie = name+'='+escape( value ) +

175. ( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()

176. ( ( path ) ? ';path=' + path : '' ) +

177. ( ( domain ) ? ';domain=' + domain : '' ) +

178. ( ( secure ) ? ';secure' : '' );

179.}

180.function deleteCookie( name, path, domain ) {

181.if ( getCookie( name ) ) document.cookie = name + '=' +

182. ( ( path ) ? ';path=' + path : '') +

183. ( ( domain ) ? ';domain=' + domain : '' ) +

184.';expires=Thu, 01-Jan-1970 00:00:01 GMT';

185.}

(2)getStyle()与setStyle()

所有UI控件都应该存在的函数,动态设置样式与获取样式。这个可以写得很短,也可以写得很长,但要精确取得样式,一个字:难!但我发现许多问题都是发端于IE,微软的开发人员好像从来不打算给出getComputedStyle这样的函数,与之相近的currentStyle会返回auto,inhert, ' '等让你哭笑不得的值,这还没有算上IE怪癖模式带来的难度呢!各类库的实现是非常长与难分离出来的,下面是我实现的版本:186.function setStyle(el,prop,value){

187.if(prop == "opacity" && !+"\v1"){

188.//IE7 bug:filter 滤镜要求 hasLayout=true 方可执行(否则没有效果)189.if (!el.currentStyle || !el.currentStyle.hasLayout) el.style.zo om = 1;

190. prop = "filter";

191.if(!!window.XDomainRequest){

192. value ="progid:DXImageTransform.Microsoft.Alpha(style=0,opaci ty="+value*100+")";

193. }else{

194. value ="alpha(opacity="+value*100+")"

195. }

196. }

197. el.style.cssText += ';' + (prop+":"+value);

198. }

199. function getStyle(el, style){

200.if(!+"\v1"){

201. style = style.replace(/\-(\w)/g, function(all, letter){

202.return letter.toUpperCase();

203. });

204.return el.currentStyle[style];

205. }else{

206.return document.defaultView.getComputedStyle(el, null).getPrope rtyValue(style)

207. }

208. }

有关setStyle还可以看我另一篇博文,毕竟现在设置的样式都是内联样式,与html 混杂在一起。

(1)$()

实至名归,最值钱的函数,可以节省多少流量啊。最先由Prototype.js实现的,那个洪荒时代遗留下来的珍兽,现在有许多变种。

209.function $() {

210. var elements = [];

211.for (var i = 0; i < arguments.length; i++) {

212. var element = arguments[i];

213.if (typeof element == 'string')

214. element = document.getElementById(element);

215.if (arguments.length == 1)

216.return element;

217. elements.push(element);

218. }

219.return elements;

220.}

Javascript综合应用小案例

按需求弄了一个取词以及标红的小应用。 先上demo :/ 很多平时常用的东西,都用上了,所以拿出来说说。 一、代码 View Code 以上是所有js代码,比较长,下面将列举一些比较突出的点(望高人多多指点)。 二、代码分析 1.获取文本 getSelectionText: function(){ if(window.getSelection) { return window.getSelection().toString(); } else if(document.selection && { return; } return ''; } 这个在以前(JavaScript操控光标,你会么?)的文章里也说过,就不赘述了。 2.创建控制框 createBtn: function(evt){ var button = document.createElement("div"), //...csses= { "height" : "30px", "line-height" : "30px", "position": "absolute", "top": y + 10 + "px", "left": x + 10 + "px", "cursor": "pointer", "border": "1px solid #000", "background": "#EEE", "padding": "2px 8px", "border-radius": "3px" }; for(i in csses){

if(csses.hasOwnProperty(i)){ cssList += i + ":" + csses[i] + ";"; } } =cssList; button.innerHTML = "添加到关键词列表"; button.setAttribute("id", "btn"); //...} 这里有一点我想说说,在写js的时候,会经常涉及到对DOM对象style的处理,如果不想额外加入一个plugins.css之类的文件,可以像上面一样,将样式放置在一个对象中,然后利用for in将其写入,本来开始我用的是 obj.style[i] = csses[i]; 不知道为什么,在IE下报错了,后来便用cssText代替。 效果: 3.标红 //关键词标红 setRed: function(str){ var content = this._("article"), temp = '(' + str + ')'; reg = new RegExp(temp,'g'); content.innerHTML = , "$1"); } 这里主要就是正则表达式的事情了,正则的话,推荐两篇文章 ?一篇是司徒正美的,讲的比较全面,比较系统。点我链接过去→ ?一篇是30分钟搞定正则,这个讲说是对所有语言,JS的话正则这一块还不是特别完善和强大。点我链接过去→ 哈哈,相信用过正则的人不需要我来解释这个$1了吧,他的意思就是匹配到的第一个。 当然,删除标红和这个原理是差不多的。 //删除标红 rmRed: function(str){ var content = this._("article"), temp = "()"; reg = new RegExp(temp,'g i'); content.innerHTML = , str); }

《HTML CSS JavaScript网页制作案例教程》_教学大纲讲解

《HTML+CSS+JavaScript网页制作案例教程》课程教学大纲 (课程英文名称) 课程编号:201509210011 学分:5学分 学时:64学时(其中:讲课学时:45 上机学时: 19 ) 先修课程:计算机基础、计算机网络、计算机应用 后续课程:UI设计、 JavaScript网页特效 适用专业:信息及其计算机相关专业 开课部门:计算机系 一、课程的性质与目标 《HTML+CSS+JavaScript网页制作案例教程)》是面向计算机相关专业的一门专业基础课,涉及网页基础、HTML标记、CSS样式、网页布局、JavaScript 编程基础与事件处理等内容。通过本课程的学习,学生能够了解HTML、CSS及JavaScript语言的发展历史及未来方向,熟悉网页制作流程、掌握常见的网页布局效果、学会制作各种企业、门户、电商类网站。 二、课程的主要内容及基本要求 第一章网页那点事(2学时) [知识点] 认识网页 常见的互联网专业术语 Web标准 HTML简介 CSS简介 JavaScript简介 常用浏览器介绍 Dreamweaver 工具的使用

使用Dreamweaver创建第一个页面 [重点] Web标准 Dreamweaver工具的使用 [难点] Web标准 Dreamweaver工具创建第一个页面 [基本要求] 了解Web标准,明确HTML、CSS及JavaScript在其中的作用。 熟悉Dreamweaver工具的基本操作,能使用Dreamweaver创建简单的网页。第二章从零开始构建HTML页面(4学时) [相关案例] 【案例1】简单的网页: 【案例2】新闻页面: 【案例3】图文混排: [知识点] HTML文档基本格式

javascript 内置函数和对象

实验项目三内置函数和对象 【学时数】 2 (45 分钟× 2=90 分钟) 【实验内容】 1 、JavaScript 内置函数的应用 2 、JavaScript 内置对象的应用 【实验参考】 《网页设计与制作》………………………………………………………… 重庆大学出版社 《网页标题制作技巧与实例》……………………………………………… 清华大学出版社 《javascript 入门与提高》……………………………………………… 清华大学出版社 《javascript 宝典》……………………………………………………… 电子工业出版社 【实验设备】 计算机,投影机 【实验目的与要求】 1 、掌握JavaScript 内置函数的使用方法 2 、掌握JavaScript 常用内置对象的属性和方法 【实验重点】 1 、掌握JavaScript 内置函数的使用方法 2 、掌握JavaScript 常用内置对象的属性和方法 【实验难点】 1 、掌握使用浏览器对象提供的信息来完成一定功能的网页设计。 【实验方式】 1 、项目工程互动式教学法 2 、“讲、学、练”相结合:对于javascript 内置函数和对象相关细节,大量采用演示、讲解和操作等方式。使学生在实验中加深对相关内容的理解并熟练掌握。 【实验设计】 向学生演示多个javascrip 内置函数和对象的程序案例,学生跟着教师一起完成javascript 程序的编写,同时完成教师布置的思考题,教师实施指导。 第一步:演示JavaScript 内置函数的应用,学生按照教师的操作步骤,自己动手编写该程序,并完成教师布置的思考题。(20 分钟左右)第二步:演示JavaScript 常用内置对象的应用,学生按照教师的操作步骤,自己动手编写该程序,并完成教师布置的思考题。(35 分钟左右) 【实验过程】 实验内容一:JavaScript 内置函数的应用

理解JavaScript中函数的使用

理解JavaScript中函数的使用 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解。 JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的。通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或者将函数作为参数传递。在继续讲述之前,先看一下函数的使用语法: function func1(…){…} var func2=function(…){…}; var func3=function func4(…){…}; var func5=new Function(); 这些都是声明函数的正确语法。它们和其他语言中常见的函数或之前介绍的函数定义方式有着很大的区别。那么在JavaScript中为什么能这么写?它所遵循的语法是什么呢?下面将介绍这些内容。 认识函数对象(Function Object) 可以用function关键字定义一个函数,并为每个函数指定一个函数名,通过函数名来进行调用。在JavaScript解释执行时,函数都是被维护为一个对象,这就是要介绍的函数对象(Function Object)。 函数对象与其他用户所定义的对象有着本质的区别,这一类对象被称之为内部对象,例如日期对象(Date)、数组对象(Array)、字符串对象(String)都属于内部对象。这些内置对象的构造器是由JavaScript本身所定义的:通过执行new Array()这样的语句返回一个对象,JavaScript内部有一套机制来初始化返回的对象,而不是由用户来指定对象的构造方式。 在JavaScript中,函数对象对应的类型是Function,正如数组对象对应的类型是Array,日期对象对应的类型是Date一样,可以通过new Function()来创建一个函数对象,也可以通过function关键字来创建一个对象。为了便于理解,我们比较函数对象的创建和数组对象的创建。先看数组对象:下面两行代码都是创建一个数组对象myArray: var myArray=[]; //等价于 var myArray=new Array();

《HTML+CSS+JavaScript网页制作案例教程》课程教学

传智播客 《HTML+CSS+JavaScript网页制作案例教程》 教学设计 课程名称:HTML+CSS+JavaScript网页制作案例教程 授课年级:2015年级 授课学期:2015学年第二学期 教师姓名:某某老师

201 年月日 课题名称第5章列表与超链接 计划 课时 6课时 内容分析通过第4章盒子模型的学习,已经很容易对网页做一个简单的结构划分。但是一个网站由多个网页构成,每个网页上都有大量的信息,要想使网页中的信息排列有序,条理清晰,并且网页与网页之间有一定的联系,就需要使用列表和超链接。本章将对列表标记、超链接标记以及CSS控制列表和超链接的样式进行详细讲解。 教学目标●掌握无序、有序及定义列表的使用,可以制作常见的网页列表模块; ●掌握超链接标记的使用,能够使用超链接定义网页元素; ●掌握CSS伪类,会使用CSS伪类实现超链接特效; 重点及措施 教学重点:无序列表、有序列表、定义列表、超链接、链接伪类、锚点链接。 措施:通过上机操作加强学习和补充案例进行巩固。 难点及措施 教学难点:有序列表、定义列表、链接伪类。 措施:通过上机操作加强学习和补充案例进行巩固。 教学方式教学采用教师课堂讲授为主,使用教学PPT讲解。 教学过程 第一课时 (制作“精美电商悬浮框”,讲解无序列表、有序列表) 复习上节课内容 在讲解本节内容前,抛出以下问题让学生回答,以复习第四章“CSS盒子模型”的相关知识。 1、一个盒子的宽(width)和高(height)均为300px,左内边距为30px, 同时盒子有3px的边框,请问这个盒子的总宽度是多少?() A、333px B、366px C、336px D、363px

Javascript自执行匿名函数(function { }) 的原理浅析

Javascript自执行匿名函数(function { }) 的原理浅析 匿名函数就是没有函数名的函数。这篇文章主要介绍了Javascript自执行匿名函数(function { }) 的原理浅析的相关资料,需要的朋友可以参考下 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。匿名函数指没有指定函数名或指针的函数,自执行匿名函数只是其中一种,下文中称这种函数为:自执行函数 下面是一个最常见的自执行函数: // 传统匿名函数 (function { alert('hello'); }) ; 这段代码的执行效果就是在页面再载入时弹出:"hello" 是什么促使它自动执行的?,来看下面的代码 // 在传统写法上去掉小括号,并在前面加上运算符~,!,+,- ~function { alert('hello'); } ;

!function { alert('hello'); } ; +function { alert('hello'); } ; -function { alert('hello'); } ; 这些写法与上文所说的传统方式执行起来并无区别, 我发现,这些写法的共同点是运算符,其实传统方式的小括号也属于运算的一种,出现在:a=b*(c+d),运算符 + 传递给自生的参数 = 函数自动执行?但有些符号也不支持,比如“=,*,/”号,它自执行的原因还是很神秘,网上也找不到像样的答案 然后我发现了一个神奇的现象,这些运算符可以无限叠加。。。。。。 // function前面是特定符号可以无限叠加... ~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+ -+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+ -~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-

JavaScript图形实例:蝴蝶结图案

JavaScript图形实例:蝴蝶结图案 1.长短瓣相间的蝴蝶结 设定曲线的坐标方程为: b=r*(1+cos(n*θ)/4)*(1+sin(2*n*θ)); x1=b*cos(θ); x2=b*cos(θ+π/8); y1=b*Math.sin(θ); y2=b*Math.sin(θ+π/8); (0≤θ≤2π,2≤n≤5) 在0~2π区间中从θ=0开始,每隔π/360按曲线方程求得两个点的坐标值(x1,y1)和(x2,y2),并将求得的两点连成一条线段,这样,可以得到一个长短瓣相间的蝴蝶结图案。 编写如下的HTML代码。 长短瓣相间的蝴蝶结 eval( )内置函数的用法:计算字符串表达式的值。

相关文档
最新文档