前两年迫于项目的需要,只是拿来JQuery用到项目中,并没有实质上理解javascript(貌似其他人也是这么干的)~

随着最近几年,得益于Nodejs, React, Vue等,javascript火的一塌糊涂。深知要想在某一方面走的长远,基础是免不了的,遂拿起这本书,用零散的时间看完了~

这本书中涉及的知识虽然简洁,但是是“授人以渔”。这里总结下里面的实用技巧,以备用。

1. 一个网站的代码结构,大体由html(页面),images,css,js构成,设计过程中遵循以下原则:

  (1) 结构层由html完成,包括页面布局,标签等;

  (2) 表示层由css完成,包括样式,版式等;

  (3) 行为层由js完成,包括事件,动画等。

三层分离

2. 通用函数

  (1) addLoadEvent

function addLoadEvent(func){
var oldonload = window.onload;
if(typeof window.onload != 'function'){
window.onload = func;
}else{
window.onload = function(){
oldonload();
func();
}
}
}

  (2) insertAfter

function insertAfter(newElement, targetElement){
var parent = targetElement.parentNode;
if(parent.lastChild == targetElement){
parent.appendChild(newElement);
}else{
parent.insertBefore(newElement,targetElement.nextSibling);
}
}

  (3) addClass

function addClass(element, value){
if(!element.className){
element.className = value;
}else{
var newClassName = element.className;
newClassName += ' ';
newClassName += value;
element.className = newClassName;
}
}

  (4) moveElement

function moveElement(elementID, final_x, final_y, interval){
if(!document.getElementById) return false;
if(!document.getElementById(elementID)) return false;
var elem = document.getElementById(elementID);
if(elem.movement){
clearTimeout(elem.movement);
}
if(!elem.style.left){
elem.style.left = '0px';
}
if(!elem.style.top){
elem.style.top = '0px';
}
var xpos = parseInt(elem.style.left);
var ypos = parseInt(elem.style.top);
if(xpos == final_x && ypos == final_y){
return true;
}
if(xpos < final_x){
var dist = Math.ceil((final_x-xpos)/10);
xpos = xpos + dist;
}
if(xpos > final_x){
var dist = Math.ceil((xpos - final_x)/10);
xpos = xpos - dist;
}
if(ypos < final_y){
var dist = Math.ceil((final_y-ypos)/10);
ypos = ypos + dist;
}
if(ypos > final_y){
var dist = Math.ceil((ypos - final_y)/10);
ypos = ypos - dist;
}
elem.style.left = xpos + 'px';
elem.style.top = ypos + 'px';
var repeat = 'moveElement("' + elementID + '", ' + final_x + ', ' + final_y + ', ' + interval + ')';
elem.movement = setTimeout(repeat,interval);
}

3. 获取当前页面的URL: window.location.href

4. 类似 dom.onclick = function(){}是为dom对象添加事件处理函数;类似 dom.click()是执行对应的事件函数

5. 类似如下情形,由于变量not_in_scope的作用域问题,当事件被触发时该变量实际上是undefined的

var not_in_scope = 'use dom attribute to contain value';
dom.onmouseover = function(){
alert(not_in_scope)
}

解决技巧:为dom对象添加(属性,值)

var not_in_scope = 'use dom attribute to contain value';
dom.not_in_scope = not_in_scope;
dom.onmouseover = function(){
alert(this.not_in_scope)
}

6. 循环为各个dom对象添加事件处理函数

如下有两种写法,但第二种方式更加简洁。

  var links = document.getElementsByTagName('a');
var linkurl;
for(var i=0; i<links.length; i++){
// 方式1
// linkurl = links[i].getAttribute('href');
// if(linkurl.indexOf('index.html') != -1){
// links[i].onmouseover = function(){
// moveElement('preview',0,0,5);
// }
// }
// if(linkurl.indexOf('about.html') != -1){
// links[i].onmouseover = function(){
// moveElement('preview',-150,0,5);
// }
// }
// if(linkurl.indexOf('photos.html') != -1){
// links[i].onmouseover = function(){
// moveElement('preview',-300,0,5);
// }
// }
// if(linkurl.indexOf('live.html') != -1){
// links[i].onmouseover = function(){
// moveElement('preview',-450,0,5);
// }
// }
// if(linkurl.indexOf('contact.html') != -1){
// links[i].onmouseover = function(){
// moveElement('preview', -600, 0,5);
// }
// } /**
* 方式二
* another way to add event to the similar dom objects
*/
links[i].onmouseover = function(){
var linkurl = this.getAttribute('href');
if(linkurl.indexOf('index.html') != -1){
moveElement('preview', 0,0,5);
}
if(linkurl.indexOf('about.html') != -1){
moveElement('preview', -150,0,5);
}
if(linkurl.indexOf('photos.html') != -1){
moveElement('preview', -300,0,5);
}
if(linkurl.indexOf('live.html') != -1){
moveElement('preview', -450,0,5);
}
if(linkurl.indexOf('contact.html') != -1){
moveElement('preview', -600,0,5);
}
}
}

7. 内部导航

<ul>
<li><a href="#jay">Jay Skript</a></li>
<li><a href="#domsters">The Domsters</a></li>
</ul>
<section id="jay">
<h2>Jay Skript</h2>
</section>
<section id="domsters">
<h2>The Domsters</h2>
</section>

