利用数组提高IE拼接字符串效率

今天终于静下心来研究程序的效率问题,竟然发现一个普通的循环拼接字符串在IE下竟然执行了3秒钟时间
搜索发现早就有人对此进行了研究,于是又学到了一招,就是利用数组的join方法
以后得注意着这个问题,当需要拼接的字符串比较多的时候使用如下方法:

  1. function StringBuffer(){
  2.     this._strings = new Array();
  3. }
  4.  
  5. StringBuffer.prototype.append = function(str){
  6.     this._strings.push(str);
  7. };
  8. StringBuffer.prototype.toString = function(){
  9.     var str = arguments.length == 0 ? '' : arguments[0];
  10.     return this._strings.join(str);
  11. };
  12.  
  13. //示例
  14. var buffer = new StringBuffer();
  15. buffer.append('This is ');
  16. buffer.append('an ');
  17. buffer.append('example!');
  18. alert(buffer.toString());

在我的代码上实际使用时,原来需要执行3秒多的代码只要600多毫秒就搞定了,一举解决了速度问题
另外arguments对象可以在某些场合派上用场

标签:, , , , , ,

相关日志

计算element相对于父容器的偏移量

如果没有提供parentId参数,则计算相对于给定element的最顶层容器的偏移量
特别需要注意的是,这里所指的父级容器,是指最近的一个有定位的元素,意即设置了position属性为absolute或者relative的

  1. function getOffsetXY(elementId, parentId){
  2.     var element = document.getElementById(elementId);
  3.     var element_X = element.offsetLeft;
  4.     var element_Y = element.offsetTop;
  5.     while (true) {
  6.         if ((!element.offsetParent) || (!element.offsetParent.style) || (!!parentId && element.offsetParent.id == parentId)) {
  7.             break;
  8.         }
  9.        
  10.         element_X += element.offsetParent.offsetLeft;
  11.         element_Y += element.offsetParent.offsetTop;
  12.         element = element.offsetParent;
  13.     }
  14.     element_X = element_X - document.body.scrollLeft;
  15.     element_Y = element_Y - document.body.scrollTop;
  16.    
  17.     return {
  18.         x: element_X,
  19.         y: element_Y
  20.     };
  21. }
标签:, , , , , , , ,

相关日志

IE6用Javascript提交表单的问题

最近做网站,把IE6能碰到的问题基本碰了个遍,今天又碰到JS提交表单页面不刷新的问题

因为要用图片做按钮来提交表单,所以使用了如下代码:

<a href="javascript:void(0)" onclick="submitForm()"></a>

然后css去定义背景什么的,这些略掉

结果在IE6下点提交页面不跳转,折腾的时候又发现有些情况表单实际上已经提交了只是页面没有跳转
看到有人说应该使用setTimeout来提交,经过测试还是不行,根本就没有执行setTimeout里面的方法

最后查到是javascript:void(0)的问题,在IE6中当href=”javascript:void(0)”时是有可能中止当前的js操作的,
改成href=”#”,页面就跳转了(虽然还是有点小问题,就是先更改页面焦点到”#”然后才提交)

当然这个问题可以直接使用div等其他容器的onclick来实现应该就行了,没必要使用a这个超链接标签

标签:, , , , ,

相关日志

IE6又一bug?

总结一下就是类似#gisarrow.over、#gisarrow.expanded这样的选择符
在使用javascript动态更改className的时候只有最先定义的一个样式有效

在IE6运行以下例子,然后删掉#gisarrow.over做个对比
IE7下还没试

提示:你可以先修改部分代码再运行。

标签:, , , , ,

相关日志

操作iframe中的DOM元素

操作iframe中的DOM元素,有两个注意点:
1、必须先获取指定iframe的document;
2、对于1,必须在页面load完以后才能获取;

举例说明:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3.  
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  6. <title>操作iframe中的DOM元素</title>
  7. <script type="text/javascript">
  8. <!--
  9. //返回指定iframe的document
  10. function getIFrameDocument(aID) {
  11.     var rv = null;
  12.     if (document.getElementById(aID).contentWindow.document){
  13.         // if contentDocument exists, W3C compliant (Mozilla)
  14.         rv = document.getElementById(aID).contentWindow.document;
  15.     } else {
  16.         // IE
  17.         rv = document.frames[aID].document;
  18.     }
  19.     return rv;
  20. }
  21.  
  22. function bindEvents() {
  23.     var iDocument = getIFrameDocument('test');
  24.     //接下来就可以进行类似的DOM操作了
  25.     var map = iDocument.getElementById('map');
  26.     //……
  27. }
  28. //-->
  29. </script>
  30. </head>
  31.  
  32. <body onload="bindEvents()">
  33.  
  34. <iframe id="test" name="giscontent" src="iframe.html" frameborder="0" scrolling="no">
  35. </iframe>
  36.  
  37. </body>
  38. </html>
标签:, , ,

相关日志
Page 1 of 3123»

京ICP备05059555号