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

    (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. 微信和WeChat的合并月活跃账户达6.97亿

    腾讯最新财报显示,微信和WeChat的合并月活跃账户于2015年底达6.97亿,同比增长39%.2016年初春节假期期间,通过微信支付收发的红包数量仅在6天内就超过320亿,同比增长9倍. 腾讯网络广 ...

  2. ajax 之js读取xml的多浏览器兼容

    主要是分为两大类:IE.其它浏览器 IE8以下只支持这种 InputVoltage.innerText = xmlDoc.getElementsByTagName(id)[0].text, 其它浏览器 ...

  3. SphinxSE的安装

    SphinxSE 的使用 SphinxSE 的使用 :wiki SphinxSE是一个可以编译进MySQL 5.x版本的MySQL存储引擎,尽管被称作“存储引擎”,SphinxSE自身其实并不存储任何 ...

  4. django migration使用指南

    转自: https://docs.djangoproject.com/en/1.8/topics/migrations/

  5. ios7技巧:你需要掌握的19个iOS7使用技巧

    从右往左滑动屏幕,可看到信息收到的时间. 指南针应用还可以用作水平仪,滑动屏幕即可. 被苹果称作Spotlight的搜索功能有所改变.在屏幕中间向下滑动即可打开该项功能,你可以搜索文本.邮件.应用.歌 ...

  6. Rotate List

    Given a list, rotate the list to the right by k places, where k is non-negative. Example Given 1-> ...

  7. JS实现多附件上传(asp.net)

    前几天,用户提出一个需求-多附件上传,另外,每个上传文件要加一个别名,本人创新少,从网上收集了资料,稍微改写,满足了 客户的需求.在应用到程序之前,先做了个小测试,测试通过,小高兴,就记录下了这个小测 ...

  8. 【转】Linux中如何安装.rpm、.tar、.tar.gz和tar.bz2

    我以下面三个包为例:(三个包都在/etc/opt下)A.example-1.2.3-1.rpmB.example-1.2.3-1.tarC.example-1.2.3-1.tar.gz 1.对于rpm ...

  9. 【转】 JSONObject使用方法

    随笔- 46  文章- 0  评论- 132 JSONObject简介 本节摘要:之前对JSON做了一次简单的介 绍,并把JSON和XML做了一个简单的比较:那么,我就在想,如果是一个json格式的字 ...

  10. codeforces B. Semifinals 解题报告

    题目链接:http://codeforces.com/problemset/problem/378/B 题目意思:有n个参赛者,他们都需要参加两场半决赛.第一场半决赛的成绩依次是a1, a2, ... ...