`
agevs
  • 浏览: 68097 次
  • 来自: 北京
博客专栏
924aba1e-229a-352e-b6d4-f15f3159a438
各种Web前端技巧经验分享...
浏览量:0
文章分类
社区版块
存档分类
最新评论

《精通javascript》几个简单的函数

阅读更多

精通JavaScript(图灵计算机科学丛书) ,让你大开眼界的 JavaScript 力作,跟随 jQuery 之父到达前所未有的深度,Amazon 五星盛誉图书。

本书是目前最深入的JavaScript图书,讲述了现代JavaScript的所有知识,展现了这门技术将能给网站建设带来如何丰富的体验。本书言简意赅,扩展了读者视野,并关注于基础且重要的主题–现代JavaScript是什么和不是什么,浏览器支持的当前状态,以及需要注意的陷阱等。

书中所有概念都来自于现实案例的分析。前端UI分享

书没有好坏之分,正如人没有绝对的好坏之分一样。书只看对自己这个水平层次的人来说该吸收的东西多少了,能吸收一、两点就够了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
function $(){ return document.getElementById(arguments[0])};
 
/**
 * 得到上一个元素
 * @param {Object} elem
 */
function prev(elem){
    do{
        elem = elem.previousSibling;
    while(elem && elem.nodeType != 1);
    return elem;
}
 
/**
 * 得到下一个元素
 * @param {Object} elem
 */
function next(elem){
    do{
        elem = elem.nextSibling;
    while(elem && elem.nodeType != 1);
    return elem;
}
 
/**
 * 得到第一个元素
 * @param {Object} elem
 */
function first(elem){
    elem = elem.firstChild;
    return elem && elem.nodeType != 1 ? next(elem) : elem;
}
 
/**
 * 得到最后一个元素
 * @param {Object} elem
 */
function last(elem){
    elem = elem.lastChild;
    return elem && elem.nodeType != 1 ? prev(elem) : elem;
}
 
/**
 * 得到父元素
 * @param {Object} elem
 * @param {Number} num 需要寻找的父级级别
 */
function parent(elem, num){
    num = num || 1;
    for(var i=0; i<num; i++){
        if(elem != null) elem = elem.parentNode; //原书中这块有错
    }
    return elem;
}
 
/**
 * 得到相关name元素
 * @param {String} name
 * @param {Object} elem
 */
function tag(name, elem){
    return (elem || document).getElementsByTagName(name)
}
 
/**
 * 根据tag寻找
 * @param {String} name
 * @param {String} type
 */
function hasClass(name, type){
    var r = [];
    var re = new RegExp('(^|\s)'+name+'(\s|$)');
    var e = document.getElementsByTagName(type || '*');
    for(var i=0; i<e.length; i++){
        if(re.test(e[i].className)){
            r.push(e[i]);
        }
    }
    return r;
    //http://www.cnblogs.com/rubylouvre/archive/2009/09/01/1557765.html //司徒兄有不同的看法
}
 
/**
 * 获取元素文本
 * @param {Object} e
 */
function text(e){
    var t = '';
    e = e.childNodes || e;
    for(var i=0; i<e.length; i++){
        //如果不是元素,则追加其文本值
        t += e[i].nodeType != 1 ? e[i].nodeValue : text(e[i].childNodes);
    }
    return t;
}
 
/**
 *
 * @param {String} elem
 * @param {String} name
 * @param {String} value
 */
function attr(elem, name, value){
    if(!name || name.constructor != String){
        return '';
    }
     
    //检查name的属性是否在怪异命名情形中
    name = {'for''htmlFor''class''className'}[name] || name;
     
    if(typeof value != 'undefined'){
        elem[name] = value;
         
        if(elem.setAttribute){
            elem.setAttribute(name, value);
        }
    }
     
    return elem[name] || elem.getAttribute(name) || '';
}
 
 
/**
 * 在另一个元素之前插件元素
 * @param {Object} parent
 * @param {Object} before
 * @param {String} elem
 */
function before(parent, before, elem){
    if(elem == null){
        elem = before;
        before = parent;
        parent = before.parentNode;
    }
     
    //获取元素的新数组
    var elems = checkElem(elem);
     
    //向后遍历
    for(var i=elems.length; i>=0; i--){
        parent.insertBefore(elems[i], before);
    }
}
 
/**
 * 创建元素
 * @param {Object} elem
 */
function create(elem){
    //测试是否用命名空间来创建新的元素
    return document.createElementNS ? document.createElementNS('http://www.w3.org/1999/xhtml', elem) : document.createElement(elem);
}
 
/**
 * before 辅助函数
 * @param {Object} elem
 */
function checkElem(a){
    var r = [];
    if(a.constructor != Array){ a = [a]};
    for(var i=0; i<a.length; i++){
        //如果是字符串
        if(a[i].constructor == String){
            //用一个临时元素来存放HTML
            var div = document.createElement('div');
            div.innerHTML = a[i];
            //提取DOM结构到临时的div中
            for(var j=0; j<div.childNodes.length; j++){
                r[r.length] = div.childNodes[j];
            }
        else if(a[i].length){ //如果它是数组
            //假定DOM节点数组
            for(var j=0; j<a[i].length; j++){
                r[r.length] = a[i][j];
            }
        else //否则假定是DOM节点
            r[r.length] = a[i];
        }
    }
     
    return r;
}
 
//此方法我已修改与原文中有异
/**
 * 添加元素 (如果只有一个参数(无elem),则直接添加到document.body上)
 * @param {Object} elem
 * @param {Object} parent
 */
function append(parent, elem){
    if(elem == null){
        elem = parent;
        parent = null;
    }
     
    //获取元素数组
    var elems = checkElem(elem);
    for(var i=0; i< elems.length; i++){
        (parent || document.body).appendChild(elems[i]);
    }
}
 
/**
 * 删除独立的DOM
 * @param {Object} elem
 */
function remove(elem){
    if(elem){ elem.parentNode.removeChild(elem) };
}
 
/**
 * 删除一个节点的所有子节点
 * @param {Object} elem
 */
function empty(elem){
    while(elem.firstChild){
        remove(elem.firstChild);
    }
}
 
/**
 * 阻止事件冒泡
 * @param {Object} e
 */
function stopBubble(e){
    if(e && e.stopPropagation){
        e.stopPropagation();
    else {
        window.event.cancelBubble = true;
    }
}
 
function stopDefault(e){
    if(e && e.preventDefault){
        e.preventDefault();
    else {
        window.event.returnValue = false;
    }
    return false;
}
 
 
/**
 * 得到外链样式
 * @param {Object} elem
 * @param {String} name
 */
function getStyle(elem, name){
    if(elem.style[name]){
        return elem.style[name];
    else if(elem.currentStyle){ //如果ie
        return elem.currentStyle[name];
    else if(document.defaultView && document.defaultView.getComputedStyle){ //如果是不是w3c方法
        name = name.replace(/([A-Z])/g, '-$1');
        name = name.toLowerCase();
         
        //获取样式
        var s = document.defaultView.getComputedStyle(elem, '');
        return s && s.getPropertyValue(name);
    else {
        return null;
    }
}
 
/**
 * 获取元素的x位置
 * @param {String} elem
 */
function pageX(elem){
    return elem.offsetParent ? elem.offsetLeft + pageX(elem.offsetParent) : elem.offsetLeft;
}
 
/**
 * 获取元素的Y位置
 * @param {String} elem
 */
function pageY(elem){
    return elem.offsetParent ? elem.offsetTop + pageY(elem.offsetParent) : elem.offsetTop;
}
 
/**
 * 获取元素相对于父级的x位置
 * @param {String} elem
 */
function parentX(elem){
    return elem.parentNode == elem.offsetParent ? elem.offsetLeft : pageX(elem) - pageX(elem.parentNode);
}
 
/**
 * 获取元素相对于父级的Y位置
 * @param {String} elem
 */
function parentY(elem){
    return elem.parentNode == elem.offsetParent ? elem.offsetTop : pageY(elem) - pageY(elem.parentNode);
}
 
/**
 * 查找元素的左端位置
 * @param {Object} elem
 */
function posX(elem){
    return parseInt(getStyle(elem, 'left'));
}
 
/**
 * 查找元素的顶端位置
 * @param {Object} elem
 */
function posY(elem){
    return parseInt(getStyle(elem, 'top'));
}
 
/**
 * 设置元素水平位置
 * @param {Object} elem
 * @param {Object} pos
 */
function setX(elem, pos){
    elem.style.left = pos + 'px';
}
 
/**
 * 设置垂直水平位置
 * @param {Object} elem
 * @param {Object} pos
 */
function setY(elem, pos){
    elem.style.top = pos + 'px';
}
 
/**
 * 获取高度
 * @param {Object} elem
 */
function getHeight(elem){
    return parseInt(getStyle(elem, 'height'));
}
 
/**
 * 获取宽度
 * @param {Object} elem
 */
function getWidth(elem){
    return parseInt(getStyle(elem, 'width'));
}
 
/**
 * 得到完整的高度,就算对象已隐藏
 * @param {Object} elem
 */
function fullHeight(elem){
    //如果元素显示
    if(getStyle(elem, 'display') != 'none'){
        return elem.offsetHeight || getHeight(elem);
    }
     
    //如果不显示,则复原css
    var old = resetCss(ele, {
        display: '',
        visibility: 'hidden',
        position: 'absolute'
    });
     
    var h = elem.clientHeight || getHeight(elem);
    restoreCss(elem, old);
     
    return h;
}
 
/**
 * 恢复原有设置
 * @param {String} elem
 * @param {Object} prop
 */
function resetCss(elem, prop){
    var old = {};
     
    for(var in prop){
        old[i] = prop[i];
        elem.style[i] = prop[i];
    }
    return old;
}
 
/**
 *
 * @param {String} elem
 * @param {Object} old
 */
function restoreCss(elem, old){
    for(var in old){
        elem.style[i] = old[i];
    }
}

 

1
0
分享到:
评论

相关推荐

    精通javascript

    • 9.5.htm 简单的JavaScript事件绑定 • 9.6.htm 事件处理器的作用域 • 9.7.htm 事件处理器的作用域之二 • 9.8.htm 事件处理器的返回值 • 9.9.htm 自动触发事件 • 9.9...

    JavaScript-深度剖析(从入门到精通).doc

    JavaScript 深度剖析(从入门到精通) JavaScript 是一种基于对象、事件驱动、安全性能的脚本语言。它的出现弥补了 HTML 语言的缺陷,是 Java 与 HTML 的折衷选择。JavaScript 的主要特点有: 1. 基于对象:...

    精通JavaScript

    1.本书附源代码共计381个,其运行环境如下: IE 5或更高版本 Mozilla Firefox 1.5.0.3或更高版本 服务器采用IIS5.1 或以上版本 数据库使用MS Access 2000以上 2.本书所附光盘实例代码: 第1章(\第1章) 查看...

    PHP入门到精通

    24.3Ajax开发需要注意的几个问题 24.4在PHP中应用AJAX技术的典型应用 Web Service与SOAP技术(教学录像:31分1秒) 25.1Web Service技术 25.2SOAP协议 25.3WSDL文档 25.4UDDI规范 25.5PHP内置SOAP类库 25.6使用...

    JavaScript方法和技巧大全

    有些时候你精通一门语言,但是会发现你其实整天在和其它语言打交道,也许你以为这些微不足道,不至于影响你的开发进度,但恰恰是这些你不重视的东西会浪费你很多时间,我一直以为我早在几年前就已经精通JavaScript了...

    PHP入门到精通02

    24.3Ajax开发需要注意的几个问题 24.4在PHP中应用AJAX技术的典型应用 Web Service与SOAP技术(教学录像:31分1秒) 25.1Web Service技术 25.2SOAP协议 25.3WSDL文档 25.4UDDI规范 25.5PHP内置SOAP类库 25.6使用...

    Y分钟学习X种语言

    也许几个小时你就能熟悉一种语言的基本知识,但熟练掌握至少要几个星期,而精通,那就 要至少几个月了。 想写出自己的编程语言吗?Pete Sestoft的《程序设计语言概念》对这个主题提供了很好的 介绍。 十分钟学习十种...

    jQuery权威指南-源代码

    与国内目前已经出版的同类书相比较,本书具有以下几个独有的特点: 基于jQuery的最新版本撰写,完美地展现了jQuery最新版本的功能和特性。 内容全面、丰富、翔实,不仅由浅入深地讲解了jQuery的所有必备基础知识...

    CSS 计数器

    CSS 计数器使用到以下几个属性: counter-reset – 创建或者重置计数器 counter-increment – 递增变量 content – 插入生成的内容 counter() 或 counters() 函数 – 将计数器的值添加到元素 要使用 CSS 计数器,得...

    jquery插件使用方法大全

    两个函数接受的参数除了快慢等,还可以接收整型,作为渐入或淡出的完成时间,单位为MS。 编辑本段plugin  这也是一个插件的时代。 jquery插件给我的感觉清一色的清洁,简单。如Jtip,要使用它的功能,只需要在你的...

    Google-Apps-Script-Complete-Course---Beginner-to-Advanced:由Packt发布的Google Apps脚本完整课程-从入门到高级

    Google Apps脚本完整课程-从入门到高级 这是发布的的代码库。... 如果您知道JavaScript,则可以在几分钟内开始使用Apps Script。 函数,变量,循环等使用与JavaScript相同的语法。 借助Google类的强大功能

    asp.net知识库

    与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,Hashtable,SortedList 这类对象是否相等 帮助解决网页和JS文件中的中文编码问题的小工具 慎用const...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    建立自己的DTD也是很简单的一件事,一般只需要定义4-5个元素就可以了。 调用DTD文件的方法有两种: 1.直接包含在XML文档内的DTD 你只要在DOCTYPE声明中插入一些特别的说明就可以了,象这样: 我们有一个XML文档...

Global site tag (gtag.js) - Google Analytics