DOM--1 遵循最佳实践
为重用命名空间而进行规划###
(function() {
function $(id) {
return document.getElementById(id);
}
function alertNodeName(id) {
alert($(id).nodeName);
}
window.myNamespace = {};
window.myNamespace.showNodeName = alertNodeName;
})();
myNamespace.showNodeName(test)
通过可重用,将对象事件简单化###
(function() {
!window.A && (window['A'] = {});
function $() {
var elements = [], len = arguments.length;
for(var i = 0; i < len; i++) {
var element = arguments[i];
if(typeof element === 'string') {
element = document.getElementById(element);
}
if(len === 1) {
return element;
} else {
elements.push(element);
}
}
return elements;
};
//检查兼容性
A.isCompatible = function(other) {
if(other === false || !Array.prototype.push || !Object.hasOwnProperty
|| !document.createElement || !document.getElementsByTagName) {
return false;
}
return true;
};
A.$ = $;
A.addEvent = function(node, type, listener) {
if(!(node = $(node))) return false;
if(node.addEventListener) {
node.addEventListener(type, listener, false);
return true;
} else if(node.attachEvent) {
node.attachEvent('on' + type, listener);
return true;
}
return false;
};
A.removeEvent = function(node, type, listener) {
if(!(node = $(node))) return false;
if(node.removeEventListener) {
node.removeEventListener(type, listener, false);
return true;
} else if(node.attachEvent) {
node.detachEvent('on' + type, listener);
return true;
}
return false;
};
A.getByClass = function(className, tag, parent) {
parent = parent || document;
tag = tag || '*';
if(!(parent = $(parent))) return false;
var allTags = (tag === '*' && parent.all) ? parent.all : parent.getElementsByTagName(tag);
var matchingElements = [];
className = className.replace(/\-/g, '\\-');
var regex = new RegExp('(^|\\s)' + className + '(\\s|$)');
var element;
for(var i = 0, len = allTags.length; i < len; i++) {
element = allTags[i];
if(regex.test(element.className)) {
matchingElements.push(element);
}
}
return matchingElements;
};
A.toggleDisplay = function(node, value) {
if(!(node = $(node))) return false;
var display = node.style.display;
node.style.display = (display === 'none') ? (value || '') : 'none';
return true;
};
A.insertAfter = function(changeNode, referenceNode) {
if(!(changeNode = $(changeNode))) return false;
if(!(referenceNode = $(referenceNode))) return false;
return referenceNode.parentNode.insertBefore(changeNode, referenceNode.nextSibling);
};
A.removeChild = function(parent) {
if(!(parent = $(parent))) return false;
while(parent.firstChild) {
parent.firstChild.parentNode.removeChild(parent.firstChild);
}
return parent;
};
A.prependChild = function(parent, newChild) {
if(!(parent = $(parent))) return false;
if(!(newChld = $(newChld))) return false;
if(parent.firstChild) {
parent.insertBefore(newChild, parent.firstChild);
} else {
parent.appendChild(newChild);
}
return parent;
};
A.create = function(tag, html) {
if(!tag) return false;
html = html || '';
var node = document.createElement(tag);
node.innerHTML = html;
return node;
};
})();
javascript中常见陷阱###
- 区分大小写
- 单引号和双引号
- 一般使用内嵌配合转义使用;但注意再行内的单引号必须转义
- 换行: 在js中拼接字符串的时候
- 在一个字符串内使用反斜杠转义符
- 多个字符串用加号拼接
- 不支持重载而会直接替换
所谓重载是指编程语言根据传递的函数或方法的参数的类型和个数区别不同函数或方法的能力 - 作用域解析和闭包
- 作用域解析中会形成路径,用作用域链来描述;
- 闭包是与作用域相关的概念,指内部函数即使在外部函数执行完并终止之后,仍然可以访问其外部函数的属性;
function initAnchor() {
for(var i = 0; i < 3; i++) {
A.addEvent('anchor' + i, 'click', function() {
alert('My id is anchor' + i);
});
}
}
A.addEvent(window, 'load', initAnchor);
上例中,当click事件监听器被调用时,在其内部作用域没有找到i;即到外部作用域中查找;而外部i的值为3
所以这种问题常发生在被定义后不马上执行的事件上
function initAnchor() {
for(var i = 0; i < 3; i++) {
registerListener(i);
}
}
function registerListener(i) {
A.addEvent('anchor' + i, 'click', function() {
alert('My id is anchor' + i);
});
}
A.addEvent(window, 'load', initAnchor);
上例中,click的监听器的外部环境变成registerListener函数,该函数在其每一个实例(每次调用该函数都会生成一个该函数的副本,以维护正确的变量作用域)的内部作用域中都维护来一个i
function initAnchor() {
for(var i = 0; i < 3; i++) {
(function() {
A.addEvent('anchor' + i, 'click', function() {
alert('My id is anchor' + i);
});
})(i);
}
}
function initAnchor() {
for(var i = 0; i < 3; i++) {
(function(i) {
A.addEvent('anchor' + i, 'click', function() {
alert('My id is anchor' + i);
});
})(i);
}
}
所以上例中第二个例子匿名函数常见的每个实例会维护i;而第一个仍然会找外部的i
- 迭代对象
**常会用到if(!all.hasOwnProperty(i)) continue;**
DOM--1 遵循最佳实践的更多相关文章
- Java 异常处理的 9 个最佳实践
在 Java 中,异常处理是个很麻烦的事情.初学者觉得它很难理解,甚至是经验丰富的开发者也要花费很长时间决定异常是要处理掉和抛出. 所以很多开发团队约定一些原则处理异常.如果你是一个团队的新成员,你可 ...
- 设计 REST API 的13个最佳实践
写在前面 之所以翻译这篇文章,是因为自从成为一名前端码农之后,调接口这件事情就成为了家常便饭,并且,还伴随着无数的争论与无奈.编写友好的 restful api 不论对于你的同事,还是将来作为第三方服 ...
- 13 个设计 REST API 的最佳实践
原文 RESTful API Design: 13 Best Practices to Make Your Users Happy 写在前面 之所以翻译这篇文章,是因为自从成为一名前端码农之后,调接口 ...
- 验证Kubernetes YAML的最佳实践和策略
本文来自Rancher Labs Kubernetes工作负载最常见的定义是YAML格式的文件.使用YAML所面临的挑战之一是,它相当难以表达manifest文件之间的约束或关系. 如果你想检查所有部 ...
- Kubernetes YAML最佳实践和策略
Kubernetes工作负载最常用YAML格式的文件来定义. YAML的问题之一就是很难描述清单文件之间的约束或关系. 如果你希望检查是否已从受信任的注册表中提取部署到群集中的所有映像,该怎么办? 如 ...
- Web前端开发最佳实践(13):前端页面卡顿?可能是DOM操作惹的祸,你需要优化代码
文档对象模型(DOM)是一个独立于特定语言的应用程序接口.在浏览器中,DOM接口是以JavaScript语言实现的,通过JavaScript来操作浏览器页面中的元素,这使得DOM成为了JavaScri ...
- 前端最佳实践——DOM操作
1.浏览器渲染原理 在讲DOM操作的最佳性能实践之前,先介绍下浏览器的基本渲染原理. 分为以下四个步骤: 解析HTML(HTML Parser) 构建DOM树(DOM Tree) 渲染树构建(Rend ...
- Java 中,编写多线程程序的时候你会遵循哪些最佳实践?
这是我在写 Java 并发程序的时候遵循的一些最佳实践: a)给线程命名,这样可以帮助调试. b)最小化同步的范围,而不是将整个方法同步,只对关键部分做同步. c)如果可以,更偏向于使用 volati ...
- Canvas 最佳实践(性能篇)
Canvas 想必前端同学们都不陌生,它是 HTML5 新增的「画布」元素,允许我们使用 JavaScript 来绘制图形.目前,所有的主流浏览器都支持 Canvas. Canvas 最常见的用途是渲 ...
随机推荐
- ExtJS学习之路第六步:深入讨论组件Panel用法
Panel加载页面 var myPanel=Ext.create('Ext.panel.Panel',{ bodyPadding: "15px 10px 0 10px", titl ...
- C++编程思想重点笔记(上)
C和C++指针的最重要的区别在于:C++是一种类型要求更强的语言.就void *而言,这一点表现得更加突出.C虽然不允许随便地把一个类型的指针指派给另一个类型,但允许通过void *来实现.例如: b ...
- MSSQL复习
1.用户角色: 登录名就相当于一个用户 角色相当于把你的操作权限分组了 2.数据系统结构(略) 网络连接接口 关系引擎 存储引擎 内存 3.数据库的结构 数据库 架构 对象(在Sql server中将 ...
- [Android教程]EditText怎样限制用户的输入?数字/字母/邮箱
有输入必有验证.为了防止用户随便输入确保提交数据的合法性,程序不得不在文本输入框(EditText)中增加限制或验证. 关于输入类型有数字.字母.邮箱.电话等形式,这些具体得根据业务来.那么Andro ...
- 第15章 使用Postfix与Dovecot收发电子邮件
章节概述: 本章节从电子邮局系统的组成角色开始讲起,了解MUA.MTA与MDA的作用,熟悉熟悉SMTP.POP3与IMAP4邮局协议. 学习postfix与dovecot服务程序的使用方法并逐条讲解配 ...
- HTTP HSTS协议和 nginx
导读 Netcraft 公司最近公布了他们检测SSL/TLS网站的研究,并指出只有仅仅5%的用户正确执行了HTTP严格传输安全HSTS.本文介绍nginx如何配置HSTS. 什么是HSTS HTTPS ...
- 在C/C++程序里打印调用栈信息
我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如果能让程序自己输出调用栈,那是最好 ...
- Python爬虫经验
有时候读取同一个url,服务器可能会返回不同的response,并不是爬虫程序代码的问题,而是服务器的问题,初次试验request时,最好 把response文本保存在一个txt文件当中,以便后续的比 ...
- JS的trim()方法
去除字符串左右两端的空格,在vbscript里面可以轻松地使用 trim.ltrim 或 rtrim,但在js中却没有这3个内置方法,需要手工编写.下面的实现方法是用到了正则表达式,效率不错,并把这三 ...
- SphinxSE的安装
SphinxSE 的使用 SphinxSE 的使用 :wiki SphinxSE是一个可以编译进MySQL 5.x版本的MySQL存储引擎,尽管被称作“存储引擎”,SphinxSE自身其实并不存储任何 ...