当前位置:  ▪css代码优化的12个技巧 iis7站长之家
本页文章导读:
    ▪Javascript事件处理机制      Javascript中事件处理 事件处理分为三个阶段:捕获 - 处理 - 起泡。 以点击按钮为例: 捕获阶段:由外层到内层,首先调用给Window注册的click捕获阶段监听方法,然后document、body、一层层的父.........
    ▪JavaScript倒计时组件      序言:倒计时应用于各网站页面,普遍存在,用过别人写的库(复杂)组件,也怕自己写的不好,今天又遇到一个倒计时的需求,因此打算自己写一遍。作者:华子yjh 一、组件API1、组件调用.........
    ▪【HTML5】Web Storage简析      什么是Web Storage?web storage是HTML5规范中提出的一种本地存储解决方案。在这之前,我们在开发中遇到本地存储问题时,通常有两种解决方式cookie:兼容性最好,但也有不少问题,下面会简单做.........

[1]Javascript事件处理机制
    来源: 互联网  发布时间: 2013-11-06

Javascript中事件处理

事件处理分为三个阶段:捕获 - 处理 - 起泡。


以点击按钮为例:

捕获阶段:由外层到内层,首先调用给Window注册的click捕获阶段监听方法,然后document、body、一层层的父节点,一直到按钮本身。


处理阶段:调用按钮本身的click监听方法。


起泡阶段:从按钮开始,从内层到外层,依次调用各级父节点的起泡阶段监听方法,直到Window。


但是,对于IE8及更低版本IE,不支持捕获阶段,因此捕获阶段的事件监听目前尚不通用。


通常的事件处理方法形式为:

function eventHandler(e) {
	e = e || window.event;
	var target = e.target || e.srcElement;
	... ...
	
}
e为事件对象,当事件触发时,作为参数传进来,但对于IE8及更低版本IE不适用,只能通过全局的event变量访问,好在不会出现同时处理两个事件的情况。

如何注册事件监听方法?

(1)直接写在HTML里,DOM元素的属性里。

<button id="btn" onclick="alert(123)">CLICK</button>
<button id="btn2" onclick="eventHandler()">CLICK2</button>


(2)在Javascript中,赋值给相应的DOM元素。

document.getElementById('btn2').onclick = eventHandler;


(3)addEventListener
document.getElementById('btn2').addEventListener('click', eventHandler, false);

这里第三个参数是标识何时触发eventHandler,false表示在事件起泡阶段触发,true表示在事件捕获阶段触发。因为在IE8即更低版本不支持事件捕获,因此不经常使用true。

可以给同一个控件调用多次此注册方法,注册多个handler。

removeEventListener与之对应。


在IE8及更低版本IE中,使用attachMent代替。

document.getElementById('btn2').attachEvent('onclick', eventHandler);
此时,浏览器仅支持事件起泡,不支持事件捕获,因此无第三个参数。

detachEvent与之对应。

阻止浏览器默认操作

对于通过第一种、第二种方法注册的监听方法,返回值如果为false,就阻止进一步的浏览器默认操作。以超链接为例:

<a href=/blog_article/"http_/www.baidu.com" onclick="alert(1);return false">LINK</a>

点击了这个LINK后,因为返回值为false,因此不会跳转到百度首页(默认操作)。


对于通过第三种方法注册的监听方法,返回值无效,可以通过event.preventDefault()来阻止浏览器的默认操作。对于IE8即更低版本IE,不支持preventDefault方法,只能通过event.returnValue=false来实现。因此,阻止浏览器默认操作的通用写法为:

if(e.preventDefault) {
		e.preventDefault();
	} else {
		e.returnValue = false; // IE8-
	}

阻止事件起泡

	if(e.stopPropagation) {
		e.stopPropagation();
	} else {
		e.cancelBubble = true;
	}





作者:xuefeng0707 发表于2013-3-14 22:20:20 原文链接
阅读:2 评论:0 查看评论

    
[2]JavaScript倒计时组件
    来源:    发布时间: 2013-11-06