8. 表单验证

客户端和服务器端均需要验证。

9. 表单提交

表单提交事件将由onsubmit事件处理函数拦截,

若返回true,则浏览器将重试提交表单;

若返回false,则中止表单提交

10. 其他:

  (1) document.body

  (2) z-index

  (3) display: inline - 垂直排列变水平排列

  (4) HTML DOM; CSS DOM

  (5) form对象,form.elements

  (6) label标签尽量定义for属性,并同input相关联

  (7) encodeURIComponent

  (8) js正则表达式:/<article>([\s\S]+)<\/article>/

Done!

JavaScript_DOM编程艺术第二版[阅]的更多相关文章

  1. 《JavaScript_DOM编程艺术第二版(中文)》整书笔记

    目录 第3章:DOM 第4章:案例研究 第5章:最佳实践 第6章:案例改进 第7章:动态创建标记 第8章:充实文档的内容 第9章:CSS-DOM 第3章:DOM 文档:DOM中的"D&quo ...

  2. JavaScript DOM编程艺术第二版学习(1/4)

    接下来项目需要网页相关知识,故在大牛的指引下前来阅读本书. 记录方式:本书分四部分阅读,完成阅读之后会多写一篇包括思维导图的算是阅读指南的东西,浏览的童鞋看着指南可以跳过一些不必要的坑~ 当前水平:H ...

  3. JavaScript DOM 编程艺术(第二版) 初读学习笔记

    这本书留给我的印象就是结构.表现和行为层的分离,以及书后面部分一直在强调的最佳实践原则:平稳退化,逐步增强,向后兼容以及性能考虑. 要注意这不是一本JavaScript入门书籍~ 2.1 准备工作 用 ...

  4. 【JavaScript DOM编程艺术(第二版)】笔记

    第1章 javascript简史 1.什么是DOM? 简单的说,DOM是一套对文档的内容进行抽象和概念化的方法.\         第2章 javascript语法 1.内建对象: 内建在javasc ...

  5. JavaScript DOM 编程艺术(第二版) 有待解决的问题

    原书 P181,var repeat = "moveElement('"+elementID+"', "+final_x+", "+fina ...

  6. JavaScript DOM 编程艺术(第二版) 常用JS小脚本

    function addLoadEvent(func) { var oldonload = window.onload; if (typeof window.onload != 'function') ...

  7. Learning ROS for Robotics Programming - Second Edition(《ROS机器人编程学习-第二版》)

    Learning ROS for Robotics Programming - Second Edition <ROS机器人编程学习-第二版> ----Your one-stop guid ...

  8. 《Javascript_Dom 编程艺术》(第2版)读书笔记

    第1章 Javascript 简史 Dom : 平稳退化.渐进增强,以用户为中心的设计 第2章 Javascript 语法 1.程序设计语言分为:解释性(javascript)和编译型(java,C+ ...

  9. 【Python千问 1】Python核心编程(第二版)导读

    第一章 欢迎来到Python世界 什么是Python Python的起源 Python的特点 下载Python 安装Python 运行Python Python文档 比较Python(与其它语言的比较 ...

随机推荐

  1. luogu P1529 回家 Bessie Come Home

    题目描述 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰按响了电铃,所以她们开始向谷仓走去. 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛). 在挤奶 ...

  2. [BZOJ 1800] 飞行棋

    Link: BZOJ 1800 传送门 Solution: $O(n^4)$…… Code: #include <bits/stdc++.h> using namespace std; ] ...

  3. POJ1226 Substrings(二分+后缀数组)

    题意:给n个字符串,求最长的子串,满足它或它的逆置出现在所有的n个字符串中. 把n个字符串及其它们的逆置拼接,中间用不同字符隔开,并记录suffix(i)是属于哪个字符串的: 跑后缀数组计算heigh ...

  4. lua中self.__index = self是什么意思?

    example1 Account = {balance = 0} function Account:new(conf) conf = conf or {} setmetatable(conf,self ...

  5. 15 个 Docker 技巧和提示

    CLI(Command Line Interface,命令行) 好的 docker ps 输出 将 docker ps 输出通过管道重定向到 less -S,避免折行: docker ps -a |  ...

  6. Vue自定义指令和路由

    一.自定义指令 除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令. 下面我们注册一个全局指令 v-focus,该指令的功能是在页面加载时,元素获得焦点: ...

  7. 从头认识java-14.4 Java提供的数组的有用功能(2)

    接着上一章节,我们继续介绍Java提供的数组的有用功能. 3.元素的对照Comparator package com.ray.ch14; import java.util.Arrays; import ...

  8. StringBuilder.append()与String的"+"的效率PK

    如果String通过"+"来拼接,如果拼接的字符串是常量,则效率会非常高,因为会进行编译时优化,这个时候StringBuilder的append()是达不到的. 如果将String ...

  9. 右键添加"在此处打开命令窗口"菜单

    Windows Registry Editor Version 5.00  [HKEY_CLASSES_ROOT\Directory\Background\shell\CMD]  @="在此 ...

  10. 使用Kinect2作为Oculus游戏应用的输入设备

    注: 文章写于2015年8月, 眼下VR游戏Demo已经完结, 所以把上一次预研的一些经验分享出来, 希望对大家有所帮助 背景 初接触Oculus时, 从网上下载了一大堆的Demo来体验, 可是, 操 ...