??xml version="1.0" encoding="utf-8" standalone="yes"?> HTML 4.0 的新Ҏ之一是能够 HTML 事g触发览器中的行为,比如当用LL?HTML 元素时启动一D?JavaScript。下面是一个属性列表,可将之插?HTML 标签以定义事件的行ؓ?/p>
除了上面的鼠?事g属性,IE 览器还支持下面的属性: 下面列出?2 U?DOM 事g标准定义的属性?/p>
2、节点属性和Ҏ
3、Ajax安全和工作区
4、Ajax数据QXML?JSONQJavaScript对象W号Q?/a>
1、DOM
?W3C关于 DOM的规范中Q将 document元素描述Z个节?node)集合Q他们之间是以有层次的树形结构连接的。你不仅可以从树上读取节点,q可以删除或创徏新的节点?br />
#document
html
head
title
body
h1
div
p
#text
p
#text
2、节点属性和Ҏ
对于文档树上的每个节炚w拥有 DOM(Core)?Node对象中定义的基本属性和基本Ҏ集。Node对象的属性主要包括:
nodeNameQ对象名Uͼ?head元素的名U就?HEADQ?br />
nodeValueQ如果不是一个元素,则返回对象|
nodeTypeQ用数字表示的节点类型;
parentNodeQ当前节点的父节点;
childNodesQ由其子节点l成?NodeListQ前提是存在子节点;
firstChildQ由子节点组成的 NodeList中的W一个节点;
lastChildQ由子节点组成的 NodeList中的最后一个节点;
previousSiblingQ如果当前节Ҏ位于 NodeList中的子节点,那么它表C的是该列表中的前一个节点;
nextSiblingQ如果当前节Ҏ位于 NodeList中的子节点,那么它表C的是该列表的下一个节点;
attributesQ一?NamedNodeMapQ它是以?值对形式表示的,是该元素的属性列表;
ownerDocumentQ拥有的 document对象Q当你拥有多?document对象时它比较有用Q?br />
namespaceURIQ命名空间的 URIQ如果有的话Q他是针对节点的Q?br />
PrefixQ命名空间的前缀Q如果有的话Q它是针对节点的Q?br />
localNameQ如果指定了 namespaceURI的话Q它表示的是节点的本地名?
3、Ajax安全和工作区
?Ajax遵@ JavaScript中相同源、相同域的规则:?Web面中只能调用相同服务器Q相同域Q的 Web服务Q也是_服务器端面与服务器发送请求的面处于相同的服务器、相同的域中?br />
但是对于 AjaxE序而言Q向本地服务器端h一?Web服务Q然后接收本地服务器的返回信息即可。它q不兛_本地 Web服务实际上是否通过讉Kq程 Web服务实现的?
4、Ajax数据QXML?JSONQJavaScript对象W号Q?/strong>
XML格式?Ajax应答
好处是比单的字符串或 HTML片段更多元。另外,你还可以向对?Web面元素那样Q直接通过 DOMҎ来操?Ajax调用q回?XML格式应答?br />
保在服务器端应用程序在q回数据时设|了正确的数?MINEcd text/xmlQ然后通过 XMLHttpRequest对象?responseXML容器来获取应{信息?br />
JSON
JSON是一U?#8220;轻量U的数据交换格式”。和一l由逗号分开的字W串Q以及处理复杂(成本高昂Q的 XML相比QJSON是一U很Ҏ服务器端数据结构{?JavaScript对象的数据格式?br />
JSON实际上就是?JavaScript语法定义的对象,一个对象的语法包括一对大括号以及其中的成员:
object{ } or object { string : value ...}
对于数组而言Q他是由一l元素加上一Ҏ括号l成的:
array[] or array[ value, value, value, ..., value ]
注:?JavaScript可以用单引号或双引号来引用字W串Q?JSON只支持双引号?br />
CZQ在 PHP脚本中用简单的 JSON
$result = '[ { "value" : "stlou", "title" : "St. Louis" }, ' .
' { "value" : "kc" , "title" : "Kansas City" } ]';
JSON对象
?http://www.json.org/js.html上可以找C?JSON JavaScriptE序库,它提供了一些基于该E序库的 JSON对象。包含了直接讉K JSON对象的静态方法:
JSON.parseQ基于指定的 JSON格式字符串创Z?JavaScript对象Q?br />
JSON.stringifyQ将一?JavaScript对象序列化成一?JSON格式的字W串?br />
JSON CZ1Q?br />
var response = JSON.parse(xmlHttpObj.responseText);
var citySelection = document.getElementById("citySelection");
var name = value = null;
//处理?nbsp;JSON对象q回的数?/span>
for (var i=0; i<response.length; i++) {
name = response[i].title;
value = response[i].value;
citySelection.options[i] = new Option(name, value);
}
JSONCZ2Q?
{ "title" : "Appletini",
"ingredients" : [ { "ingredient" : "1 ounce vodka"},
{ "ingredient" : "1/2 ounce Sour Apple Pucker or apple schnapps "} ],
"instruction" : "Mix vodka and schnapps in a glass filled with ice." }
//============================================================
//处理 JSON数据
//创徏对象
var recipeObj = JSON.parse(xmlhttp.responseText);
var recipe = document.createElement('div');
recipe.id = 'recipe';
recipe.className = 'recipe';
//d标题
var title = recipeObj['title'];
var titleNode = document.creteElement('h3');
titleNode.appendChild(document.createTextNode(title));
recipe.appendChild(titleNode);
//d配方成分
var ingredients = recipeObj.ingredients;
for (var i=0; i<ingredients.length; i++){
var item = ingredients[i].ingredient;
}
.
body[0].appendChild(recipe);
]]>
2、同源安全策?/a>
3、cookie
览器对象模型(BOMQ是一l从览器上下文l承而来的对象,q也是绝大多?JavaScript应用E序中函数运行的上下文。有时它也被UC?DOM Level 0Q或者就?DOM?br />
BOM是一l有限的公共 Web对象Q也是一个层ơ化的对象集Q每个层ơ上的对象都可以通过它们的父对象来访问,比如 window[navigator, location, frames, screen, history, document[forms, cookie, link/anchors, images, embeds/plug-ins, all]]?br />
讉K对象Ӟ你可以:
var theImage = document.form[0].elements["someelement"].value;
1、window对象
览器的 window对象装了整个浏览器环境Q包?window?chrome"Q组成浏览器H体的通用lgQ、实际的 Web面Q以及页面中的事件?br />
通过 window可以手动讄览器状态条上的状态,执行打开一个新H口、重新调整已昄H口的大、关闭窗口等操作。不q随着动?Web效果?Ajax的流行,q种弹出式窗口越来不被喜Ƣ?br />
window对象的方法和属性可以分?c:
a. 创徏新窗口,l护现有H口行ؓ
弹出式对话框Qalert、confirm?prompt
创徏自定义窗口:window.open()
l护H口Q通过H口的引用能够完成该H口的维护,要维护父H口则用关键字 openerQ要l护包含当前q行脚本的窗口,则应该用关键字 self?br />
b. 在窗口中创徏带分区的文档Q和iframesQ?br />
frame对象定义了以下元素:parent、length?name。对于跨帧通信而言Qname?parent属性特别重要。其父元?framesetQ集,包括帧的H口Q可以通过每个帧的名字讉K所有子帧(也可以通过帧数l,以对象数量作为烦引|Q每个都可以通过通用的关键字 parent来访问该帧集。兄弟元素之间可以通过 parent和对方的 name属性来讉K?br />
和标准的帧不一Piframe是内嵌在面中的。你可以为其指定高度和宽度,如果它们都讄?Q那么它将被隐藏v来。iframe会把它嵌入到的页面视q父元素,q也是它和更高层面q行通信的方法。通常Q你可以使用 document?getElementByIdҎ来访问它Q也可以使用 target属性蝲入其内容?br />
c. 定时器的创徏和控?br />
有两cd时器Q一cL一ơ性的Q另一cL周期性用的。两U定时器都能取消Q一ơ性定时器Ҏ只会被调用一ơ?br />
要想创徏一个不重复触发的定时器Q可以?setTimeoutҎQ?br />
var tmOut = setTimeout("func", 5000, "param1", param2,,,,, paramn);
如果x除这个定时器Q可以?clearTimeoutҎQ?br />
clearTimeout(tmOut);
如果你想周期性地使用q个定时器,那么应调?setIntervalҎQ?br />
var tmOut = setInterval("functionName", 5000);
同样Q如果想暂停或取消这个周期性定时器Q可以?clearIntervalҎ。如果你惛_C个周期性定时器Q但又想在参C指定一个函数文字量Q那么你可以在每ơ定时器q期时再?setTimeout函数重新讄q个定时器?br />
注:
?IE览器中QsetInterval?setTimeoutҎ是不支持在最后添加函数调用所需参数的?br />
d. 用来控制览器其他元?/strong>
history对象
history对象负责l护览器中面载入操作的历史记录。同P其方法和属性能够完成通过览器的后退和前q按钮所能实现的D操作?br />
screen对象
screen对象所包含的信息是屏幕昄有相关的Q包括其宽度、高度,以及颜色或像素浓淡。虽然他们不是很常用Q但他们对于那些需要修Ҏ览器H口大小、创建需要特定调色板的带色彩对象{功能而言是不错的选择?br />
navigator对象
navigator对象中提供的是和览器或其他讉K该页面的用户代理相关的信息。通过它可以检查操作系l、浏览器或浏览器族、安全策略、语a以及 cookie是否启用?br />
document对象
1.链接和锚
document对象?links集合是由面中所有超链接l成的,它的讉KҎ和数l一栗?
2.囑փ
和链接一P囑փ也有其对应的对象Q也可以直接讄他们的属性,如表C图?URL?src属性?br />
3.innerHTML
使用 innerHTML属性可以修攚w面中M一?HTML元素Q它之所以仍然流行,是因为通过它修攚w面元素时无需构徏整个面的内容,你只需创徏一?HTML格式的字W串Q然后通过 innerHTML可以添加到 Web面中。不q,使用 innerHTML意味着无论?Web面d了什么,他们都无法融合到面?document树上Q因此如果你混合使用 innerHTML和新?DOMҎ会带来很大的破坏?
2、同源安全策?/strong>
同源安全{略保了不同域名、协议或端口的页面之间不能够通过脚本q行通信。同源安全策略将应用于不同页面之间的通信Q包括父H口中的表单和内嵌窗口之间的通信Q如帧及 iframe?
3、cookie
cookie的意义就是一个带有过期时间、域名、\径的型的键/值对Q之所以需要提供这些消息,是ؓ了确保正的服务器能够读取到正确?cookie。这些信息将作ؓ Webh的一部分发送,因此在服务器端和览器都能访问这些数据?br />
讄、读取、删?cookie
window.onload = function() {
if (navigator.cookieEnabled) {
var sum = readCookie("sum");
if (sum) {
var iSum = parseInt(sum) + 1;
alert("cookie count is " + iSum);
if (iSum > 5) {
eraseCookie("sum");
} else {
setCookie("sum", iSum);
}
} else {
alert("no cookie, setting now");
setCookie("sum", 0);
}
}
}
// ?nbsp;cookie有效期设|ؓ 2016q?/span>
function setCookie(key, value) {
var cookieDate = new Date(2016, 11, 10, 19, 30, 30);
document.cookie = key + "=" + encodeURI(value) + "; expires=" + cookieDate.toGMTString() + "; path=/";
}
// 在每?nbsp;cookie之前用分号隔开
function readCookie(key) {
var cookie = document.cookie;
var first = cookie.indexOf(key + "=");
// 存在 cookie
if (first >= 0) {
var str = cookie.substring(first, cookie.length);
var last = str.indexOf(";");
// 如果是最后一?nbsp;cookie
if (last < 0) last = str.length;
// 获取 cookie的?/span>
str = str.substring(0, last).split("=");
return decodeURI(str[1]);
} else {
return null;
}
}
// ?nbsp;cookie的有效期讄成过去,以达到删?nbsp;cookie的目?/span>
function eraseCookie (key) {
var cookieDate = new Date(2000, 11, 10, 19, 30, 30);
document.cookie = key + "= ; expirse=" + cookieDate.toGMTString() + "; path/";
}
]]>
2、选择列表?br />
3、单选按钮和复选框
4、测?/a>
1、跨览器兼容的事g处理
function catchEvent(eventObj, event, eventHandler) {
if (eventObj.addEventListener) {
eventObj.addEventListener(event, eventHandler, false);
} else if (eventObj.attachEvent) {
event = "on" + event;
eventObj.attachEvent(event, eventHandler);
}
}
//可复用的事g取消函数
function cancelEvent(event) {
if (event.preventDefault) {
event.preventDefault();
event.stopPropagation();
} else {
event.retrunValue = false;
event.cancelBubble = true;
}
}
2、选择列表?/strong>
for (var i=0; i<opts.length; i++) {
if (opts[i].selected) {
alert(opts[i].text + " " + opts[i].value);
}
}
a.动态添加一个新的选项Q由于数l的索引值是?0开始编LQ因此只要以数组?length属性作为烦引|可以在数组的最后面d一个新的数l元素?br />
opts[opts.length] = new Option["Option Four", "Opt4"];
b.删除一个选项Q只需数l中该选项讄?nullQ这h作将会重新安排数l,而不会导致编号不q箋的现象?br />
opts[2] = null;
如果惛_除所有选项Q那么只需数l的 length讄?0?br />
opts.length = 0;
自动选择
var theEvent = evnt ? evnt : window.event;
var opts = document.getElementById("someForm").selectOpts.options;
for (var i=0; i<opts.length; i++) {
if (opts[i].selected) {
switch (opts[i].value) {
case "Opt1" : opts[i+1].selected = true;
break;
case "Opt3" : opts[i+1].selected = true;
break;
case "Opt5" : opts[i+1].selected = true;
break;
}
}
}
3、单选按钮和复选框
var buttons = document.getElementById("radioGroup");
for (var i=0; i<buttons.length; i++)
{
if (buttons[i].checked) {
alert(buttons[i].value);
}
}
var colorOpts = document.getElementById("someForm").getElementByTagName("input");
//遍历复选框中的每个 checkboxQ检查是否被选中
var isChecked = false;
for (var i=0; i<colorOpts.length; i++) {
if ((colorOpts[i].type == "checkbox") && (colorOpts[i].checked)) {
ifChecked = true;
break;
}
}
//没有一?nbsp;checkbox被选中
if (!isChecked) {
alert("no choose!");
}
4、测?/strong>
QQ如果表单数据不完整或无效,如何停止表单提交操作Q?br />
AQ?br />
如果你?DOM Level 0的事Ӟ那么只要在事件句柄中q回 false|q且在事件句柄脚本中取消表单提交操作卛_?br />
如果你?DOM Level 2模型Q那么就?event对象?cancelBubble属性设|ؓ trueQ针?IEQ,q调用其 preventDefaultҎQ针对其他浏览器Q?br />
]]>
2、事?/a>
3、Event对象
4、事件冒?/a>
5、事件句柄和 this
6、DOM Level 2事g模型
7、测?/a>
1、排错、调?/strong>
Firebug是最常用?Firefox开发工P同时常用?Web工具q有 Web Developer toolkitQ该工具功能包括面 HTML?CSS代码的校验、可讉K性检查、查?CSS?cookies、检查图像、查?JavaScript修改后的面源代码(包括动态源代码Q?
2、事?br />
事g包括Q用L面事Ӟ鼠标、键盘触发的Q、逻辑事gQ一个处理的l果Q、和变化事gQ修Ҏ档的操作Q?br />
事g句柄 (Event Handlers)
注:HTML DOM Event 对象 http://www.w3school.com.cn/htmldom/dom_obj_event.asp
属?/th>
此事件发生在何时...
IE
F
O
W3C
onabort
囑փ的加载被中断?/td>
4
1
9
Yes
onblur
元素失去焦点?/td>
3
1
9
Yes
onchange
域的内容被改变?/td>
3
1
9
Yes
onclick
当用LL个对象时调用的事件句柄?/td>
3
1
9
Yes
ondblclick
当用户双L个对象时调用的事件句柄?/td>
4
1
9
Yes
onerror
在加载文档或囑փ时发生错误?/td>
4
1
9
Yes
onfocus
元素获得焦点?/td>
3
1
9
Yes
onkeydown
某个键盘按键被按下?/td>
3
1
No
Yes
onkeypress
某个键盘按键被按下ƈ村ּ?/td>
3
1
9
Yes
onkeyup
某个键盘按键被松开?/td>
3
1
9
Yes
onload
一张页面或一q图像完成加载?/td>
3
1
9
Yes
onmousedown
鼠标按钮被按下?/td>
4
1
9
Yes
onmousemove
鼠标被移动?/td>
3
1
9
Yes
onmouseout
鼠标从某元素Ud?/td>
4
1
9
Yes
onmouseover
鼠标Ud某元素之上?/td>
3
1
9
Yes
onmouseup
鼠标按键被松开?/td>
4
1
9
Yes
onreset
重置按钮被点凅R?/td>
4
1
9
Yes
onresize
H口或框架被重新调整大小?/td>
4
1
9
Yes
onselect
文本被选中?/td>
3
1
9
Yes
onsubmit
认按钮被点凅R?/td>
3
1
9
Yes
onunload
用户退出页面?/td>
3
1
9
Yes
内联模式/内联注册模式Q?br />
以属性的形式?HTML元素d属性的Ҏ?br />
<body onload="var 1=23; i*=3; alert(i);">
<body onload="calcNumber();">
传统模式/传统注册模式Q?br />
通过对象属性将一个函数指zؓ事g句柄。如果想用事g处理Q那么可以将事g句柄的D?null?br />
window.onload = calcNumber;
注:
?DOM Level 0事g模型中,M对象只允许指定一个事件句柄。如果你想针Ҏ一特定对象的某个事件指定多个函敎ͼ则需要在事g句柄代码中列Z们:
内嵌模式Q?br />
<body onload="helloMsg(); helloTwice();">
传统模式Q?br />
function helloMsg() {
var helloString = "hello there";
alert(helloString);
helloTwice();
}
当要求浏览器停止执行事g行ؓQ可以从事g句柄函数中返?false倹{?
3、Event对象
Event对象是和所有事件相关的。它有一些用来提供事件相关信息的属性,?Web面中鼠标点ȝ位置?br />
IE?Event视ؓ window对象的属性。当处理事gӞ通过E序讉K window对象Q其所包含的数据也会相应的q行填充?
var locString = "X = " + window.event.screenX + " Y = " + window.event.screenY;
alert(locString);
}
document.onmousedown = mouseDown;
在基?Netscape的浏览器Q如 Firefox、Mozilla、Opera?SafariQ中Q获?Event对象的方法是不同的:他将作ؓ函数的一部分传入?
var locString = "X = " + theEvent.screenX + " Y = " + theEvent.screenY;
alert(locString);
}
document.onmousedown = mouseDown;
处理q些览器差异的Ҏ之一是检查传入函数的 Event对象是否已经实例化。如果是Q那么将q个 Event对象赋给一个局部变量;否则Q将假定 window.event事gQƈ其赋给q个局部变量?
var theEvent = nsEvent ? nsEvent : window.event; //判断 nsEvent对象是否已定义。定义则赋|否则选择 window.event属?/span>
var locString = "X = " + theEvent.screenX + " Y = " + theEvent.screenY;
alert(locString);
}
document.onmousedown = mouseDown;
鼠标 / 键盘属?/h2>
注:HTML DOM Event 对象 http://www.w3school.com.cn/htmldom/dom_obj_event.asp
属?/th>
描述
IE
F
O
W3C
altKey
q回当事件被触发Ӟ"ALT" 是否被按下?/td>
6
1
9
Yes
button
q回当事件被触发Ӟ哪个鼠标按钮被点凅R?/td>
6
1
9
Yes
clientX
q回当事件被触发Ӟ鼠标指针的水q_标?/td>
6
1
9
Yes
clientY
q回当事件被触发Ӟ鼠标指针的垂直坐标?/td>
6
1
9
Yes
ctrlKey
q回当事件被触发Ӟ"CTRL" 键是否被按下?/td>
6
1
9
Yes
metaKey
q回当事件被触发Ӟ"meta" 键是否被按下?/td>
No
1
9
Yes
relatedTarget
q回与事件的目标节点相关的节炏V?/td>
No
1
9
Yes
screenX
q回当某个事件被触发Ӟ鼠标指针的水q_标?/td>
6
1
9
Yes
screenY
q回当某个事件被触发Ӟ鼠标指针的垂直坐标?/td>
6
1
9
Yes
shiftKey
q回当事件被触发Ӟ"SHIFT" 键是否被按下?/td>
6
1
9
Yes
注:
?IE中,fromElement 对于 mouseover ?mouseout 事gQfromElement 引用Ud鼠标的元素?nbsp;
而在 Mozilla/Firefox中,relatedTarget q回与事件的目标节点相关的节炏V?
要解x览器差异Q可以用:
var oldElement = theEvent.fromElement ? theEvent.fromElement : theEvent.relatedTarget;
4、事件冒?br />
如果你ؓ多个嵌套的元素设|相同的事g句柄Q会发生什么呢Q他们将以什么样的顺序触发?如果你想使得一ơ只影响一个元素,那么如何保存触发事g句柄的事件呢Q?br />
要管理元素堆栈中的事Ӟ其中一个方法就是众所周知的事件冒泡。在事g冒中,最内部的元素将首先触发该事Ӟ然后堆栈内的下一个元素触发该事gQ以此类推,直到最外面的元素。如果事件句柄被指定l所有元素,那么q些事g依ơ被触发?br />
如果 div2?div1内部Q?div1又在 document内部Q三者都做了事g处理。当事g触发的时候,优先最里面?div2元素Q然后是 div1元素Q最后是 document元素?br />
如果你有一个元素堆栈,q且只希望一个元素触发该事g句柄Q那么你可以取消事g冒机制。如果在 IE中要取消一个事件冒泡,可以使用 IE中事件的 cancelBubble属性;对于 Mozilla而言Q则应该使用事g?stopPropagationҎ。你可以先检?stopPropagationҎ是否存在Q然后根据其l果定使用哪种ҎQ?
if (evnt.stopPropagation) evnt.stopPropagation;
else evnt.cancelBubble = true;
}
//注:IE 7中调试出错,提示信息 "stopPropagation为空或不是对??/span>
5、事件句柄和 this
this关键字表C的是当前调用的函数或者方法的所有者。对于一个全局变量而言Q它表示的就?window对象。对于一个对象的Ҏ而言Q它表示的就是该对象实例。而在一个事件句柄中Q它表示的就是接收到该事件的元素?
alert(this); //?nbsp;Firefox中将输出 "[object HTMLDivElement]"
alert("first element event");
}
6、DOM Level 2事g模型
对于堆栈内元素的事g处理Q还有一U被UCؓ事g捕捉(event capturing)?cascade-down的事件处理机制。对于前面这个包?个元素的CZ而言Q事件将从最外面的元素开始触发:window -> div1 -> div2?br />
老事件模型和新的 DOM Level 2事g模型之间Q主要区别:
a.C件模型ƈ不依赖于特定的事件来处理属性;
b.你可以对M一个对象的M一U事件注册多个事件句柄函数?br />
新的事g句柄提供?个方法:
addEventListenerQ添加一个事件监听器Q?br />
removeEventListenerQ删除一个事件监听器Q?br />
dispatchEventQ分发一个新的事件?br />
CZQ?br />
object.addEventListener('event', eventFunction, boolean);
?click?load之类的事件是其第一参数Q第二个参数是指定的事g句柄函数Q第三个参数用来指定事g是以 cascade-down或者冒泡模式处理的。当W三个参Cؓ false时这个事件监听器以冒模式处理Q否则将把这个事件监听器Ҏ事g捕捉模型?
alert("Capturing: " + this);
}
function bubbleUp(evnt) {
alert("Bubbling: " + this);
}
window.onload = setup;
function setup(evnt) {
//事g捕捉
document.addEventListener("click", cascadeDown, true);
document.forms[0].addEventListener("click", cascadeDown, true);
document.forms[0].elements[0].addEventListener("click", cascadeDown, true);
//事g冒
document.addEventListener("click", bubbleUp, false);
document.forms[0].addEventListener("click", bubbleUp, false);
document.forms[0].elements[0].addEventListener("click", bubbleUp, false);
}
/*
?nbsp;Firefox中,单击按钮顺序生?个对话框
Capturing: [object HTMLDocument]
Capturing: [object HTMLFormElement]
Capturing: [object HTMLInputElement]
Bubbling: [object HTMLInputElement]
Bubbling: [object HTMLFormElement]
Bubbling: [object HTMLDocument]
*/
如果你想停止事g执行Ӟ可以在函C调用 stopPropagationҎQ?br />
function cascadeDown(evnt) {
...
evnt.stopPropagation();
}
如果要彻底删除一个事件监听器Q可以?removeEventListenerҎQ?br />
document.removeEventListener("click", cascadeDown, true);
?IE中,?addEventListener?removeEventListenerҎ怼的是 attachEvent?detachEventQ对应语法是Q?br />
object.attachEvent("eventhandler", function);
W一个参数是事g句柄Q第二个是其函数。detachEvent语法cM?br />
跨浏览器解决ҎQ?/strong>
window.onunload = cleanup;
function setup(evnt) {
var evtObject = document.getElementById("clickme");
//查对象模?/span>
if (evtObject.addEventListener) evtObject.addEventListener("click", clickMe, false);
else if (evtObject.attachEvent) evtObject.attachEvent("onclick", clickMe);
else if (evtObject.onclick) evtObject.onclick=clickMe;
}
/*清理
?nbsp;IE中,需要跟t?nbsp;window?nbsp;unload事gQ然后调?nbsp;detachEventҎ清理Q释攄应的内存
?nbsp;addEventListenerҎ使用的内存是无需清理的?br />
*/
function cleanup() {
var evtObject = document.getElementById("clickme");
if (evtObject.detachEvent) evtObject.detachEvent("onclick", clickMe);
}
function clickMe() {
alert("clickMe");
}
IE 属?/h2>
注:HTML DOM Event 对象 http://www.w3school.com.cn/htmldom/dom_obj_event.asp
属?/th>
描述
cancelBubble
如果事g句柄想阻止事件传播到包容对象Q必L该属性设?true?/td>
fromElement
对于 mouseover ?mouseout 事gQfromElement 引用Ud鼠标的元素?/td>
keyCode
对于 keypress 事gQ该属性声明了被敲ȝ键生成的 Unicode 字符码。对?keydown ?keyup 事gQ它指定了被敲击的键的虚拟键盘码。虚拟键盘码可能和用的键盘的布局相关?/td>
offsetX,offsetY
发生事g的地点在事g源元素的坐标pȝ中的 x 坐标?y 坐标?/td>
returnValue
如果讄了该属性,它的值比事g句柄的返回g先高。把q个属性设|ؓ fasleQ可以取消发生事件的源元素的默认动作?/td>
srcElement
对于生成事g?Window 对象、Document 对象?Element 对象的引用?/td>
toElement
对于 mouseover ?mouseout 事gQ该属性引用移入鼠标的元素?/td>
x,y
事g发生的位|的 x 坐标?y 坐标Q它们相对于用CSS动态定位的最内层包容元素?/td>
标准 Event 属?/h2>
注:HTML DOM Event 对象 http://www.w3school.com.cn/htmldom/dom_obj_event.asp
属?/th>
描述
IE
F
O
W3C
bubbles
q回布尔|指示事g是否是v泡事件类型?/td>
No
1
9
Yes
cancelable
q回布尔|指示事g是否可拥可取消的默认动作?/td>
No
1
9
Yes
currentTarget
q回其事件监听器触发该事件的元素?/td>
No
1
9
Yes
eventPhase
q回事g传播的当前阶Dc?/td>
Yes
target
q回触发此事件的元素Q事件的目标节点Q?/td>
No
1
9
Yes
timeStamp
q回事g生成的日期和旉?/td>
No
1
9
Yes
type
q回当前 Event 对象表示的事件的名称?/td>
6
1
9
Yes
7、测?br />
Q1Q?DOM Level 0Ҏ?document?click事g指定一个事件句柄函数?br />
A1Qdocument.onclick = clickMe;
Q2Q?DOM Level 2事g处理机制?documentd click事g句柄?br />
A2Qdocument.addEventListener("click", clickMe, false);
Q3Q如果事g处理机制能安全运行所有浏览器Q?br />
A3Q?br />
if (evtObject.addEventListener) evtObject.addEventListener("click", clickMe, false);
else if (evtObject.attachEvent) evtObject.attachEvent("onclick", clickMe);
else if (evtObject.onclick) evtObject.onclick=clickMe;
Q4Q对于ؓ document对象指定?onclick事g句柄Q如何知道是在屏q的什么位|执行了单击操作Q?br />
A4Q?br />
如果使用 DOM Level 0事g处理pȝQ那么将无法使用 window对象?event对象Q也不能其作ؓ参数传给函数?br />
对于 DOM Level 2事g处理模型而言Qevent对象会传给事g句柄函数Q你可以通过 event对象讉K?screenX?screenY属性?br />
Q5Q?DOM Level 2事gpȝQ如何阻止从其他元素中冒泡上来的事g?br />
A5Q?br />
IE所支持的方法和l大多数览器所支持的方法有所不同Q因此你需要分别支?IE和其他浏览器。你可以?event对象是否支持 stopPropagationҎ。如果支持,则调用它Q否则就?cancelBubble属性的D|ؓ true?br />
Q7Q捕?document对象?keydown事g
A7Q?
if (document.addEventListener) document.addEventListener("keydown", getKey, false);
else if (document.attachEvent) document.attachEvent("onkeydown", getKey);
else if (document.onkeydown) document.onkeydown=getKey;
}
function getKey(evnt) {
var theEvent = evnt ? evnt : window.event;
alert(theEvent.which); //Firefox q回|IE 7提示 undefined
}
]]>
3、正则表辑ּ
4、数l?/a>
5、函?/a>
6、匿名函?/a>
7、函数字面量
1、字W串基本cd和字W串对象的相互{?/strong>
如果创徏的是字符串基本类型,却又以对象的行ؓ讉KQ那?JavaScript会将该基本类型自动{换成对象Q但是{换成?String对象只是一个时变量,q且在属性操作后销毁该对象Q所以这U操作不够有效,多了一ơ{换的q程而已?br />
var strName = "Shelley"; //字符串基本类?br />
alert(strName.length); //隐式创徏 String对象Q数g strName相同Qƈ执行 lengthҎ
2、String对象
本节内容引自QJavaScript String 对象参考手?br />
http://www.w3school.com.cn/js/jsref_obj_string.asp
var sObject = new String("Sample string");
字符串是 JavaScript 的一U基本的数据cd。String 对象?length 属性声明了该字W串中的字符数。String cd义了大量操作字符串的ҎQ例如从字符串中提取字符或子Ԍ或者检索字W或子串?br />
需要注意的是,JavaScript 的字W串是不可变的(immutableQ,String cd义的Ҏ都不能改变字W串的内宏V像 String.toUpperCase() q样的方法,q回的是全新的字W串Q而不是修改原始字W串?br />
在较早的 Netscape 代码基的 JavaScript 实现中(例如 Firefox 实现中)Q字W串的行为就像只ȝ字符数组。例如,从字W串 s 中提取第三个字符Q可以用 s[2] 代替更加标准?s.charAt(2)。此外,对字W串应用 for/in 循环Ӟ它将枚D字符串中每个字符的数l下标(但要注意QECMAScript 标准规定Q不能枚?length 属性)。因为字W串的数l行Z标准Q所以应该避免用它?
3、正则表辑ּ
正则表达式是由字W串所l成的表辑ּQ用于匹配、替换或者查扄定的字符丌Ӏ通过 RegExp对象可以昑ּ地创建正则表辑ּQ?br />
var searchPatten = new RegExp('s+');
也可以用文字量方式创徏正则表达式:
var searchPatten = /s+/;
testҎ
testҎ判断以参数传入的字W串是否与正则表辑ּ相匹配?br />
/* var re = new RegExp('s+', 'g'); //对象实例Q第二个参数表示匚w选项 */
var str = "Javascript rules";
if (re.test(str)) document.writeln("I guess it does rule");
其中修饰W?br />
i 执行对大写不敏感的匚w?
g 执行全局匚wQ查找所有匹配而非在找到第一个匹配后停止Q?
m 执行多行匚w?
execҎ
var str = "cfdsJS *(&YJSjs 888JS";
var resultArray = re.exec(str);
while (resultArray) {
document.writeln(resultArray[0]);
document.writeln("next match starts at " + re.lastIndex + "<br />");
resultArray = re.exec(str);
}
/*
׃讄选项 gQRegExp中的 lastIndex属性会讄Z一ơ匹配的位置Q所以每?nbsp;exec调用都会查找下一个匹配。该CZ中d扑ֈ4ơ匹配,当没有匹配时Q将会返回的数值是I?nbsp;nullQ当数组为空值时循环自动l束?nbsp;
输出Q?br />
JS next match starts at 6
JS next match starts at 13
js next match starts at 15
JS next match starts at 21
*/
execҎ返回一个数l,但是数组q不是所有匹配项Q而是当前匚w和所有带圆括L子字W串。如果在表达式中使用圆括号引用正则表辑ּ的某部分Q那么匹配的时候,q些括号所匚w的字W串也会体现在返回的数组中?br />
var str = "cfdsJS *(&dsjjjsYJSjs 888dsdsJS";
var resultArray = re.exec(str);
while (resultArray) {
document.writeln(resultArray[0]);
document.writeln("next match starts at " + re.lastIndex + "<br />");
for (var i=1; i<resultArray.length; i++)
{
document.writeln("substring of " + resultArray[i] + "<br />");
}
document.writeln("<br />")
resultArray = re.exec(str);
}
/*
输出Q?br />
dsJS next match starts at 6
substring of ds
substring of JS
dsjjjs next match starts at 16
substring of ds
substring of jjjs
dsdsJS next match starts at 31
substring of ds
substring of JS
*/
支持正则表达式的 String 对象的方?br />
search 索与正则表达式相匚w的倹{?
match 扑ֈ一个或多个正则表达式的匚w?
replace 替换与正则表辑ּ匚w的子丌Ӏ?br />
split 把字W串分割为字W串数组?br />
参考:JavaScript RegExp 对象参考手?br />
http://www.w3school.com.cn/js/jsref_obj_regexp.asp
4、数l?/strong>
数组不一定是一l的Q在 JavaScript中管理多l数l的Ҏ是ؓ每个数组元素创徏一个新的数l?br />
var threedPoints = new Array();
threedPoints[0] = new Array(1.2, 3.33, 2.0);
threedPoints[1] = new Array(5.3, 5.5, 5.5);
threedPoints[2] = new Array(6.4, 2.2, 1.9);
var newZPoint = threedPoints[2][2]; //数组以烦引方式访?br />
数组?concat ?slice都不会改变原有数l,而只是创Z个新的数l以作ؓҎ的返回倹{?br />
在大多数情况下,数组元素的顺序ƈ不重要,不过也有些需要维护数l元素顺序的场景Q例如队列。数l维护队列的ҎQ?br />
push 元素添加到数组后面
unshift 元素添加到数组最前面
pop U除数组的最后一个元?br />
shift U除W一个元?br />
数组的访?br />
for (var i=0; i<threedPoints[0].length; i++){
alert(threedPoints[0][i]);
}
//使用 forin 循环
for (var itemIndex in threedPoints[0]){
document.writeln(threedPoints[0][itemIndex] + "<br />");
}
Ҏ逗号分隔的字W串方式创徏数组
var animalArray = animalString.split(",");
alert(animalArray[2]); //alert box display birds
JavaScript Array 对象参考手?br />
http://www.w3school.com.cn/js/jsref_obj_array.asp
5、函?/strong>
JavaScript中函数和对象怼Q你可以定义一个函敎ͼ创徏一个新的函敎ͼ甚至输出一个函数。正是因为有了这个功能,你可以将一个函数给一个变量或数组元素Q甚臛_以将其作为参Cl另一个函数调用?br />
?JavaScript中有3U创建函数的ҎQ声明式?静态的、动态的/匿名的、字面量式的。在使用它们之前Q理解各U方法的效果是十分重要的?br />
如果在一个函C需要执行多个Q务,可以考虑这个函数拆分成几个更小的单元,q样做可提高复用性。在实际中,量让函数短、其特定于某个人物、尽量保持通用是应该遵守的规则?
6、匿名函?br />
匿名/动态函数对于定义一个在q行时才能确定需求的函数而言是个很好的方法。匿名函数每ơ访问都会解析一ơ。用匿名函数构造器Q?br />
var variable = new Function("param1", "param2",...,"paramn","function body");
用户通过 alert对话框来讄定义函数所需的函C及两个参敎ͼ
然后调用该函敎ͼ
其生成的结果输出到面上?br />
注:FF调试通过QIE7异常
*/
//提示输入函数体和参数
var func = prompt("Enter function body:");
var x = prompt("Enter value of x:");
var y = prompt("Enter value of y:");
//调用q个匿名参数
var op = new Function("x", "y", func);
var theAnswer = op(x, y); //function anonymous(x, y) {}
//输出函数执行l果
alert("Function is: ", func);
alert("x is: " + x +
"; y is: " + y);
alert("The answer is: " + theAnswer);
/*
输入/输出Q?br />
Function is: return x * y;
x is : 33; y is : 11;
The answer is: 363;
*/
7、函数字面量
函数字面量也U函数表辑ּQ因样创建的函数成辑ּ的一部分Q而不是一个特有类型的语句Q他们像匿名函数一h有定义函数名Uͼ但函数字面量只会被解析一ơ,它是静态的?br />
当你惛_现如吧一个函C为另一个函数的参数之类的扩展时Q函数字面量的特色就会显C出来?br />
//第三个参数作ؓ函数来声?br />
function funcObject(x,y,z){
alert(z(x,y));
}
//W三个参数是一个函?br />
funcObject(3, 4, function(x, y){ return x*y})
]]>
3、CDATA节
4、null和undefined变量
5、羃减JavaScript代码
1、Script?defer属?br />
如果defer属性设|ؓ"defer"Q那么表C脚本不会生成M文档内容Q于是浏览器可以提前处理面的剩余部分,在页面处理结束ƈ做好昄准备时才处理脚本部分。defer属性可以提高页面蝲入的速度Q特别是那些引用了大量的JavaScript代码或者庞大的JavaScriptE序库的面?
no content being generated
</script>
2、ؓbodyd脚本
前面我们曄说过Q因为对script元素q行集中理有利于网늚可维护性,所以script元素通常添加在|页上的head元素中。然而,在body元素中添加脚本的原因往往是出于性能的考虑?br />
因ؓ览器从同一个域名ƈ发蝲入的资源是有限制的,所以,当把脚本d到head元素中时Q首先蝲入的是脚本Q其ơ才是文档的剩余部分。此外,览器可能会延迟面剩余部分的显C,因ؓ脚本中可能会调用document.writeҎ修改document对象。如果JavaScript文g很庞大,那么|页中的囄以及其他重要的信息将会被延迟昄Q这所带来的问题远比可l护性更加重要?br />
即在script元素中用defer属性也不一定能完全解决该问题,特别是ƈ发资源访问和面昄的限制?br />
在High Performance Web SitesQ中译版《高性能|站指南》一书中Q作者推荐将script元素攑֜文档的最末尾处,q样|页的其他部分就可以优先载入。大多数复杂|站的开发h员更們于这U方法。这U方法带来的负面影响是脚本不Ҏ查找Q网늚可维护性也较差?br />
那么什么才是最x法呢Q我发现大多数网站ƈ不引用庞大的JavaScriptE序库,在保证较好性能的前提下Q将脚本攑֜head元素中,也确保网可l护性的优势。不q,如果的确需要用庞大的JavaScriptE序库,那么可以考虑脚本放在页面的最末尾处?nbsp;
不论采用何种ҎQ请保脚本位置的一致性,要么全部攑֜head元素中,要么全部在body元素的最末尾处?
3、CDATA节
//<![CDATA[
function hello() {
var msg = "Hello, <em>World!</em>";
document.open();
document.write(msg);
document.close();
}
//]]>
</script>
之所以用CDATA节Q是因ؓXHTML处理器在解释标记型语a时会识别出所有的开始标{֒l束标签?br />
在页面文件中通过script元素的src属性引用的JavaScriptQ是XHTML标准所兼容的,q且不要求用CDATA节。如果是嵌入的JavaScript代码Q那么就需要用CDATA节Q特别是包含在body元素中的代码。对于大多数览器而言Q还需要用JavaScript注释W(//Q来隐藏CDATA节Q如CZ1.3所C,否则会出现JavaScript错误?br />
当然Q保持页面整z的最x式是JavaScript代码从页面中dUdQ改成用链接JavaScript文g的方式?br />
在本书的大多数示例中QJavaScript代码是直接嵌入在面里的Q这样可以提高代码的可读性且易于查。然而,Mozilla推荐所有嵌入的JavaScript代码都从面中移去,攑֜独立的JavaScript文g中。用独立的JavaScript文gQ可以避免校验以及文本解释错误等问题Q而不用担心页面是以HTMLq是XHTML的方式进行处理?br />
提示
使用JavaScript文g往往也能提高|页载入的效率,因ؓ览器会在第一ơ蝲入文件的时候进行缓存,引用相同文g时则会从~存中获取?br />
4、null和undefined变量
null变量是已定义的、gؓnull的变量。以下是一个null变量的示例:
var nullString = null;
如果变量已经声明但是q没有初始化Q那么就是undefined变量Q?br />
var undefString;
如果声明了变量ƈ且赋予了初始|那么该变量就不是null或undefinedQ?br />
var sValue = "";
当你使用JavaScriptE序库时Q或者在一些复杂的代码中,某些变量有可能还没有初始化;如果试在表辑ּ中用这L变量Q那么就有可能得到出乎意料的l果Q通常会导致JavaScript错误。如果不定变量的状态,那么可以在条件表辑ּ中测试该变量Q例如:
if (sValue) ... // 如果变量是null或undefinedQ那么结果ؓtrueQ否则是false
在第3章中详l介l条件语句,现在你只需要知道该表达式会判断变量sValue是否已经声明q初始化Q如果已声明q初始化则该表达式的gؓtrueQ否则,该表辑ּ的gؓfalse?
if (undefinedString) // falseQ变量没有赋?nbsp;
if (nullString) // falseQ变量已l声明ƈ且赋|但是所赋的值是null
if (sValue) // trueQ变量已l声明ƈ且赋|包括I字W串Q?nbsp;使用null关键字,可以判断数值是否ؓnullQ?/span>
if (sValue == null)
在JavaScript中,即变量已经声明Q但只要q没有初始化是undefined变量。如果变量已l声明ƈ初始化,那么变量׃是null或undefined。然而,在该CZ中它是一个全局变量Q正如之前的章节所qͼ没有以var关键字声明的变量可能会引起各U各L问题?br />
5、羃减JavaScript代码
I格能够提高代码的可L,但同时也会增加文件的大小。通常情况下,q没什么媄响,因ؓ大多数JavaScript文g都非常小。然而,对于某些大型Ajax应用Q或者复杂的JavaScriptE序库来_太大的JavaScript文g会媄响蝲入JavaScript的速度?br />
如果要尽可能压羃JavaScript文gQ那么可以选用一些免费的工具Q例如Dean Edward的PackerQhttp://dean.edwards.name/packer/Q,它能够在U压~JavaScript代码。或者用Wikipedia?minify"条目Qhttp://en.wikipedia.org/wiki/MinifyQ中所列D的工Pq些工具可以在桌面或者服务器上用?br />
另一cdh用来保护JavaScript代码版权的。这些工具不仅仅会压~JavaScript代码Q甚臌会对代码q行加密Q从而代码难以阅读?
]]>
1、用setAttribute()改变|页中标{onclick属?/strong> *p1
setAttribute讄style和onclickq些属性在IE中是行不通的?
function cancleEvent()
{
document.getElementById('a').setAttribute("onclick",'');
document.getElementById('g').innerHTML="取消事gQ?/span>";
}
function setEvent()
{
document.getElementById('a').setAttribute("onclick",'alert("你好Q?/span>")');//firefox
document.getElementById('a').onclick= function () { alert("This is a test!"); }//IE firefox也有作用,但是使用firebug调试看不C改后的效果,使用上面的方法可以看到?/span>
document.getElementById('Div1').innerHTML="讄事gQ?/span>";
}
</script>
注:
*p1Q用setAttribute()改变|页中标{onclick属?nbsp; http://blog.csdn.net/Cnami/archive/2008/05/27/2486516.aspx
2、IE中通过 setAttributed的属?/strong> *p2
IE下setAttribute讄元素的对象、集合和事g属性都只当成普通属性,起不到原有的作用Q但可以直接q行赋值操作?br />
<!--
function init() {
var obj = document.getElementById("btn");
obj.onclick=changeValue;
obj.style.background="#CC6600";
}
function changeValue() {
document.getElementById("txt").value = "New value!";
}
-->
</script>
注:
*p2Q[求助]通过 setAttribute d的属性在 IE 下不被实玎ͼ http://bbs.blueidea.com/viewthread.php?tid=2290521
]]>
源码爱好?层和布局
效果:
弹出可拖动提C层(模式H口)
Here is the 4 line magic (3lines css, 1line html):
function showSchedule(sid,f){
var url = "../schedule.do?operate=toFindById";
var postStr = "uid=" + encodeURI(sid);
//IE览器关于频J传送数据初始化的问?br />
httpRequest.open("POST", url, true);
httpRequest.onreadystatechange = function(){
if(httpRequest.readyState == 4)
if(httpRequest.status == 200){
var xml = createXml(httpRequest.responseText);
var item = xml.getElementsByTagName("Schedule")[0];
var scheduleId = item.getElementsByTagName("scheduleId")[0].firstChild.nodeValue;
var title = item.getElementsByTagName("title")[0].firstChild.nodeValue;
var schContent = item.getElementsByTagName("schContent")[0].firstChild.nodeValue;
var address = item.getElementsByTagName("address")[0].firstChild.nodeValue;
var ifPrivate = item.getElementsByTagName("ifPrivate")[0].firstChild.nodeValue;
var createTime = item.getElementsByTagName("createTime")[0].firstChild.nodeValue;
var beginTime = item.getElementsByTagName("beginTime")[0].firstChild.nodeValue;
var endTime = item.getElementsByTagName("endTime")[0].firstChild.nodeValue;
var meetingId = item.getElementsByTagName("meetingId")[0].firstChild.nodeValue;
f.scheduleId.value = scheduleId;
f.title.value = title;
f.address.value = address;
f.meetingId.value = meetingId;
f.schContent.value = schContent;
if(ifPrivate == 0)
f.ifPrivate.checked = true;
else
f.ifPrivate.checked = false;
f.beginTime.value = beginTime;
f.endTime.value = endTime;
f.option.value = "doModify";
}
}
httpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
httpRequest.send(postStr);
}
====================================
dom4j-1.6.1.jar
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
Document doc = DocumentHelper.createDocument();
Element node = doc.addElement("Depart");
Element departId = node.addElement("departId");
departId.setText(item.getDepartId().toString());
Element branchId = node.addElement("branchId");
branchId.setText(item.getBranchId().toString());
Element departName = node.addElement("departName");
departName.setText(item.getDepartName());
Element principalUserId = node.addElement("principalUserId");
principalUserId.setText(item.getPrincipalUserId().toString());
Element connectTelNo = node.addElement("connectTelNo");
connectTelNo.setText(item.getConnectTelNo());
Element connectMobileTelNo = node.addElement("connectMobileTelNo");
connectMobileTelNo.setText(item.getConnectMobileTelNo());
Element faxes = node.addElement("faxes");
faxes.setText(item.getFaxes());
PrintWriter out = response.getWriter();
out.println(doc.asXML());
out.flush();
out.close();
================================
request.setContentType("text/xml");
httpRequest.resoponseXML;
===========================
利用函数格式?POST h参数
function addParam(paramObj, paramName, paramValue){
if(paramObj.length > 0)
paramObj += "&";
return paramObj + encodeURIComponent(paramName)
+ "=" + encodeURIComponent(paramValue);
}
=============================================
javascript 里面的遍?br />
for (pop in windowxxxx){
.....
}