序言:倒计时应用于各网站页面,普遍存在,用过别人写的库(复杂)组件,也怕自己写的不好,今天又遇到一个倒计时的需求,因此打算自己写一遍。
作者:华子yjh

 

一、组件API

1、组件调用方式

countDown(targetTime, callback(d, h, m, s)); // 组件调用方式

 

2、参数(Params)说明

targetTime: // 用户设置倒计时的目标时间

callback(d, h, m, s): // 回调函数,其参数分别为倒计时间中的天、小时、分钟、秒值

 

二、使用案例

1、HTML结构

<div id="countdown"></div>

 

2、JavaScript代码

var targetTime = '2013/03/15 18:00:00'; // 大于本地时间(假如本地时间为:2013/3/14 16:10:00)
countDown(targetTime, function(d, h, m, s) {
// 补零
for (var i = 0, len = arguments.length; i < len; i++) {
if (String(arguments[i]).length < 2) {
arguments[i] = '0' + arguments[i];
}
}
// dom操作
var dom = document.getElementById('countdown');
dom.innerHTML = d + '天' + h + '小时' + m + '分钟' + s + '秒';
});

 

3、浏览器显示结果

dom元素内容为:01天01小时50分钟00秒

 

三、组件源码

function countDown(targetTime, callback) {

// 定义一个创建XHR对象的函数
function createXHR() {
if (typeof XMLHttpRequest !== 'undefined') {
createXHR = function() {
return new XMLHttpRequest();
};
} else if (typeof ActiveXObject !== 'undefined') {
createXHR = function() {
if (typeof arguments['activeXString'] !== 'string') {
var versions = ['MSXML2.XMLHttp.6.0', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'];

for (var i = 0, len = versions.length; i < len; i++) {
try {
var xhr = new ActiveXObject(versions[i]);
arguments['activeXString'] = versions[i];
return xhr;
} catch(e) {}
}
}
return new ActiveXobject(arguments['activeXString']);
};
}
return createXHR();
}

// 创建一个XHR对象
var xhr = createXHR();
xhr.open('HEAD', window.location.href); // 建立一个请求
xhr.send(null); // 发送请求
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var t_timestamp = Date.parse(targetTime),
serverTime = new Date(xhr.getResponseHeader('Date')),
s_timestamp = Date.parse(serverTime),
c_timestamp = t_timestamp - s_timestamp; // 倒计时间戳
if (c_timestamp > 0) {
setTimeout(function callee() {
countdownTime(c_timestamp);
if (c_timestamp > 0) {
c_timestamp -= 1000;
setTimeout(callee, 1000);
}
}, 1);
}
}
}
};

// 计算倒计时间(天,小时,分钟,秒),并传入回调函数,执行回调
function countdownTime(c_timestamp) {
var d, h, m, s;
c_timestamp = c_timestamp / 1000;

d = parseInt(c_timestamp / 3600 / 24, 10); // 天数
h = parseInt(c_timestamp / 3600 % 24, 10); // 小时
m = parseInt(c_timestamp % 3600 / 60, 10); // 分钟
s = parseInt(c_timestamp % 3600 % 60, 10); // 秒

if (typeof callback === 'function') {
callback(d, h, m, s);
}
}
};

 

四、PS源码

源码解读:

1、创建XHR对象函数为自定义函数,也称惰性载入函数,该函数代码来自JavaScript高级程序设计一书,但是去除了arguments.callee写法,原因是ES5不支持;

2、组件中的第二个参数作为函数执行,该函数称为回调函数(运用闭包,将程序中通过复杂计算后的变量传入回调中,方便操作);

3、如果你没有看源码就测试的话,需要一个本地
    
[3]【HTML5】Web Storage简析
    来源:    发布时间: 2013-11-06

什么是Web Storage?

