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 最常见的用途是渲 ...
随机推荐
- 无线路由器的设置_不能通过wifi进行设置
昨天朋友的小区宽带续费完不能上网了,过去看了一下,无线路由器没有问题,但是宽带信号没过来,网线直接插在电脑上用拨号,发现根本没办法连接,提示网线已经被拔出,重新还原一下系统,也是不行.因为之前他的电脑 ...
- 昂贵的聘礼(dijkstra)
昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 38549 Accepted: 11158 Descripti ...
- LayoutComponent类,用于layout的组件类。 LayoutComponent保存的所有用于布局的数据。
LayoutComponent () 默认构造函数 更多... ~LayoutComponent () 默认的析构函数 更多... CREATE_FUNC (LayoutC ...
- 教你如何---构建良好的windows程序(初学者必看)
一使用菜单栏和工具栏 1.菜单栏和工具栏有什么作用和优点: 通过菜单栏把应用程序的功能进行分组,能够方便用户查找和使用,下图所示的菜单栏包含的每一项都是顶层菜单项,顶层菜单项下的选项称为”子菜单”或” ...
- UITapGestureRecognizer
UITapGestureRecognizer IOS的手势非常多, 但是特别容易其他视图起冲突的手势,要数UITapGestureRecognizer 于是有了gestureRecognizerSho ...
- 修改Capfile,在正式环境不再使用migration修改数据库
原因是这样的,运维不开放正式环境数据库的alter权限,所以每次都要给他们把sql语句发过去, 由他们来操作. https://github.com/capistrano/rails Require ...
- Thinkphp中eq,neq,gt,lt等表达式缩写
eq 等于 equalneq 不等于gt 大于 greater thanegt 大于等于lt 小于 less thanelt 小于等于like LIKEbetween BETWEENno ...
- ASP.NET MVC 入门系列教程
ASP.NET MVC 入门系列教程 博客园ASP.NET MVC 技术专题 http://kb.cnblogs.com/zt/mvc/ 一个居于ASP.NET MVC Beta的系列入门文章,有朋友 ...
- 58. 分析、测试与总结:罗马数字和阿拉伯数字的转换[roman to integer and integer to roman in c++]
[本文链接] http://www.cnblogs.com/hellogiser/p/roman-to-integer-and-integer-to-roman.html [题目] 给出一个罗马数字, ...
- Objective-C 和 C++中指针的格式和.方法 和内存分配
最近在看cocos2d-x,于是打算复习一下C++,在这里简单对比下,留个念想. 先看看oc中指针的用法 @interface ViewController : UIViewController { ...