为重用命名空间而进行规划###

    (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 遵循最佳实践的更多相关文章

  1. Java 异常处理的 9 个最佳实践

    在 Java 中,异常处理是个很麻烦的事情.初学者觉得它很难理解,甚至是经验丰富的开发者也要花费很长时间决定异常是要处理掉和抛出. 所以很多开发团队约定一些原则处理异常.如果你是一个团队的新成员,你可 ...

  2. 设计 REST API 的13个最佳实践

    写在前面 之所以翻译这篇文章,是因为自从成为一名前端码农之后,调接口这件事情就成为了家常便饭,并且,还伴随着无数的争论与无奈.编写友好的 restful api 不论对于你的同事,还是将来作为第三方服 ...

  3. 13 个设计 REST API 的最佳实践

    原文 RESTful API Design: 13 Best Practices to Make Your Users Happy 写在前面 之所以翻译这篇文章,是因为自从成为一名前端码农之后,调接口 ...

  4. 验证Kubernetes YAML的最佳实践和策略

    本文来自Rancher Labs Kubernetes工作负载最常见的定义是YAML格式的文件.使用YAML所面临的挑战之一是,它相当难以表达manifest文件之间的约束或关系. 如果你想检查所有部 ...

  5. Kubernetes YAML最佳实践和策略

    Kubernetes工作负载最常用YAML格式的文件来定义. YAML的问题之一就是很难描述清单文件之间的约束或关系. 如果你希望检查是否已从受信任的注册表中提取部署到群集中的所有映像,该怎么办? 如 ...

  6. Web前端开发最佳实践(13):前端页面卡顿?可能是DOM操作惹的祸,你需要优化代码

    文档对象模型(DOM)是一个独立于特定语言的应用程序接口.在浏览器中,DOM接口是以JavaScript语言实现的,通过JavaScript来操作浏览器页面中的元素,这使得DOM成为了JavaScri ...

  7. 前端最佳实践——DOM操作

    1.浏览器渲染原理 在讲DOM操作的最佳性能实践之前,先介绍下浏览器的基本渲染原理. 分为以下四个步骤: 解析HTML(HTML Parser) 构建DOM树(DOM Tree) 渲染树构建(Rend ...

  8. Java 中,编写多线程程序的时候你会遵循哪些最佳实践?

    这是我在写 Java 并发程序的时候遵循的一些最佳实践: a)给线程命名,这样可以帮助调试. b)最小化同步的范围,而不是将整个方法同步,只对关键部分做同步. c)如果可以,更偏向于使用 volati ...

  9. Canvas 最佳实践(性能篇)

    Canvas 想必前端同学们都不陌生,它是 HTML5 新增的「画布」元素,允许我们使用 JavaScript 来绘制图形.目前,所有的主流浏览器都支持 Canvas. Canvas 最常见的用途是渲 ...

随机推荐

  1. 初步揭秘node.js中的事件

    当你学习node.js的时候,Events是一个非常重要的需要理解的事情.非常多的Node对象触发事件,你能在文档API中找到很多例子.但是关于如何写自己的事件和监听,你可能还不太清楚.如果你不了解, ...

  2. matlab 之字体调整

    FontWeight {normal} | bold | light | demi

  3. 微信公开课发布微信官方教程:教你用好微信JS-SDK接口

    微信公众平台开放JS-SDK(微信内网页开发工具包),说明文档已经有相关使用方法和示例了,很多同学觉得不是很直观,为此微信公开课发布微信官方教程:教你用好微信JS-SDK接口. 1.分享类接口:支持获 ...

  4. Rescue

    1039: Rescue Time Limit: 1 Sec  Memory Limit: 32 MBSubmit: 1320  Solved: 306 Description Angel was c ...

  5. back(返回)键总结

    对于一般的android手机,都提供了四个(目前主流三个)按键.这几个按键中,back(返回)键用得比较多,对back键出发的事件一般是通过重写onKeyDown(int keyCode, KeyEv ...

  6. iphone数据存储之-- Core Data的使用(一)

    http://www.cnblogs.com/xiaodao/archive/2012/10/08/2715477.html 一.概念 1.Core Data 是数据持久化存储的最佳方式 2.数据最终 ...

  7. 反转字符串--C和Python

    将字符串反转,即“abcde”->"edcba" C语言实现: [转自http://www.kanzhun.com/mianshiti/456.html?sid=mail_1 ...

  8. PHP - 获取和设置include_path .

    PHP - 获取和设置include_path 分类:             PHP              2011-02-16 13:19     2818人阅读     评论(1)     ...

  9. Java入门学习知识点汇总

    Java入门重要知识点在这里总结一下,以方便日后复习,这部分内容主要有:变量和常量,常用的运算符,流程控制语句,数组,方法这些内容 一.变量和常量 1.Java关键字 先贴张图: 所有关键字区分大小写 ...

  10. (原创)Python文件与文件系统系列(5)——stat模块

    stat模块中定义了许多的常量和函数,可以帮助解释 os.stat().os.fstat().os.lstat()等函数返回的 st_result 类型的对象. 通常使用 os.path.is*() ...