web storage是HTML5规范中提出的一种本地存储解决方案。在这之前,我们在开发中遇到本地存储问题时,通常有两种解决方式

  • cookie:兼容性最好,但也有不少问题,下面会简单做下对比

  • 各浏览器实现的非标准化的本地存储方案,如IE的userData,firefox的global storage等,毫无疑问,最大的问题是兼容性

session storage、local storage的区别

session storage的作用在于:将数据存储在本地,只有当次会话中同域的页面才能访问,这意味着:

  • 会话一旦结束,之前存储的数据就销毁,不可以访问(比如关闭标签或窗口)

  • 页面存储的数据,只有同域的页面能够访问;比如同域的两个页面demo-1.html、demo-2.html,当前打开了demo1.html,并存储了一段数据A(细节略);接着在当前窗口,切换到demo-2.html,demo2.html里的脚本可访问A;如果此时切换到的不是demo-2.html,而是其他域的页面,则无法访问A

local storage则比session storage少了一些限制,一个页面里设置的数据,只要同个域下的页面均可以访问。如果不手动删除数据,理论上这些存储的数据是会一直存在的

相对cookie有哪些优势

关于web storage相对于cookie的优势,网上有不少分析了,这里简单列出关键的几点:

  • 存储空间更大:cookie的大小限制从数K到数M不等,虽然HTML5规范里没有明确说明浏览器需提供多大的本地存储空间,但一般支持的浏览器都会提供数M以上的存储空间

  • 数据仅存储在本地,在与服务器发送交互的时候不会传送到服务器:当向服务器发起请求时,之前设置的cookie会随着请求一起发送到服务器,这对带宽来说是一种浪费,尤其同个域下有多个业务时这种带宽浪费的问题尤为明显(曾见过某业务在cokkie里设置了将近1M的数据,god~)

  • 更加友好的接口,操作数据更加方便:原生API操作cookie很麻烦很麻烦~

  • 独立的存储空间:每个域(包括子域)有独立的存储空间,各个存储空间是完全独立的。体验过同域下cookie相互覆盖导致的问题的童鞋应该深有体会

API简单介绍

1个属性:length;5个方法:setItem、getItem、removeItem、clear

length:

  • 当前Storage对象中存储的key/value对的总数

setItem(key, value)

  • 将key对象的值设置为value,value为String类型

  • 当设置失败,比如用户将本地存储禁用,或者本地存储超过限制的大小时,抛出QuotaExceededError错误

getItem(key)

  • 返回key对应的值,如不存在,返回null

removeItem(key)

  • 如果key在storage中存在,将key对应的key/value对从storage对象中删除;注意:不会返回删除的 value

  • 如果key在storage中不存在,不进行任何处理

clear()

  • 清除Storage对象上所有的key-value值

key(index)

  • 返回index对应位置的key值,当index>length时,返回null

  • 往storage对象上添加key-value值,通过key(index)取回的键是不固定的,跟通过for...in遍历普通的对象一样,依赖于浏览器的实现

storage事件

根据标准的说明,当本地存储的数据发生变化时候,会触发storage事件,对应的事件对象包含了以下属性:

  • key:被更新或删除的键
  • oldValue:键更新前对应的value,如果键原先不存在,则oldValue为null
  • newValue:键更新后的value,如果键被删除,则newValue为null
  • url:storage事件发生的源(页面url)
  • storageArae:一个引用,指向当前发生变化的localStorage或sessionStorage

在storage事件的实现上,各浏览器出现了前端工程师喜闻乐见的兼容性问题,主要体现在两个方面:

  • 触发事件的对象
  • 事件触发时,对应事件对象支持的属性(TODO)

兼容性问题

1、触发的条件

The storage event is fired when a storage area changes, as described in the previous two sections (for session storage, for local storage).

When this happens, the user agent must queue a task to fire an event with the name storage, which does not bubble and is not cancelable, and which uses the StorageEvent interface, at each Window object whose Document object has a Storage object that is affected.

