??xml version="1.0" encoding="utf-8" standalone="yes"?> 本程序ؓ无限U树形菜单提供一U方案。程序基?JavaScript/XHTML/CSS 标准实现Q适应q泛的服务器/览器环境?/strong> 本程序支持丰富的功能/表现定制Q拥有表现和数据分离Q单面可以应用多个无限U菜单树Q多?U展开模式Q风格样式定义结构清晰、灵zd_{等Ҏ,演示可以见一斑?/strong> 本程序在实现 1000 节点以上菜单树时效率下降明显Q请适当应用?br />
下蝲地址Q?a title="MenuTree.rar" href="/Files/yifeng/Repository/MenuTree.rar">MenuTree.rar
]]>
单的_正则表达式是一U可以用于模式匹配和替换的强有力的工兗其作用如下Q?
试字符串的某个模式。例如,可以对一个输入字W串q行试Q看在该字符串是否存在一个电话号码模式或一个信用卡L模式。这UCؓ数据有效性验证?
替换文本。可以在文档中用一个正则表辑ּ来标识特定文字,然后可以全部其删除Q或者替换ؓ别的文字?
Ҏ模式匚w从字W串中提取一个子字符丌Ӏ可以用来在文本或输入字D中查找特定文字?
基本语法
在对正则表达式的功能和作用有了初步的了解之后Q我们就来具体看一下正则表辑ּ的语法格式?
正则表达式的形式一般如下:
/love/ 其中位于“/”定界W之间的部分是要在目标对象中q行匚w的模式。用户只要把希望查找匚w对象的模式内Ҏ?#8220;/”定界W之间即可。ؓ了能够用户更加灉|的定制模式内容,正则表达式提供了专门?#8220;元字W?#8221;。所谓元字符是指那些在正则表达式中hҎ意义的专用字W,可以用来规定其前导字W(即位于元字符前面的字W)在目标对象中的出现模式?
较ؓ常用的元字符包括Q?“+”Q?“*”Q以?“?”?/p>
“+”元字W规定其前导字符必须在目标对象中q箋出现一ơ或多次?br /> “*”元字W规定其前导字符必须在目标对象中出现零次或连l多ơ?br /> “?”元字W规定其前导对象必须在目标对象中q箋出现零次或一ơ?/p>
下面Q就让我们来看一下正则表辑ּ元字W的具体应用?
/fo+/ 因ؓ上述正则表达式中包含“+”元字W,表示可以与目标对象中?“fool”, “fo”, 或?“football”{在字母f后面q箋出现一个或多个字母o的字W串相匹配?
/eg*/ 因ؓ上述正则表达式中包含“*”元字W,表示可以与目标对象中?“easy”, “ego”, 或?“egg”{在字母e后面q箋出现零个或多个字母g的字W串相匹配?
/Wil?/ 因ؓ上述正则表达式中包含“Q?#8221;元字W,表示可以与目标对象中?“Win”, 或?#8220;Wilson”,{在字母i后面q箋出现零个或一个字母l的字W串相匹配?
有时候不知道要匹配多字W。ؓ了能适应q种不确定性,正则表达式支持限定符的概c这些限定符可以指定正则表达式的一个给定组件必要出现多少ơ才能满_配?/p>
{n} n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/p>
{n,} n 是一个非负整数。至匹?n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'o+'?o{0,}' 则等价于 'o*'?/p>
{n,m} m ?n 均ؓ非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{?/p>
除了元字W之外,用户q可以精指定模式在匚w对象中出现的频率。例如,/jim {2,6}/ 上述正则表达式规定字Wm可以在匹配对象中q箋出现2-6ơ,因此Q上q正则表辑ּ可以同jimmy或jimmmmmy{字W串相匹配?
在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字W的使用方式?
使用实例
在JavaScript 1.2中带有一个功能强大的RegExp()对象Q可以用来进行正则表辑ּ的匹配操作。其中的test()Ҏ可以验目标对象中是否包含匚w模式Qƈ相应的返回true或false?
我们可以使用JavaScript~写以下脚本Q验证用戯入的邮g地址的有效性?
正则表达式对?/span>
本对象包含正则表辑ּ模式以及表明如何应用模式的标志?
Pattern
必选项。要使用的正则表辑ּ模式。如果用语?1Q用 "/" 字符分隔模式。如果用语法 2Q用引号模式引h?
Flags
可选项。如果用语?2 要用引号?flag 引v来。标志可以组合用,可用的有Q?
CZ
下面的示例创Z个包含正则表辑ּ模式及相x志的对象(re)Q向您演C正则表辑ּ对象的用法。在本例中,作ؓl果的正则表辑ּ对象又用?match Ҏ中:
q回| ain,ain,ain,ain\\
属?lastIndex 属?| source 属性\\
Ҏ compile Ҏ | exec Ҏ | test Ҏ\\
要求 版本 3\\
请参?RegExp 对象 | 正则表达式语?| String 对象\\
exec Ҏ
用正则表辑ּ模式在字W串中运行查找,q返回包含该查找l果的一个数l?
rgExp.exec(str)
参数
rgExp
必选项。包含正则表辑ּ模式和可用标志的正则表达式对象?
str
必选项。要在其中执行查扄 String 对象或字W串文字?
说明\\
如果 exec Ҏ没有扑ֈ匚wQ则它返?null。如果它扑ֈ匚wQ则 exec Ҏq回一个数l,q且更新全局 RegExp 对象的属性,以反映匹配结果。数l的0元素包含了完整的匚wQ而第1到n元素中包含的是匹配中出现的Q意一个子匚w。这相当于没有设|全局标志 (g) ?match Ҏ?
如果为正则表辑ּ讄了全局标志Qexec 从以 lastIndex 的值指C的位置开始查找。如果没有设|全局标志Qexec 忽略 lastIndex 的|从字W串的v始位|开始搜索?/p>
exec Ҏq回的数l有三个属性,分别?input、index ?lastIndex。Input 属性包含了整个被查扄字符丌ӀIndex 属性中包含了整个被查找字符串中被匹配的子字W串的位|。LastIndex 属性中包含了匹配中最后一个字W的下一个位|?/p>
CZ\\
下面的例子D例说明了 exec Ҏ的用法:
q回|0-3The 4-8rain 9-11in 12-17Spain 18-23falls 24-30mainly 31-33in 34-37the 38-43plain
test Ҏ\\
q回一?Boolean |它指出在被查扄字符串中是否存在模式?
rgexp.test(str)
参数\\
rgexp
必选项。包含正则表辑ּ模式或可用标志的正则表达式对象?
str
必选项。要在其上测试查扄字符丌Ӏ?
说明
test Ҏ查在字符串中是否存在一个模式,如果存在则返?trueQ否则就q回 false?
全局 RegExp 对象的属性不?test Ҏ来修攏V?/p>
CZ
下面的例子D例说明了 test Ҏ的用法:
函数调用Qdocument.write (TestDemo(/ain+/ ,"The rain in Spain falls mainly in the plain."));
q回|'The rain in Spain falls mainly in the plain.' contains 'ain+'
match Ҏ
使用正则表达式模式对字符串执行查找,q将包含查找的结果作为数l返回。\\
stringObj.match(rgExp)
参数\\
stringObj
必选项。对其进行查扄 String 对象或字W串文字?
rgExp
必选项。ؓ包含正则表达式模式和可用标志的正则表辑ּ对象。也可以是包含正则表辑ּ模式和可用标志的变量名或字符串文字?
说明\\
如果 match Ҏ没有扑ֈ匚wQ返?null。如果找到匹配返回一个数lƈ且更新全局 RegExp 对象的属性以反映匚wl果?
match Ҏq回的数l有三个属性:input、index ?lastIndex。Input 属性包含整个的被查扑֭W串。Index 属性包含了在整个被查找字符串中匚w的子字符串的位置。LastIndex 属性包含了最后一ơ匹配中最后一个字W的下一个位|?
如果没有讄全局标志 (g)Q数l的 0 元素包含整个匚wQ而第 1 ?n 元素包含了匹配中曑և现过的Q一个子匚w。这相当于没有设|全局标志?exec Ҏ。如果设|了全局标志Q元?0 ?n 中包含所有匹配?/p>
CZ\\
下面的示例演CZmatch Ҏ的用法:
本示例说明带 g 标志讄?match Ҏ的用法?
上面几行代码演示了字W串文字?match Ҏ的用法?
search Ҏ
q回与正则表辑ּ查找内容匚w的第一个子字符串的位置?/p>
stringObj.search(rgExp)
参数\\
stringObj
必选项。要在其上进行查扄 String 对象或字W串文字?
rgExp
必选项。包含正则表辑ּ模式和可用标志的正则表达式对象?
说明
search Ҏ指明是否存在相应的匹配。如果找C个匹配,search Ҏ返回一个整数|指明q个匚w距离字符串开始的偏移位置。如果没有找到匹配,则返?-1?/p>
CZ\\
下面的示例演CZ search Ҏ的用法?
正则表达式语?/span> q里有一些可能会遇到的正则表辑ּCZQ? 下表是元字符及其在正则表辑ּ上下文中的行为的一个完整列表: 字符 描述 ^ 匚w输入字符串的开始位|。如果设|了 RegExp 对象?Multiline 属性,^ 也匹?'\n' ?'\r' 之后的位|? $ 匚w输入字符串的l束位置。如果设|了RegExp 对象?Multiline 属性,$ 也匹?'\n' ?'\r' 之前的位|? * 匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及 "zoo"?* {h于{0,}? + 匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及 "zoo"Q但不能匚w "z"? {h?{1,}? ? 匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h?{0,1}? {n} n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o? {n,} n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'o+'?o{0,}' 则等价于 'o*'? {n,m} m ?n 均ؓ非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。刘Q?"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{? ? 当该字符紧跟在Q何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'? . 匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式? (?:pattern) 匚w pattern 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式? (?=pattern) 正向预查Q在M匚w pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开始? (?!pattern) 负向预查Q在M不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开? x|y 匚w x ?y。例如,'z|food' 能匹?"z" ?"food"?(z|f)ood' 则匹?"zood" ?"food"? [xyz] 字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'? [^xyz] 负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'? [a-z] 字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符? [^a-z] 负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符? \b 匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'? \B 匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'? \cx 匚w由x指明的控制字W。例如, \cM 匚w一?Control-M 或回车符?x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符? \d 匚w一个数字字W。等价于 [0-9]? \D 匚w一个非数字字符。等价于 [^0-9]? \f 匚w一个换늬。等价于 \x0c ?\cL? \n 匚w一个换行符。等价于 \x0a ?\cJ? \r 匚w一个回车符。等价于 \x0d ?\cM? \s 匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]? \S 匚wM非空白字W。等价于 [^ \f\n\r\t\v]? \t 匚w一个制表符。等价于 \x09 ?\cI? \v 匚w一个垂直制表符。等价于 \x0b ?\cK? \w 匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'? \W 匚wM非单词字W。等价于 '[^A-Za-z0-9_]'? \xn 匚w nQ其?n 为十六进制{义倹{十六进制{义值必Mؓ定的两个数字长。例如, '\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码? \num 匚w numQ其?num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匚w两个q箋的相同字W? \n 标识一个八q制转义值或一个后向引用。如?\n 之前臛_ n 个获取的子表辑ּQ则 n 为后向引用。否则,如果 n 为八q制数字 (0-7)Q则 n Z个八q制转义倹{? \nm 标识一个八q制转义值或一个后向引用。如?\nm 之前臛_有is preceded by at least nm 个获取得子表辑ּQ则 nm 为后向引用。如?\nm 之前臛_?n 个获取,?n Z个后跟文?m 的后向引用。如果前面的条g都不满Q若 n ?m 均ؓ八进制数?(0-7)Q则 \nm 匹配八q制转义?nm? \nml 如果 n 为八q制数字 (0-3)Q且 m ?l 均ؓ八进制数?(0-7)Q则匚w八进制{义?nml? \un 匚w nQ其?n 是一个用四个十六q制数字表示?Unicode 字符。例如, \u00A9 匚w版权W号 (?)? 优先权顺?/span> 下表从最高优先到最低优先列出各种正则表达式操作符的优先权序Q? 普通字W?/p>
普通字W由所有那些未昑ּ指定为元字符的打印和非打印字W组成。这包括所有的大写和小写字母字W,所有数字,所有标点符号以及一些符受? 最单的正则表达式是一个单独的普通字W,可以匚w所搜烦字符串中的该字符本n。例如,单字W模?'A' 可以匚w所搜烦字符串中M位置出现的字?'A'。这里有一些单字符正则表达式模式的CZQ? /a7M/ "a7M" 现在假设top.html (即上面的面) 有七个button来实现对bottom.html (即下面的面) 的刷斎ͼ可以用以下七U语句,哪个好用自己看着办了?/p>
语句1. window.parent.frames[1].location.reload(); 自动h面的方? 2.面自动跌{Q把如下代码加入<head>区域?br />
<meta http-equiv="refresh" content="20;url=http://www.wyxg.com"> 3.面自动hjs?br />
<script language="JavaScript"> ASP.NET如何输出h父窗口脚本语?br />
1. this.response.write("<script>opener.location.reload();</script>"); 2. this.response.write("<script>opener.window.location.href = opener.window.location.href;</script>"); 3. Response.Write("<script language=javascript>opener.window.navigate(''你要h的页.asp'');</script>") //子窗口刷新父H口
一个正则表辑ּ是由普通字W(例如字符 a ?zQ以及特D字W(UCؓ元字W)l成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符丌Ӏ正则表辑ּ作ؓ一个模板,某个字W模式与所搜烦的字W串q行匚w?/p>
\ 下一个字W标Cؓ一个特D字W、或一个原义字W、或一?后向引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\\' 匚w "\" ?"\(" 则匹?"("?
(pattern) 匚wpattern q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?SubMatches 集合Q在JScript 中则使用 $0…$9 属性。要匚w圆括号字W,请?'\(' ?'\)'?
在构造正则表辑ּ之后Q就可以象数学表辑ּ一h求|也就是说Q可以从左至叛_ƈ按照一个优先权序来求倹{?
{h?VBScript 单字W正则表辑ּ为:
可以多个单字符l合在一起得C个较大的表达式。例如,下面?JScript 正则表达式不是别的,是通过l合单字W表辑ּ 'a'?7'以及 'M' 所创徏出来的一个表辑ּ?
{h?VBScript 表达式ؓQ?/p>
h意这里没有连接操作符。所需要做的就是将一个字W放在了另一个字W后面?/p>
frame.html ׃(top.html)?bottom.html)两个面l成Q代码如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> frame </TITLE>
</HEAD>
<frameset rows="50%,50%">
<frame name=top src="top.html">
<frame name=bottom src="bottom.html">
</frameset>
</HTML>
语句2. window.parent.frames.bottom.location.reload();
语句3. window.parent.frames["bottom"].location.reload();
语句4. window.parent.frames.item(1).location.reload();
语句5. window.parent.frames.item('bottom').location.reload();
语句6. window.parent.bottom.location.reload();
语句7. window.parent['bottom'].location.reload();
top.html 面的代码如下:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> top.html </TITLE>
</HEAD>
<BODY>
<input type=button value="h1" onclick="window.parent.frames[1].location.reload()"><br>
<input type=button value="h2" onclick="window.parent.frames.bottom.location.reload()"><br>
<input type=button value="h3" onclick="window.parent.frames['bottom'].location.reload()"><br>
<input type=button value="h4" onclick="window.parent.frames.item(1).location.reload()"><br>
<input type=button value="h5" onclick="window.parent.frames.item('bottom').location.reload()"><br>
<input type=button value="h6" onclick="window.parent.bottom.location.reload()"><br>
<input type=button value="h7" onclick="window.parent['bottom'].location.reload()"><br>
</BODY>
</HTML>
下面是bottom.html面源代码,Z证明下方面的确被刷CQ在装蝲完页面弹Z个对话框?br />
bottom.html 面的代码如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> bottom.html </TITLE>
</HEAD>
<BODY onload="alert('我被加蝲了!')">
<h1>This is the content in bottom.html.</h1>
</BODY>
</HTML>
解释一下:
1.window指代的是当前面Q例如对于此例它指的是top.html面?br />
2.parent指的是当前页面的爉面,也就是包含它的框枉面。例如对于此例它指的是framedemo.html?br />
3.frames是window对象Q是一个数l。代表着该框架内所有子面?br />
4.item是方法。返回数l里面的元素?br />
5.如果子页面也是个框架面Q里面还是其它的子页面,那么上面的有些方法可能不行?br />
附:
Javascripth面的几U方法:
1 history.go(0)
2 location.reload()
3 location=location
4 location.assign(location)
5 document.execCommand('Refresh')
6 window.navigate(location)
7 location.replace(location)
8 document.URL=location.href
1.面自动hQ把如下代码加入<head>区域?br />
<meta http-equiv="refresh" content="20">
其中20指每?0U刷Cơ页?
其中20指隔20U后跌{到http://www.wyxg.com面
function myrefresh()
{
window.location.reload();
}
setTimeout('myrefresh()',1000); //指定1U刷C?br />
</script>
JSh框架的脚本语?br />
//如何h包含该框架的面?nbsp;
<script language=JavaScript>
parent.location.reload();
</script>
<script language=JavaScript>
self.opener.location.reload();
</script>
( 或 <a href="javascript:opener.location.reload()">h</a> )
//如何h另一个框架的面?nbsp;
<script language=JavaScript>
parent.另一FrameID.location.reload();
</script>
如果惛_闭窗口时h或者想开H时h的话Q在<body>中调用以下语句即可?/span>
<body onload="opener.location.reload()"> 开H时h
<body onUnload="opener.location.reload()"> 关闭时刷?/font>
<script language="javascript">
window.opener.document.location.reload()
</script>
在弹出窗口的BODY中加?nbsp; onUnload="window.opener.location.reload();" 关闭弹出H口则自动刷新父H口.
]]>
1
在ie中我们可以直接用event变量Q但是在firefox下由于event是局部变量,firefox下我们可以事件绑定到元素?例如
<input type="button" onclick="doEvent (event)">
Z同时兼容ie和firefox 通常在函数种通过以下代码获得事g?
var theEvent = window.event||e;
var srcElement = theEvent.srcElement;
if (!srcElement) {
srcElement = theEvent.target;
}
2
在IE下是?filters.alpha.opacity
在Firefox下是?style.opacity
一般是来设|元素的透明度,所以我们一般通过以下代码来解军_定w?
var IE = navigator.userAgent.indexOf("MSIE")>0? 1: 0;
if(IE)
{
obj.filters.alpha.opacity;
}
Else
{
obj.style.opacity;
}
3
IE下我们经怋用innerTextQ但是Firefox不支持此写法Q通常我们写成textContent. 它同时兼容IE和firefoxQ徏议大安用textContent.对于没有html标签的我们也可以采用innerHTML替代?
4
IE?event对象有srcElement属?但是没有target属?Firefox?event对象有target属?但是没有srcElement属?
解决Ҏ:使用obj(obj = event.srcElement ? event.srcElement : event.target;)
5
在IE中我可以通过obj.parentElement获得父元素,但是firex下不支持
因ؓfirefox与IE都支持DOMQ所有我们可以采用obj.parentNode来解冟?
6
IE?可以使用()或[]获取集合cd?Firefox?只能使用[]获取集合cd?
解决Ҏ:l一使用[]获取集合cd?
说明:IE?可以使用获取常规属性的Ҏ来获取自定义属?也可以用getAttribute()获取自定义属?Firefox?只能使用getAttribute()获取自定义属?
解决Ҏ:l一通过getAttribute()获取自定义属?
说明:IE?,可以使用eval("idName")或getElementById("idName")来取得id为idName的HTML对象;Firefox下只能用getElementById("idName")来取得id为idName的HTML对象.
解决Ҏ:l一用getElementById("idName")来取得id为idName的HTML对象.
说明:IE?HTML对象的ID可以作ؓdocument的下属对象变量名直接使用;Firefox下则不能.Firefox?可以使用与HTML对象ID相同的变量名;IE下则不能?
解决Ҏ:使用document.getElementById("idName")代替document.idName.最好不要取HTML对象ID相同的变量名,以减错?在声明变量时,一律加上var,以避免歧?
说明:Firefox?可以使用const关键字或var关键字来定义帔R;IE?只能使用var关键字来定义帔R.
解决Ҏ:l一使用var关键字来定义帔R.
说明:IE下input.type属性ؓ只读;但是Firefox下input.type属性ؓd.
说明:IE?even对象有x,y属?但是没有pageX,pageY属?Firefox?even对象有pageX,pageY属?但是没有x,y属?
解决Ҏ:使用mX(mX = event.x ? event.x : event.pageX;)来代替IE下的event.x或者Firefox下的event.pageX.
说明:IE或者Firefox2.0.x?可以使用window.location或window.location.href;Firefox1.5.x?只能使用window.location.
解决Ҏ:使用window.location来代替window.location.href.
说明:IE?可以通过showModalDialog和showModelessDialog打开模态和非模态窗?Firefox下则不能.
?x?直接使用window.open(pageURL,name,parameters)方式打开新窗口。如果需要将子窗口中的参C递回父窗??以在子窗口中使用window.opener来访问父H口. 例如Qvar parWin = window.opener; parWin.document.getElementById("Aqing").value = "Aqing";
以下面的frameZQ?
<frame src="/xxx.html" id="frameId" name="frameName" />
(1)讉Kframe对象:
IE:使用window.frameId或者window.frameName来访问这个frame对象.
Firefox:只能使用window.frameName来访问这个frame对象.
另外Q在IE和Firefox中都可以使用window.document.getElementById("frameId")来访问这个frame对象.
(2)切换frame内容:
在IE和Firefox中都可以使用window.document.getElementById("testFrame").src = "xxx.html"或window.frameName.location = "xxx.html"来切换frame的内?
如果需要将frame中的参数传回父窗口,可以在frme中用parent来访问父H口。例如:parent.document.form1.filename.value="Aqing";
Firefox的body在body标签没有被浏览器完全d之前存在;而IE的body则必dbody标签被浏览器完全d之后才存?
例如Q?
FirefoxQ?
<body>
<script type="text/javascript">
document.body.onclick = function(evt){
evt = evt || window.event;
alert(evt);
}
</script>
</body>
IE&FirefoxQ?
<body>
</body>
<script type="text/javascript">
document.body.onclick = function(evt){
evt = evt || window.event;
alert(evt);
} </script>
IEQdocument.body.onload = inject; //Function inject()在这之前已被实现
FirefoxQdocument.body.onload = inject();
document.body.onload=new Function('inject()');
firefox不支持handQ但ie支持pointer
解决Ҏ: l一使用pointer
解决ҎQ?
obj.style.height = imgObj.height + 'px';
解决ҎQ?
//向tableq加一个空行:
var row = otable.insertRow(-1);
var cell = document.createElement("td");
cell.innerHTML = " ";
cell.className = "XXXX";
row.appendChild(cell);
padding 5px 4px 3px 1px FireFox无法解释?必须Ҏ padding-top:5px; padding-right:4px; padding-bottom:3px; padding-left:1px;
样式应写?list-style:none;margin:0px;padding:0px;
其中margin属性对IE有效Qpadding属性对FireFox有效
IEQfilter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)?
FFQopacity:0.6?
IEQ不支持圆角?
FFQ?-moz-border-radius:4pxQ或?moz-border-radius-topleft:4px;-moz-border- radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius- bottomright:4px;?
IEQborder:2px outset;?
FFQ?-moz-border-top-colors: #d4d0c8 white;-moz-border-left-colors: #d4d0c8 white;-moz-border-right-colors:#404040 #808080;-moz-border-bottom-colors:#404040 #808080;
改用下面三个tag的其中一个来代替document.all
getElementsByTagName("tagName") 可以得到得到所有标{օ素的集合
getElementById("idName") 可以按id得到某一元素
getElementsByName("Name") 可以得到按name属性得到某一元素
document.all.online.innerHTML; //q种Ҏ在IE中可以用,但不是标准方?
document.getElementById("online").innerHTML; //q样firefoxp使用innerHTML?
解决Q统一使用eval()
29
30
insertAdjacentHTML ?insertAdjacentText 是IE下特有的JSQ功能非常好?
可惜Firefox 没有q两东东Q不q,加上下面的这D늚QFirefox下也可以支持q?
两个Ҏ?
if(typeof HTMLElement!="undefined" && !HTMLElement.prototype.insertAdjacentElement)
{
HTMLElement.prototype.insertAdjacentElement = function(where,parsedNode)
{
switch (where)
{
case 'beforeBegin':
this.parentNode.insertBefore(parsedNode,this)
break;
case 'afterBegin':
this.insertBefore(parsedNode,this.firstChild);
break;
case 'beforeEnd':
this.appendChild(parsedNode);
break;
case 'afterEnd':
if (this.nextSibling) this.parentNode.insertBefore(parsedNode,this.nextSibling);
else this.parentNode.appendChild(parsedNode);
break;
}
}
HTMLElement.prototype.insertAdjacentHTML = function (where,htmlStr)
{
var r = this.ownerDocument.createRange();
r.setStartBefore(this);
var parsedHTML = r.createContextualFragment(htmlStr);
this.insertAdjacentElement(where,parsedHTML)
}
HTMLElement.prototype.insertAdjacentText = function (where,txtStr)
{
var parsedText = document.createTextNode(txtStr)
this.insertAdjacentElement(where,parsedText)
}
}
31
Ie下有elementFromPointҎQ但是firefox没有Q可以重写该Ҏ
Document.prototype.elementFromPoint = function(x, y)
{
this.addEventListener("mousemove", this.elementFromPoint__handler, false);
var event = this.createEvent("MouseEvents");
var box = this.getBoxObjectFor(this.documentElement);
var screenDelta = { x: box.screenX, y: box.screenY };
event.initMouseEvent("mousemove", true, false, this.defaultView, 0,
x + screenDelta.x, y + screenDelta.y, x, y,
false, false, false, false, 0, null);
this.dispatchEvent(event);
this.removeEventListener("mousemove", this.elementFromPoint__handler, false);
return this.elementFromPoint__target;
}
Document.prototype.elementFromPoint__handler = function (event)
{
this.elementFromPoint__target = event.explicitOriginalTarget;
if (this.elementFromPoint__target.nodetype == Node.TEXT_NODE)
this.elementFromPoint__target = this.elementFromPoint__target.parentNode;
if (this.elementFromPoint__target.nodeName.toUpperCase() == "HTML" && this.documentElement.nodeName.toUpperCase() == "HTML")
this.elementFromPoint__target = this.getElementsByTagName("BODY").item(0);
//****added this code to check for textboxes and textareas
if ( this.elementFromPoint__target.nodeName=="#document" )//possible textbox or textarea
{
rp = event.rangeParent;
alert("event.rangeParent = " + rp);
if ( event.rangeParent.nodetype == Node.TEXT_NODE )//textbox with a value
this.elementFromPoint__target = event.rangeParent.parentNode.parentNode;
else if ( event.rangeParent.nodeName == 'div' )//textbox without a value
this.elementFromPoint__target = event.rangeParent.parentNode;
}
//****end. However this cause permission denied as the rangeParent object appears to be private!
event.preventdefault();
event.stopPropagation();
}
Document.prototype.elementFromPoint__target = null;
firefox 没有 mousewheel 事g。可以通过以下Ҏ解决.
<script>
var n=0;
function mwEvent(e)
{
if (!e) e = window.event;
if ( e.wheelDelta <= 0 || e.detail > 0) { n++; }
else { n--; }
window.status=n;
}
if(document.attachEvent){
document.attachEvent("onmousewheel",mwEvent);
}else{
window.addEventListener("DOMMouseScroll", mwEvent, false);
}
</script>
滚轮IE和Firefox的代码不一P
IE是mousewheel事gQFirefox是DOMMouseScroll事g
事g属性,IE是event.wheelDeltaQFirefox是event.detail
属性的方向g不一PIE向上?> 0QFirefox向下?> 0
//滚轮攑֤或羃,ZPrototype 1.6
var scrollfunc = function(event) {
var direct = 0;
if (event.wheelDelta) {
direct = event.wheelDelta > 0 ? 1 : -1;
} else if (event.detail) {
direct = event.detail < 0 ? 1 : -1;
}
zoom(direct);
};
Event.observe(document, 'mousewheel', scrollfunc);
Event.observe(document, 'DOMMouseScroll', scrollfunc); //firefox
attachEventҎ解释:
attachEvent?个参?W一个参数是事g?W二个参数是事g触发后所响应的方? Firefox下解x法是
Object.prototype.attachEvent=function(method,func)
{
if(!this[method])
this[method]=func;
else
this[method]=this[method].attach(func);
}
Function.prototype.attach=function(func){
var f=this;
return function(){
f();
func();
}
}
在firefox和ie力都用title,alt在firefox下不起作?img id="paperPicArea1" style="display: none; position: relative" alt="" src="http://cnc.imgcache.qq.com/ac/b.gif" />
]]>