??xml version="1.0" encoding="utf-8" standalone="yes"?> HTML 4.0 的新Ҏ(gu)之一是能够 HTML 事g触发览器中的行为,比如当用LL?HTML 元素时启动一D?JavaScript。下面是一个属性列表,可将之插?HTML 标签以定义事件的行ؓ?/p>
除了上面的鼠?事g属性,IE 览器还支持下面的属性: 下面列出?2 U?DOM 事g标准定义的属性?/p>
1、ASP.NET 会话状?/strong> ASP.NET 默认情况下将会话信息存储?ASP.NET 应用E序的内存空间。?zhn)可以使用一个独立的服务存储会话信息以便重新启动 ASP.NET 应用E序后会话信息仍然保留;或将会话信息存储?SQL Server 中以便会话信息可供网l场中的多个 Web 服务器用(重新启动 ASP.NET 应用E序后会话信息也会保留)Q或会话信息存储在自定义数据存储区。有x多信息,请参?a target="_blank">会话状态模?/a>?/p>
除了会话状态外QASP.NET q提供在应用E序中保留数据的一些其他方式。有xU方式的比较Q请参见 ASP.NET 状态管理徏?/a>?p2 通过在应用程序的 Web.config 文g中ؓ sessionState 元素?mode 属性分配一?SessionStateMode 枚D|可以指定要让 ASP.NET 会话状态用的模式。除?InProc ?Off 之外Q其他模式都需要附加参敎ͼ例如在本主题后面讨论的q接字符串倹{通过讉K System.Web.SessionState.HttpSessionState.Mode 属性的|可以查看当前选定的会话状态?p3 3、ASP.NET在不同应用程序之间共享Session *p4 Ҏ(gu)1Q?br />
每个独立的Web应用E序攑ֈl一的解x案中Q实现v来复杂,易用性不高?br />
StateServer 模式Q虽然是独立的状态服务器Q进E)Q但在内存中q些应用E序q是隔离的?/p>
SQLServer 模式Q由于对Session的全部操作都是由存储q程来实现的Q而且存储q程未进行加密,可以通过修改存储q程的内部结构来辑ֈ׃n的目的?br />
asp中Session的工作原理: 原因1Q?nbsp; 原因2Q?nbsp; 原因3Q?nbsp; 原因4Q?nbsp; 原因5Q?nbsp; 原因6Q?nbsp; 解决丢失的经?nbsp; 问:Z么Session在有些机器上偶尔会丢失? 问:Z么当调用Session.Abandon时ƈ没有Ȁ发Session_EndҎ(gu)Q?nbsp; 问:Z么当我在InProc模式下用Session会经怸失? 问:Z么在Session_End中不能用Response.Redirect和Server.TransferҎ(gu)跌{面Q?nbsp; 问:在Session_End中是否可以获得HttpContext对象Q?nbsp; 问:在Web Service中该如何使用SessionQ?nbsp; 问:Session在global.asax中的那些事g中有效? 问:Sessionqx时意味着什么? 问:在global.asax中的事g处理函数中SessionZ么无效? 问:当页面出现错误后我的Session是否被保存Q我需要在Session_End中处理一些清理工作,但是p|了,Z么? 问:在Session_End是我是否可以获得有效的HttpSessionState和HttpContext对象Q?nbsp; 问:在SQLServer模式下用SessionQؓ什么我的Session不过期? 问:当我讄EnableSessionState?#8220;ReadOnly”后,但是我在InProc模式下依然可以修改Session的|q是Z么? 问:Z么在切换成SQLServer模式后我的请求被挂v了? re: 因為Session在還沒裝物g之前, ID都不是固定的. 如果(zhn)c予Session內容, ex: Session["xxx"]=123 , (zhn)會發現ID會固定. *p8
]]>
2、节点属性和Ҏ(gu)
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、节点属性和Ҏ(gu)
对于文档树上的每个节炚w拥有 DOM(Core)?Node对象中定义的基本属性和基本Ҏ(gu)集。Node对象的属性主要包括:
nodeNameQ对象名Uͼ?head元素的名U就?HEADQ?br />
nodeValueQ如果不是一个元素,则返回对象|
nodeTypeQ用数字表示的节点类型;
parentNodeQ当前节点的父节点;
childNodesQ由其子节点l成?NodeListQ前提是存在子节点;
firstChildQ由子节点组成的 NodeList中的W一个节点;
lastChildQ由子节点组成的 NodeList中的最后一个节点;
previousSiblingQ如果当前节Ҏ(gu)位于 NodeList中的子节点,那么它表C的是该列表中的前一个节点;
nextSiblingQ如果当前节Ҏ(gu)位于 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Ҏ(gu)来操?Ajax调用q回?XML格式应答?br />
保在服务器端应用程序在q回数据时设|了正确的数?MINEcd text/xmlQ然后通过 XMLHttpRequest对象?responseXML容器来获取应{信息?br />
JSON
JSON是一U?#8220;轻量U的数据交换格式”。和一l由逗号分开的字W串Q以及处理复杂(成本高昂Q的 XML相比QJSON是一U很Ҏ(gu)服务器端数据结构{?JavaScript对象的数据格式?br />
JSON实际上就是?JavaScript语法定义的对象,一个对象的语法包括一对大括号以及其中的成员:
object{ } or object { string : value ...}
对于数组而言Q他是由一l元素加上一Ҏ(gu)括号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那么它?yu)将被隐藏v来。iframe会把它嵌入到的页面视q父元素,q也是它和更高层面q行通信的方法。通常Q你可以使用 document?getElementByIdҎ(gu)来访问它Q也可以使用 target属性蝲入其内容?br />
c. 定时器的创徏和控?br />
有两cd时器Q一cL一ơ性的Q另一cL周期性用的。两U定时器都能取消Q一ơ性定时器Ҏ(gu)只会被调用一ơ?br />
要想创徏一个不重复触发的定时器Q可以?setTimeoutҎ(gu)Q?br />
var tmOut = setTimeout("func", 5000, "param1", param2,,,,, paramn);
如果x除这个定时器Q可以?clearTimeoutҎ(gu)Q?br />
clearTimeout(tmOut);
如果你想周期性地使用q个定时器,那么应调?setIntervalҎ(gu)Q?br />
var tmOut = setInterval("functionName", 5000);
同样Q如果想暂停或取消这个周期性定时器Q可以?clearIntervalҎ(gu)。如果你惛_C个周期性定时器Q但又想在参C指定一个函数文字量Q那么你可以在每ơ定时器q期时再?setTimeout函数重新讄q个定时器?br />
注:
?IE览器中QsetInterval?setTimeoutҎ(gu)是不支持在最后添加函数调用所需参数的?br />
d. 用来控制览器其他元?/strong>
history对象
history对象负责l护览器中面载入操作的历史记录。同P其方法和属性能够完成通过览器的后退和前q按钮所能实现的D操作?br />
screen对象
screen对象所包含的信息是屏幕昄有相关的Q包括其宽度、高度,以及颜色或像素浓淡。虽然他们不是很常用Q但他们对于那些需要修Ҏ(gu)览器H口大小、创建需要特定调色板的带色彩对象{功能而言是不错的选择?br />
navigator对象
navigator对象中提供的是和览器或其他讉K该页面的用户代理相关的信息。通过它可以检查操作系l、浏览器或浏览器族、安全策略、语a以及 cookie是否启用?br />
document对象
1.链接和锚
document对象?links集合是由面中所有超链接l成的,它的讉KҎ(gu)和数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Ҏ(gu)会带来很大的破坏?
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Ҏ(gu)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修Ҏ(gu)档的操作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属性的Ҏ(gu)?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对象只允许指定一个事件句柄。如果你想针Ҏ(gu)一特定对象的某个事件指定多个函敎ͼ则需要在事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些览器差异的Ҏ(gu)之一是检查传入函数的 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Ҏ(gu)。你可以先检?stopPropagationҎ(gu)是否存在Q然后根据其l果定使用哪种Ҏ(gu)Q?
if (evnt.stopPropagation) evnt.stopPropagation;
else evnt.cancelBubble = true;
}
//注:IE 7中调试出错,提示信息 "stopPropagation为空或不是对??/span>
5、事件句柄和 this
this关键字表C的是当前调用的函数或者方法的所有者。对于一个全局变量而言Q它表示的就?window对象。对于一个对象的Ҏ(gu)而言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否则将把这个事件监听器Ҏ(gu)事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Ҏ(gu)Q?br />
function cascadeDown(evnt) {
...
evnt.stopPropagation();
}
如果要彻底删除一个事件监听器Q可以?removeEventListenerҎ(gu)Q?br />
document.removeEventListener("click", cascadeDown, true);
?IE中,?addEventListener?removeEventListenerҎ(gu)怼的是 attachEvent?detachEventQ对应语法是Q?br />
object.attachEvent("eventhandler", function);
W一个参数是事g句柄Q第二个是其函数。detachEvent语法cM?br />
跨浏览器解决Ҏ(gu)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Ҏ(gu)清理Q释攄应的内存
?nbsp;addEventListenerҎ(gu)使用的内存是无需清理的?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Ҏ(gu)?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Ҏ(gu)。如果支持,则调用它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Ҏ(gu)
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义了大量操作字符串的Ҏ(gu)Q例如从字符串中提取字符或子Ԍ或者检索字W或子串?br />
需要注意的是,JavaScript 的字W串是不可变的(immutableQ,String cd义的Ҏ(gu)都不能改变字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Ҏ(gu)
testҎ(gu)判断以参数传入的字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Ҏ(gu)
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Ҏ(gu)返回一个数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的Ҏ(gu)是ؓ每个数组元素创徏一个新的数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以作ؓҎ(gu)的返回倹{?br />
在大多数情况下,数组元素的顺序ƈ不重要,不过也有些需要维护数l元素顺序的场景Q例如队列。数l维护队列的Ҏ(gu)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 />");
}
Ҏ(gu)逗号分隔的字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创建函数的Ҏ(gu)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Ҏ(gu)修改document对象。如果JavaScript文g很庞大,那么|页中的囄以及其他重要的信息将会被延迟昄Q这所带来的问题远比可l护性更加重要?br />
即在script元素中用defer属性也不一定能完全解决该问题,特别是ƈ发资源访问和面昄的限制?br />
在High Performance Web SitesQ中译版《高性能|站指南》一书中Q作者推荐将script元素攑֜文档的最末尾处,q样|页的其他部分就可以优先载入。大多数复杂|站的开发h员更們于这U方法。这U方法带来的负面影响是脚本不Ҏ(gu)查找Q网늚可维护性也较差?br />
那么什么才是最x法呢Q我发现大多数网站ƈ不引用庞大的JavaScriptE序库,在保证较好性能的前提下Q将脚本攑֜head元素中,也确保网可l护性的优势。不q,如果的确需要用庞大的JavaScriptE序库,那么可以考虑脚本放在页面的最末尾处?nbsp;
不论采用何种Ҏ(gu)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从而代码难以阅读?
]]>
Ҏ(gu)一Q用Request.PathInfo 参数而不是查询字W串
Ҏ(gu)二:使用HttpModule实现URL重写
Ҏ(gu)三:在IIS7中用HttpModule 实现无扩展名的URL重写
Ҏ(gu)四:在IIS5和IIS6中?ISAPIRewrite 来实现无扩展名的URL重写
在URL重写里处理ASP.NET PostBack
正确地处理CSS和图像引?/a>
例程的URL重写场景
http://www.store.com/products.aspx?category=books
http://www.store.com/products.aspx?category=DVDs
http://www.store.com/products.aspx?category=CDs
Ҏ(gu)一Q用Request.PathInfo 参数而不是查询字W串
http://www.store.com/products.aspx/Books
http://www.store.com/products.aspx/DVDs
http://www.store.com/products.aspx/CDs
Ҏ(gu)二:使用HttpModule实现URL重写
http://www.store.com/products/Books.aspx
http://www.store.com/products/DVDs.aspx
http://www.store.com/products/CDs.aspx
Ҏ(gu)三:在IIS7中用HttpModule 实现无扩展名的URL重写
http://www.store.com/products/Books
http://www.store.com/products/DVDs
http://www.store.com/products/CDs
IIS 7.0使得处理q类情ŞҎ(gu)之极。你现在可以?IIS h道的Q何地Ҏ(gu)行一个HttpModuleQ这意味着你可以用上面的URLRewriter 模块来处理和重写无扩展名的URL(甚至是带?.aspQ?phpQ或 .jsp 扩展名的URL)。下面示范了你在IIS7中该如何配置Q?
<configuration>
<configSections>
<section name="rewriter"
requirePermission="false"
type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
</configSections>
<system.web>
<httpModules>
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" />
</httpModules>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule" />
</modules>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
<rewriter>
<rewrite url="~/products/(.+)" to="~/products.aspx?category=$1" />
</rewriter>
</configuration>
Ҏ(gu)四:在IIS5和IIS6中?ISAPIRewrite 来实现无扩展名的URL重写
在URL重写里处理ASP.NET PostBack
当用URL重写Ӟ会出现这L问题Q?lt;form> 控g昄的URL不是原先h的URL(譬如Q?products/books)Q而是重写q后的URL(譬如Q?products.aspx?category=books)。这意味着Q当你做一个postback到服务器ӞURL不再是你原先q净利落的那个了? 在ASP.NET 2.0中,有个比较q净的诀H你可以用来重写<form>控g的action属性。具体地来说Q你可利用新的ASP.NET 2.0控g适配器扩展架构来定制控g的输出,用你提供的值来覆盖action属性的倹{这不要求在你的.aspx面里做M~码改动Q而只要在你的/app_browsers文g多wd一?browser文gQ注册用一个控仉配cd可输出新的action属性?br />
正确地处理CSS和图像引?br />
不少人在W一ơ用URL重写Ӟ有时会遇上一个疑难杂症,是他们发现他们的图像和CSS样式表引用有时会停止工作。这是因Z们在HTML|页里有对这些文件的相对引用Q当你开始在应用里重写URLӞ你需要意识到览器经怼在不同的逻辑层次l构层上(logical hierarchy levels)h文gQ而不是实际存储在服务器上的东ѝ?
譬如Q如果我们上面的/products.aspx|页?aspx |页里的logo.jpg有一个相对引用,但是通过 /products/books.aspxq个URL来请求的Q那么浏览器在显C网|Q将会发Z个对/products/logo.jpg的请求,而不是对/logo.jpg的请求。要正确地引用这个文Ӟ认你用根目录限定了(root qualify)CSS和图像引?“/style.css”Q而不?“style.css”)。对于ASP.NET控gQ你也可以?#8220;~”句法从你应用的根目录来引用文?譬如Q?lt;asp:image imageurl="~/images/logo.jpg" runat="server"/>) ?
附:/Files/kiant/2010.05/UrlRewrite_HttpModule1.FormRewriter.cs.zip 附加CS版的文g
]]>
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
]]>
3、ASP.NET在不同应用程序之间共享Session
4、Session无故丢失
5、客L使用Cookieless的方式存储Session信息
6、Session.SessionID 固定
会话状态可在以下情况下使用Q存储特定于单独会话的短期信息,q且需要较高的安全性。不要在会话状态中存储大量的信息。需要注意,ؓ应用E序中每一会话的生存期创徏q维护会话状态对象。在支持许多用户的应用程序中Q这可能会占用大量服务器资源q媄响可~放性?p1
?
*p1QASP.NET 状态管理徏?nbsp;http://msdn.microsoft.com/zh-cn/library/z1hkazw7(v=VS.80).aspx
*p2QASP.NET 会话状?nbsp;http://msdn.microsoft.com/zh-cn/library/87069683(v=VS.80).aspx
2、会话状态模?br />
ASP.NET 会话状态支持若q用于会话数据的存储选项。每个选项都由 SessionStateMode 枚D中的一个值标识。下面的列表描述了可用的会话状态模式:
注:
*p3Q会话状态模?nbsp;http://msdn.microsoft.com/zh-cn/library/ms178586(v=VS.80).aspx
多个单独的应用程序,如何这些模块集中n份验证与授权q程
Ҏ(gu)2Q利用Session会话׃n
InProc模式QSession被存储在IISq程中,每个虚拟目录是隔ȝQ所以无法共享Session?/p>
ASPState数据库ASPStateTempApplications表中存储的是应用E序信息Q每个应用程序在启动的时候在q里会注册一条记录,包括应用E序的IDQ通过哈希法生成的)和应用程序名U。有多少个应用程序,在这个表里就对应多少条记录。那我们现在要做的是把这些记录变成一条记录,也就是要ƺ骗FrameworkQ让它认些不同的应用E序是同一个应用程序?br />
TempGetAppID存储q程Q这个存储过E是用于通过传递应用程序名U来得到应用E序ID信息的。每个应用程序在调用q个q程Ӟq个q程会去AspStateTempApplications中检查是否有相应的记录,如果没有Q就插入记录Q然后返回相应的ID?br />
@appName tAppName,
@appId int OUTPUT
AS
SET @appName = LOWER(@appName)
--变量值固定,使所有应用程序通用Z?/span>
SET @appName = '/lm/w3svc/650056020/root/personnel/share'
SET @appId = NULL
SELECT @appId = AppId
FROM [tempdb].dbo.ASPStateTempApplications
WHERE AppName = @appName
注:
*p4QASP.NET在不同应用程序之间共享Session http://www.3qsoft.com/Article.aspx?ID=173
4、Session无故丢失 *p5
mode="InProc"
==
默认的配|方式很Ҏ(gu)丢失Session 请参?nbsp;
asp的Session是具有进E依赖性的。ASP Session状态存于IIS的进E中Q也是inetinfo.exeq个E序。所以当inetinfo.exeq程崩溃Ӟq些信息也就丢失。另外,重v或者关闭IIS服务都会造成信息的丢失?nbsp;
bin目录中的文g被改写,asp.net有一U机ӞZ保证dll重新~译之后Q系l正常运行,它会重新启动一ơ网站进E,q时׃DSession丢失Q所以如果有access数据库位于bin目录Q或者有其他文g被系l改写,׃DSession丢失
文g多w项中,如果没有打开“在单独的q程中打开文g夹窗?#8221;Q一旦新Z个窗口,pȝ可能认ؓ是新的Session会话Q而无法访问原来的SessionQ所以需要打开该选项Q否则会DSession丢失
g大部分的Session丢失是客L引v的,所以要从客L下手Q看看cookie有没有打开
Session的时间设|是不是有问题,会不会因旉成丢失
IE中的cookie数量限制Q每个域20个cookieQ可能导致session丢失
使用web garden模式Q且使用了InProc mode作ؓ保存session的方?nbsp;
1. 判断是不是原?造成的,可以在每ơ刷新页面的时候,跟踪bin中某个文件的修改旉
2. 做Sessiond日志Q每ơ读写Session都要记录下来Qƈ且要记录SessionID、Session倹{所在页面、当前函数、函C的第几次Session操作Q这h丢失的原因会方便很多
3. 如果允许的话Q徏议用state server或sql server保存sessionQ这样不Ҏ(gu)丢失
4. 在global.asa中加入代码记录Session的创建时间和l束旉Q超旉成的Session丢失是可以在SessionEnd中记录下来的?nbsp;
5. 如果有些代码中用客L脚本Q如javascriptl护Session状态,p试调试脚本Q是不是因ؓ脚本错误引vSession丢失
{:可能和机器的环境有关p,比如Q防火墙或者杀毒Y件等Q尝试关闭防火墙?nbsp;
{:首先Session_EndҎ(gu)只支持InProcQ进E内的)cd的Session。其ơ要Ȁ发Session_EndҎ(gu)Q必d在SessionQ即pȝ中已l用Session了)Qƈ且至要完成一ơ请求(在这ơ请求中会调用该Ҏ(gu)Q?nbsp;
{:该问题通常是由于应用程序被回收D的,因ؓ当用进E内SessionӞSession是保存在aspnet_wpq程中,当该q程被回收Session自然也就没有了,定该进E是否被回收可以通过查看pȝ的事件查看器获得信息?nbsp;
具体信息请参考:
Session variables are lost intermittently in ASP.NET applications
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q316148
?.0的时候也有一个bug会导致工作进E被回收q启,该bug已经?.1和sp2中修复?nbsp;
关于该bug的详l信息请参考:
ASP.NET Worker Process (Aspnet_wp.exe) Is Recycled Unexpectedly.
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q321792
问:什么类型的对象可以保存在Session里?
{:q依赖用的Session的模式,当用的是进E内QInProcQ的Session那么可以L的保存Q何对象。如果你使用了非InProc的模式,则只能保存可以序列化和反序列化的对象Q如果此时保存的对象不支持序列化Q则不能保存到这U模式(非InProcQ的Session里?nbsp;
{:Session_End是一个在服务器内部激发的事g处理函数。它是基于一个服务器内部的计时器的,在激发该事g时服务器上ƈ没有相关的HttpRequest对象Q因此此时ƈ不能使用Response.Redirect和Server.TransferҎ(gu)?nbsp;
{:不行Q因个事件ƈ没有和Q何的hQRequestQ相兌Q没有基于请求的上下文?nbsp;
{:Z在Web Service中用SessionQ需要在Web Service的调用方做一些额外的工作Q必M存和存储调用Web Service时用的Cookie。详l信息请参考MSDN文档的HttpWebClientProtocol.CookieContainer属性。然而,如果你用代理服务器讉KWeb Service׃框架的限Ӟ两者不能共享Session?nbsp;
问:当我使用webfarmӞ当我重定向到其他的Web服务器时SessionZ么会丢失Q?nbsp;
{:详细信息请参考:
PRB: Session State Is Lost in Web Farm If You Use SqlServer or StateServer Session Mode
http://support.microsoft.com/default.aspx?scid=kb;en-us;325056
{:Session只有在AcquireRequestState事g之后有效Q该事g之后的事仉可以使用Session?nbsp;
问:Z可以序讉KSession的状态|Session是否提供了锁定机Ӟ
{:Session实现了Reader/Writer的锁机制Q?nbsp;
当页面对Sessionh可写功能Q即面?<%@ Page EnableSessionState="True" %>标记Q,此时直到h完成该页面的Session持有一个写锁定?nbsp;
当页面对Sessionh只读功能Q即面?<%@ Page EnableSessionState="ReadOnly" %>标记Q,此时知道h完成该页面的Session持有一个读锁定?nbsp;
读锁定将d一个写锁定Q读锁定不会d读锁定;写锁定将d所有的d锁定。这是Z么两个框架中的同一个页面都d同一个SessionӞ其中一个要{待另一个(E快的那个)完成后,才开始写?nbsp;
{:Sessionqx时意味着只要你的面讉KQ用)了SessionQ超时时间将被刷斎ͼ可以理解为重新计ӞQ即从该面h开始,重新计超时时间。但是,该页面不能禁用Session。它会自动的讉K当前面的SessionQ刷新超时时间?nbsp;
{:依赖于在哪个事g处理函数中用SessionQSession在AcquireRequestState事g之后才有效,该事件之后的所有事件处理函数都可以使用SessionQ之前的则不能?nbsp;
问:当我使用InProc模式保存SessionӞ此时的Session是保存在哪里Q?nbsp;
{:不同的IIS的处理方式不同,
当用的是IIS5的时候Session是保存在aspnet_wp.exe的进E空间里的?nbsp;
当用的是IIS6Ӟ默认情况下所有的应用E序׃n应用E序池,Session保存在w3wp.exe的进E空间中?nbsp;
{:Session_End只有在Sessionq行在InProc模式下才会被执行。Session_End使用的帐hq行aspnet_wp工作q程的帐Pq个可以在machine.config中设|)。因此,如果在Session_EndҎ(gu)里,使用集成安全性链接到SQLQ它?yu)用aspnet_wpq程的帐h开链接Q此时成功与否则依赖于你的SQL的安全性设|?nbsp;
{:你可以在q个Ҏ(gu)中获得HttpSessionState对象Q可以直接用Session来访问即可。但是不能获得HttpContext对象Q因事gq没有和Mh相关联,因此不存在上下文对象?nbsp;
{:在SqlServer模式下,Session的过期是通过SQL Agent的注册工作完成的Q请查你的SQL Agent是否q行Q?nbsp;
{:即EnableSessionState标示为ReadOnlyQ但是在InProc模式下用户依然可以编辑Session。唯一不同的是Q在hq程中Session不会被锁住?nbsp;
{:查在Session里面是否都保存的是可以保存在SQLServer模式下的对象Q即q些对象必须支持序列化?nbsp;
问:当Session讄成cookieless后会有什么媄响?
{:当把cookieless讄成trueӞ主要会有下面的约束:
1、在面中不能用绝寚w?nbsp;
2、在应用E序中在除了Http和Https之间的切换时需要完成一些其他的步骤?nbsp;
如果发送一个链接给其他人,此时的URL里面包含Session ID的信息,所以两个h公用一个Session?nbsp;
注:
*p5QSession丢失 http://topic.csdn.net/u/20081208/14/c154543c-8e86-406b-82a2-d3cc6f736b0d.html
5、客L使用Cookieless的方式存储Session信息
sessionState中的cookieless="false"改ؓQcookieless="true"Q这P客户端的Session信息׃再用Cookie存储了,而是其通过URL存储。关闭当前的IEQ打开一个新IEQ重新访问刚才的Web应用E序Q浏览器地址׃变ؓ http://localhost/MyTestApplication/(ulqsek45heu3ic2a5zgdl245)/default.aspx中黑体标出的是客户端的Session ID。注意,q段信息是由IIS自动加上的,不会影响以前正常的连接?*p6
问:当Session讄成cookieless后会有什么媄响?
{:当把cookieless讄成trueӞ主要会有下面的约束:
1、在面中不能用绝寚w?nbsp;
2、在应用E序中在除了Http和Https之间的切换时需要完成一些其他的步骤?nbsp;
如果发送一个链接给其他人,此时的URL里面包含Session ID的信息,所以两个h公用一个Session?*p7
注:
*p6Q[ASP.NET] Session 详解 http://www.blueidea.com/tech/program/2004/1856.asp
*p7QSession丢失 http://topic.csdn.net/u/20081208/14/c154543c-8e86-406b-82a2-d3cc6f736b0d.html
注:
*p8Q[ASP.Net]Session.IsNewSession與Session.SessionID http://www.dotblogs.com.tw/yilinliu/archive/2009/04/24/8163.aspx
]]>
引用自:
asp.net获取|站路径
http://hi.baidu.com/zhangfengbang/blog/item/5f99d74b0ce661f883025cbc.html
HttpRequest 成员
http://msdn.microsoft.com/zh-cn/library/system.web.httprequest_members(v=VS.80).aspx
ASP.NET获取|站根目录的url的函敎ͼ很简?br />
http://www.xueit.com/html/2009-03/21_932_00.html
M于Request/HttpContext.Current{相关的Ҏ(gu), 都只能在有请求上下文或者页面时使用. 卛_无请求上下文?HttpContext.Current为null. 而上面提到的Ҏ(gu)一直可?
对于全局Cache对象的访问亦?
数据库中Imagecd的数据的存取(For C#/ASP.NET)
http://www.cnblogs.com/billsfeng/archive/2008/07/31/1257579.html
SQL Server存储囑փ数据的策略与Ҏ(gu)
http://www.yesky.com/20030113/1648152.shtml
How To Read and Write BLOB Data by Using ADO.NET with Visual C# .NET
http://support.microsoft.com/default.aspx?scid=kb;EN-US;309158
关于无限分类的设计网上讨论有很多Q说白了是在数据库中设计树的问题,在这里仅Ҏ(gu)所知的做些记录与对比?br />
假设表结构ؓ下图Qƈ且ؓ某表的外键引用。要求:
1、实现无限层ơ?br />
2、能扑ֈ节点的\径?br />
3、能扑ֈ所有子孙节炚w合(获取树)?br />
引用Q?在数据库中存储层ơ数据实现无限分层"
Ҏ(gu)1Q邻接列表模?The Adjacency List Model)/递归Ҏ(gu)
http://www.52web.com/52article/?view-250-page-2.html
引用Q?在数据库中存储层ơ数据实现无限分层"
优点Q结构简单明了,对于节点的维护ƈ不需要额外的工作?br /> ~点Q实现要??需要进行大量的递归操作Q每一ơ数据库查询都需要花费一Ҏ(gu)间?br />
Ҏ(gu)2Q递归Ҏ(gu)改进
Ҏ(gu)?的扩展,新增 path字段以存储节点\径,arrayChild字段存储其下所有节炏V?/p>
优点Q实现要??只需要一ơ查询?br /> ~点Q当节点发生改变旉要维护对应的字段Q且 path?arrayChild以拼串Ş式存储于文本字段Q容易限制节炚w度,q且对于查询效率有媄响?/p>
Ҏ(gu)3Q改q前序遍历树
http://www.52web.com/52article/?view-250-page-2.html
如果作ؓ主键标识的节点编号存在外部引用,q需要定义一个链表编?linkId来确保其主键标识固定Qƈ重新定义光表左双围?br />
优点Q实现要??只需要一ơ查询,但比Ҏ(gu)2l护h更见方便Q减大量的gQ,而且因ؓ左右DC的是链表的范围Q所以查询效率更高?br /> ~点Q算法未l说明前不如Ҏ(gu)1?直观?nbsp;
<%# Bind("Subject") %> //l定字段
<%# Container.DataItemIndex + 1%> //实现自动~号
<%# DataBinder.Eval(Container.DataItem, "[n]") %>
通常使用的方?br />
<%# DataBinder.Eval(Container.DataItem, "ColumnName") %>
<%# DataBinder.Eval(Container.DataItem, "ColumnName", null) %>
<%# DataBinder.Eval(Container, "DataItem.ColumnName", null) %>
其他用法
<%# ((DataRowView)Container.DataItem)["ColumnName"] %>
<%# ((DataRowView)Container.DataItem).Row["ColumnName"] %>
<%# ((DataRowView)Container.DataItem)["adtitle"] %>
<%# ((DataRowView)Container.DataItem)[n] %>
<%# ((DbDataRecord)Container.DataItem)[0] %>
<%# (((自定义类?Container.DataItem)).属?ToString() %>//如果属性ؓ字符串类型就不用ToString()?/p>
DataBinder.Eval用法范例
<%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:c}") %>
格式化字W串参数是可选的。如果忽略参敎ͼDataBinder.Eval q回对象cd的|
//昄二位数
<%# DataBinder.Eval(Container.DataItem, "UnitPrice", "${0:F2}") %>
//{0:G}代表昄True或False
<ItemTemplate>
<asp:Image Width="12" Height="12" Border="0" runat="server"
AlternateText='<%# DataBinder.Eval(Container.DataItem, "Discontinued", "{0:G}") %>'
ImageUrl='<%# DataBinder.Eval(Container.DataItem, "Discontinued", "~/images/{0:G}.gif") %>' />
</ItemTemplate>
//转换cd
((string)DataBinder.Eval(Container, "DataItem.P_SHIP_TIME_SBM8")).Substring(4,4)
{0:d} 日期只显C年月日
{0:yyyy-mm-dd} 按格式显C年月日
{0:c} 货币样式
<%#Container.DataItem("price","{0:K?,##0.00}")%>
<%# DataBinder.Eval(Container.DataItem,"Company_Ureg_Date","{0:yyyy-M-d}")%>
Specifier Type Format Output (Passed Double 1.42) Output (Passed Int -12400)
c Currency {0:c} $1.42 -$12,400
d Decimal {0:d} System.FormatException -12400
e Scientific {0:e} 1.420000e+000 -1.240000e+004
f Fixed point {0:f} 1.42 -12400.00
g General {0:g} 1.42 -12400
n Number with commas for thousands {0:n} 1.42 -12,400
r Round trippable {0:r} 1.42 System.FormatException
x Hexadecimal {0:x4} System.FormatException cf90
{0:d} 日期只显C年月日
{0:yyyy-mm-dd} 按格式显C年月日
样式取决?Web.config 中的讄
{0:c} ?{0:K?,000.00} 货币样式 标准英国货币样式
<system.web>
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US" uiCulture="en-US" />
</system.web>
昄?K?,000.10
{0:c} ?string.Format("{0:C}", price); 中国货币样式
<system.web>
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="zh-cn" uiCulture="zh-cn" />
</system.web>
昄?K?,000.10
{0:c} ?string.Format("{0:C}", price); 国货币样式
<system.web>
<globalization requestEncoding="utf-8" responseEncoding="utf-8" />
</system.web>
昄?$3,000.10
DataBinder.Eval(Container.DataItem,"Name")和Container.DataItem("Name")有什么区别?
DataBinder是System.Web里面的一个静态类Q它提供?span style="color: #0000ff">EvalҎ(gu)用于化数据绑定表辑ּ的编?/span>Q但是它使用的方式是通过Reflection{开销比较大的Ҏ(gu)来达到易用性,因此其性能q不是最好的。而Container则根本不是Q何一个静态的对象或方法,它是ASP.NET面~译器在数据l定事g处理E序内部声明的局部变量,其类型是可以q行数据l定的控件的数据容器cdQ如在Repeater内部的数据绑定容器叫RepeaterItemQ,在这些容器类中基本都有DataItem属性,因此你可以写Container.DataItemQ这个属性返回的是你正在被绑定的数据源中的那个数据项。如果你的数据源是DataTableQ则q个数据的cd实际是DataRowView?br />
1、Response.Redirect():
Response.RedirectҎ(gu)D览器链接到一个指定的URL。当Response.Redirect()Ҏ(gu)被调用时Q它会创Z个应{,应答头中指出了状态代?02Q表C目标已l改变)以及新的目标URL。浏览器从服务器收到该应{,利用应答头中的信息发Z个对新URL的请求?br />
q就是说Q用Response.RedirectҎ(gu)旉定向操作发生在客LQ?span style="color: #0000ff">d涉及Cơ与服务器的通信Q两个来回)Q?/span>W一ơ是对原始页面的hQ得C?02应答Q第二次是请?02应答中声明的新页面,得到重定向之后的面?br />
2、Server.Transfer
Server.transfer是IIS 5.0新增加的一个功能。它解决了Response.Redirect的两个重要的~陷Q?br />
1Q在Response.Redirect中,我们得不CQ何第一늚输出
2QResponse.Redirect会丢失request中的所有属性,当然我们可以通过一些其他的办法Q比如session来搞定,可是Q有些页的参数是在request中传q来的,q样的话Q就不行?br />
3) Response.Redirect需要client端再发v一个请求?br />
Server.transfer很好地解决了这些问题。它是从server端直接向下一发赯求,不需要client再次发送请求。如果你的网非怾赖response.redirectQ这个小的改变可以提高近25%的效率(Ҏ(gu)微Y文档Q?/p>
Server.TransferҎ(gu)把执行流E从当前的ASPX文g转到同一服务器上的另一个ASPX面。调用Server.TransferӞ当前的ASPX面l止执行Q执行流E{入另一个ASPX面Q但新的ASPX面仍用前一ASPX面创徏的应{流?br />
Server.Transfer()有一?span style="color: #ff0000">不是Q?/span>当用户在a.aspx中提交了一个表?然后用Server.Transfer()q入 b.aspxQ这时如果用户刷C下页面,览器便会问用户是否“重试”发送表单,如果用户点击“?#8221;Q那么,表单中的数据被重新发送到服务器。如发送表单的作用是Z向数据库中插入一条记录,l果g希望发生的事——同一表单被多ơ加入到数据库中?/p>
4.
如果用Server.TransferҎ(gu)实现面之间的导航,览器中的URL不会改变Q因为重定向完全在服务器端进行,览器根本不知道服务器已l执行了一ơ页面变换?br />
默认情况下,Server.TransferҎ(gu)不会把表单数据或查询字符串从一个页面传递到另一个页面,但只要把该方法的W二个参数设|成TrueQ就可以保留W一个页面的表单数据和查询字W串?br />
同时Q用Server.Transfer时应注意一?/span>Q目标页面将使用原始面创徏的应{流Q这DASP.NET的机器验证检查(Machine Authentication CheckQMACQ认为新面的ViewState已被改。因此,如果要保留原始页面的表单数据和查询字W串集合Q必L目标面Page指o?EnableViewStateMac属性设|成False?/p>
3、Server.Execute
Server.ExecuteҎ(gu)允许当前的ASPX面执行一个同一Web服务器上的指定ASPX面Q当指定的ASPX面执行完毕Q控制流E重新返回原面发出Server.Execute调用的位|。这U页面导航方式类g针对ASPX面的一ơ函数调用,被调用的面能够讉K发出调用面的表单数据和查询字符串集?/span>Q所以要把被调用面Page指o的EnableViewStateMac属性设|成False?br />
Server.Execute("another.aspx")和Server.Transfer("another.aspx")区别:
Execute是从当前面转移到指定页?q将执行q回到当前页?nbsp;
Transfer是将执行完全转移到指定页?
ȝQ?br />
在网l状态较好的情况?Redirect(url)Ҏ(gu)效率最?! 可重定向到同一台或非同一台服务器上的aspx或非aspxQhtmlQ资?nbsp; *重定?br />
Server.TransferҎ(gu)和Server.ExecuteҎ(gu)最灉|!! 但只能{到同一Application目录下,也有可能D不期望的l果发生 *转发
Server.ExecuteҎ(gu)占用资源最? *包含
ps. *ؓW记
]]>
Here is the 4 line magic (3lines css, 1line html):