简单概括:当本地存储的数据被修改的时候,会触发storage事件,并将事件放进任务队列里去

  • storage不会冒泡,也不可取消
  • 在所有本地存储被影响到的window对象上触发

上面引用的那段文字似乎没什么特别之处。按照上面的描述假设我当前打开了两个标签,分别访问的是同个域下的页面,如www.example.com下的demo-1.html,demo-2.html

在demo-1.html上有如下代码

window.onstorage = function(){
console.log('storage changed in demo-1');
};

setTimeout(function(){

window.localStorage.intro = 'my name is casper';

}, 3000);

在demo-2.html上有如下代码

window.onstorage = function(){
console.log('storage changed in demo-2');
};

3秒后会发生神马事情?按照预计,demo-1.html、demo-2.html页面的storage都被触发,并打印相关日志,但实际上,只有demo-2.html页面有日志打印出来

“storage changed in demo-2”

在最初的时候有些困惑,于是向群里的兄弟请教,Hax帮忙给了回答,如下

2、事件触发的对象

When the setItem(), removeItem(), and clear() methods are called on a Storage object x that is associated with a local storage area, if the methods did something, then in every Document object whose Window object's localStorage attribute's Storage object is associated with the same storage area, other than x, a storage event must be fired, as described below.

简单概括:假如Storage对象X被修改,如添加、删除ke/value等,则在所有受到影响的文档的window对象上触发storage事件,除了X所在的那个文档 于是之前的现象就解释得通了,如果光看storage event的描述,很容易就掉坑里,很明显的前后不一致。据说在之前的版本里面这里的规定更加不明确,不想考古了,知道现在标准是怎么规定的就行了。

3、事件触发时,对应事件对象支持的属性(TODO)

需要较多的测试工作,小本子测试不方便,未免误导大家,先留个TODO了
可以看下百度的兄弟的总结,相当不错,推荐下(ps:里面的结论未实际测试过):
http://www.baiduux.com/blog/2010/06/21/web-storage%E5%85%A8%E8%A7%A3%E6%9E%90/

写在后面

  • 本文相关的话题,比如cookie在不同浏览器的容量限制、可能存在的问题,web storage的安全相关的内容等,暂不展开,因为内容也不少
  • 文章内容如有错漏,烦请指出 :)

参考

《HTML5高级程序设计》

本文链接


    
最新技术文章:
▪css white-space:nowrap属性用法(可以强制文字不...
▪IE里button设置border:none属性无效解决方法
▪border:none与border:0使用区别
▪html清除浮动的6种方法示例
▪三个不常见的 HTML5 实用新特性简介
▪css代码优化的12个技巧
▪低版本IE正常运行HTML5+CSS3网站的3种解决方案
▪CSS Hack大全-教你如何区分出IE6-IE10、FireFox、Chr...
▪ie6,ie7,ie8完美支持position:fixed的终极解决方案
▪小技巧处理div内容溢出
▪html小技巧之td,div标签里内容不换行
▪纯CSS实现鼠标放上去改变文字内容
▪li中插入img图片间有空隙的解决方案
▪CSS3中Transition属性详解以及示例分享
▪父div高度不能自适应子div高度的解决方案
▪告别AJAX实现无刷新提交表单
▪从零学CSS系列之文本属性
▪HTML 标签
▪CSS3+Js实现响应式导航条
▪CSS3实例分享之多重背景的实现(Multiple background...
▪用css截取字符的几种方法详解(css排版隐藏溢...
▪页面遮罩层,并且阻止页面body滚动。bootstrap...
▪CSS可以做的几个令你叹为观止的实例分享
▪详细分析css float 属性以及position:absolute 的区...
▪IE6/IE7/IE8/IE9中tbody的innerHTML不能赋值的完美解...
▪CSS小例子(只显示下划线的文本框,像文字一...
▪可以给img元素设置背景图
▪不通过JavaScript实现的自动滚动视差效果
▪div+CSS 兼容小摘
▪CSS的inherit与auto使用分析
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3