当window.open()指定了第二个参数name的时候,会固定显示出一个子页面,但是每次点击的时候都会自动刷新子页面
我最近做了一个聊天页面,如果再次点击打开聊天页的按钮会刷新了子页面,页面的聊天记录等数据就会全部消失 下面的代码解决了这个问题 a.html b.html refresh_me.html
page B
window.name="b";
window.top.name="";
</script>
24
2010
[JavaScript]window.open控制设置了名字的子页面不刷新的方法
11
2009
[JavaScript]解决页面onresize缩放时多次调用的问题
IE8简直太脆弱了,加了一段监听窗口缩放的代码就不时的挂掉
发现Gmail的邮件列表用到了监听浏览器窗口的事件,不一样的是设置了一个延迟执行,这样就解决了多次调用的问题
这样ie8挂掉的几率应该就小多了吧!
window.onresize(function(){
if(timer == null){
timer = setTimeout(function(){
//缩放后你要执行的代码
doWhatUWant();
timer = null;
},200);
}
});
update:
今天继续测试页面时,ie8再次假死,怨念
也就是说设置这样一个延迟操作只能让挂掉的几率变小,但是我正在做这个是一个聊天的页面,一旦是挂掉了,聊天信息就全没了,用户会发疯的
于是继续搜索找到了下面的这个解决方法
传送:feiyu.asgard.cn/article_225.html
解决IE6,IE7下resize事件不断触发造成浏览器假死的问题
注:本示例采用jquery,原理都通用,用其他库或是不用库,只要改下代码即可。
有时,我们要在网页的resize事件中执行相关js代码。但是在ie6,ie7下,如果你缩放浏览器,resize事件会不断触发,造成假死现 象。把以下代码存为html文件,加上jquery.js,然后在ie6,ie7下打开,然后缩放下试试(假死后请用任务管理器结束任务):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>1</title> <script src="jquery.js"></script> <script> var i=0; $(function() { $(window).resize(function() { $("body").append("<p>" + (++i) + "</p>"); }); }); </script> </head> <body></body> </html>
为了解决该问题,以前采用setTimeout和clearTimeout来做,但是效果并不理想。虽然不会假死了,但测试结果是resize事件 还是会不断被执行,在资源管理器中监视时发现resize几次后CPU占用就上去了(根据setTimeout所定的延迟决定占用量)。
经过GOOGLE及反复试验,终于有较好解决该问题的方法。先看代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>3</title> <script type="text/javascript" src="jquery.js"></script> <script> var i=0; $(function() { if($.browser.msie && ("6.0,7.0".indexOf($.browser.version) != -1)) { $("body").append( '<div id="fix-ie-resize" style="width:100%;height:100%;position:absolute;z-index:-999;"></div>' ); $("#fix-ie-resize").resize(function() { $("body").append("<p>" + (++i) + "</p>"); }); } else{ $(window).resize(function() { $("body").append("<p>" + (++i) + "</p>"); }) } }); </script> <style> body{margin:0;} </style> </head> <body> </body> </html>
代码意思为:
判断浏览器是否是IE6或IE7,如果是的话,向body中加入一个长宽都是100%的无内容层,并且把resize事件绑定在该层上。
如果是其他浏览器,则直接绑定到window的resize事件。
28
2009
[JavaScript]匿名函数参数的问题
分两种写法:
自己声明参数名
alert(x+','+y);
})(1,2)
//显示 1,2
不声明参数(通过arguments数组取得)
alert(arguments[0]+','+arguments[1]);
})(1,2)
//显示 1,2
事实上只用知道参数的顺序和个数就可以自己定义参数名取得参数值
5
2009
[JQuery]捕捉按键keyCode的问题
今天遇到一个小问题代码如下
alert(event.keyCode);
})
提示event未定义
input_textarea是一个文本输入框
我想能在输入时捕获按下的是哪个键,以前不用JQuery时是通过这样的写法:(w3c的写法)
找了半天,终于知道原来jquery已经帮我封装好了,连浏览器类型都不用判断,方法如下
alert(event.keyCode);
})
看来以后还是要学习一下jquery的源码,才能了解更多底层的东西啊!
另外赞一下jquery,确实太喜欢了,以前要用上百行解决的问题50行内就能解决,一定要深入研究!
11
2009
[XML][JavaScript]XML DOM 浏览器差异
DOM 解析中的浏览器差异
所有现代浏览器都支持 W3C DOM 规范。
不过,浏览器之间是有差异的。重要的区别有两点:
- 加载 XML 的方式
- 处理空白和换行的方式
在 “解析 XML DOM” 这一节,已经解释了加载 XML 的不同方式。
在本节中,我们将讲解处理空白和换行的不同方式。
DOM - 空白和换行
XML 经常在节点之间含有换行或空白字符。这是在使用简单的编辑器(比如记事本)时经常出现的情况。
下面的例子(由记事本编辑)在每行之间含有 CR/LF,在每个子节点之前含有两个空格:
<book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book>
Firefox,以及其他一些浏览器,会把空的空白或换行作为文本节点来处理,而 Internet Explorer 不会这样。
下面的代码片段显示 (books.xml 的) 根元素拥有多少个子节点:
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.documentElement.childNodes; document.write("Number of child nodes: " + x.length);
例子解释:
- 通过使用 loadXMLDoc() 把 "books.xml" 载入 xmlDoc 中
- 获取根元素的子节点
- 输出子节点数目
结果取决于所使用的浏览器。Firefox 输出 9,而 IE 输出 4。
忽略节点间的空文本
如需忽略元素节点之间的空文本节点,需要检查节点类型。元素节点的类型是 1:
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.documentElement.childNodes; for (i=0;i<x.length;i++) { if (x[i].nodeType==1) {// only process element nodes document.write(x[i].nodeName); document.write("<br />"); } }
例子解释:
- 通过使用 loadXMLDoc() 把 "books.xml" 载入 xmlDoc 中
- 获取根元素的子节点
- 检查每个子节点的节点类型。如果节点类型是 "1",则是元素节点
11
2009
[JavaScript]动态得到select控件选中的值
<head>
<script type="text/javascript">
function getElements(){
var x=document.getElementsByTagName("select");
for(var i=0; i<x.length; i++){
alert(x[i][x[i].selectedIndex].value);
}
}
</script>
</head>
<body>
<select>
<option value=1>1</option>
<option value=2>2</option>
<option value=3>3</option>
</select>
<br />
<select>
<option value=a>a</option>
<option value=b>b</option>
<option value=c>c</option>
</select>
<br />
<input type="button" onclick="getElements()" value="选中了什么?" />
</body>
</html>
2
2009
[javascript]javascript的URL编码和解码
在 使用url进行参数传递时,经常会传递一些中文名的参数或URL地址,在后台处理时会发生转换错误。在有些传递页面使用GB2312,而在接收页面使用 UTF8,这样接收到的参数就可能会与原来发生不一致。使用服务器端的urlEncode函数编码的URL,与使用客户端javascript的 encodeURI函数编码的URL,结果就不一样。
采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码 (xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。unescape方法与此相反。不会被此方法编码的字 符: @ * / +
英文解 释:MSDN JScript Reference: The escape method returns a string value (in Unicode format) that contains the contents of [the argument].
All spaces, punctuation, accented characters, and any other non- ASCII characters are replaced with %xx encoding, where xx is equivalent to the hexadecimal number representing the character.
For example, a space is returned as "%20."
Edge Core Javascript Guide: The escape and unescape functions let you encode and decode strings.
The escape function returns the hexadecimal encoding of an argument in the ISO Latin character set.
The unescape function returns the ASCII string for the specified hexadecimal encoding value.
encodeURI() 方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '
英文解 释:MSDN JScript Reference: The encodeURI method returns an encoded URI.
If you pass the result to decodeURI, the original string is returned.
The encodeURI method does not encode the following characters: ":", "/", ";", and "?".
Use encodeURIComponent to encode these characters. Edge Core Javascript Guide: Encodes a Uniform Resource
Identifier (URI) by replacing each instance of certain characters by one, two, or three escape sequences representing the UTF- 8 encoding of the character
encodeURIComponent() 方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相 比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编 码之后URL将显示错误。不会被此方法编码的字符:! * ( )
英文解 释:MSDN JScript Reference: The encodeURIComponent method returns an encoded URI. If you pass the result to decodeURIComponent, the original string is returned.
Because the encodeURIComponent method encodes all characters, be careful if the string represents a path such as /folder1 /folder2 /default.html. The slash characters will be encoded and will not be valid if sent as a request to a web server. Use the encodeURI method if the string contains more than a
single URI component. Mozilla Developer Core Javascript Guide: Encodes a Uniform Resource Identifier (URI) component by replacing each instance of certain characters by one,
two, or three escape sequences representing the UTF- 8 encoding of the character.
另外,encodeURI/encodeURIComponent是在javascript1.5之后引进的,escape则在javascript1.0版本就有。
英文注 释:The escape() method does not encode the + character which is interpreted as a space on the server side as well as generated by forms with spaces in their fields.
Due to this shortcoming, you should avoid use of escape() whenever possible. The best alternative is usually encodeURIComponent().
Use of the encodeURI() method is a bit more specialized than escape() in that it encodes for URIs [REF] as opposed to the querystring,
which is part of a URL. Use this method when you need to encode a string to be used for any resource that uses URIs and needs certain characters to remain un- encoded. Note that this method does not encode the ' character, as it is a valid character within URIs.Lastly, the encodeURIComponent() method should be used in most
cases when encoding
a single component of a URI. This method will encode certain chars that would normally be recognized as special chars for URIs so that many components may be included.
Note that this method
does not encode the ' character, as it is a valid character within URIs.
20
2009
[JavaScript]颜色渐变代码
function fadeColor( from, to, callback, duration, totalFrames) {
//用一个函数来包裹setTimeout,根据帧数来确定延时
function doTimeout(color,frame) {
setTimeout(function() {
try {
callback(color);
} catch(e) {
JSLog.write(e);
}
}, (duration*1000/totalFrames)*frame);
//总持续秒数/每秒帧数*当前帧数=延时(秒),再乘以1000作为延时(毫秒)
}
// 整个渐变过程的持续时间,默认为1秒
var duration = duration || 1;
// 总帧数,默认为持续秒数*15帧,也即每秒15帧
var totalFrames = totalFrames || duration*15;
var r,g,b;
var frame = 1;
//在第0帧设置起始颜色
doTimeout('rgb(' + from.r + ',' + from.g + ',' + from.b + ')',0);
//计算每次变化所需要改变的rgb值
while (frame < totalFrames+1) {
r = Math.ceil(from.r * ((totalFrames-frame)/totalFrames)
+ to.r * (frame/totalFrames));
g = Math.ceil(from.g * ((totalFrames-frame)/totalFrames)
+ to.g * (frame/totalFrames));
b = Math.ceil(from.b * ((totalFrames-frame)/totalFrames)
+ to.b * (frame/totalFrames));
// 调用本frame的doTimeout
doTimeout('rgb(' + r + ',' + g + ',' + b + ')',frame);
frame++;
}
}
//使用方法
fadeColor(
{r:255,g:255,b:134}, //star color
{r:255,g:255,b:255}, //end color
function(color) {
document.getElementById("left").style.backgroundColor = color;
},
1
);
28
2008
[JavaScript]程序触发点击事件
if (document.createEvent){//火狐写法
var evObj = document.createEvent('MouseEvents');
evObj.initEvent( 'click', true, false );
obj.dispatchEvent(evObj);
}else{//ie写法
obj.click();
}
}
ie比较简单,但不规范,火狐代码多一点,但是规规矩矩
但是似乎`