上一篇,IE8的JS引擎内存不停增长,是因为动态生成了一个image对象导致的。有了病因,就开始寻找治疗方法。

1、使用一个固定的img对象,但是无法获取地址改变后的图片大小,最总还是放弃;

2、寻找从JS代码上来避免内存泄漏的方法:google各种网站,不论是如何生成再销毁这个img对象,貌似都会泄漏,只好作罢。

3、改用弹窗,使用showModalDialog来显示图片,在Chrome下,弹窗行为与IE不一样,而且还会被拦截……

------ 无法用统一的方案来解决,最后决定使用混合方案,如果是IE,且为10以下版本,采用弹窗,如果是其他浏览器,采用原有弹出层的方案。

因此这样就简单了

JS代码:

 $('a.image').click(function () {
var src = $(this).attr('href');
if($.browser.msie && $.browser.version < 10.0){ // ie10以下的浏览器
var encUrl = encodeURI(src);
var url = 'showimg.html?src=' + encUrl + '&rnd=' + Math.random();
window.showModalDialog(url,'图片显示','dialogWidth:800px;dialogHeight:560px;resizable:yes;center:yes');
}else{ // 其他浏览器
showImage(src); // 弹出层的方式
} return false;
});

URL上加上一个随机数是为了避免浏览器缓存窗口用的,不然改了代码也无法刷新,还要清IE缓存;

弹出窗口的HTML代码

<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>图片</title>
</head> <body style="background:#232323">
<div style="text-align:center;height:560px;">
<table border="0" cellpadding="0" cellspacing="0">
<tr><td style="width : 800px;height:560px;">
<img id="img" style="margin:auto; vertical-align: middle;border:2px solid silver;" />
<td></tr>
</table>
</div>
</body>
<script type="text/javascript">
function getParameterByName(name)
{
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regexS = "[\\?&]" + name + "=([^&#]*)";
var regex = new RegExp(regexS);
var results = regex.exec(window.location.search);
if(results == null)
return "";
else
return decodeURIComponent(results[1].replace(/\+/g, " "));
} var url = getParameterByName('src');
var decUrl = decodeURI(url); document.getElementById('img').src = decUrl;
</script>
</html>

最开始,打算根据图片大小弹出对话框,发现又会进入到动态生成img对象的陷阱,只好弹出固定大小的对话框,算是折衷方案。在弹出的网页中,希望图片能够居中显示,最开始用JS代码来根据图片大小及窗口高度调整图片位置,结果发现在IE8里面,弹出的窗口中,采用各种方式获取的窗口高度都是0,chrome与IE10都是OK的,#@$@#$!。最后想起来,表格的TD默认不就是垂直居中的么?就改成一个表格,固定好高度,自然就居中了,有的时候,复古也是一种解决方案。

IE8的 JS 引擎如此不堪(二) - 解决方案的更多相关文章

  1. IE8的 JS 引擎如此不堪?

    之前给客户做了个网站,其中有这么一个功能: 文章内容中,有指向某个图片的链接,链接内容为图片名称(文字),点击之后在页面上弹出该图片显示,图片可以为png,jpg,gif等. 于是,祭出了JQuery ...

  2. JS引擎线程的执行过程的三个阶段(二)

    继续JS引擎线程的执行过程的三个阶段(一) 内容, 如下: 三. 执行阶段 1. 网页的线程 永远只有JS引擎线程在执行JS脚本程序,其他三个线程只负责将满足触发条件的处理函数推进事件队列,等待JS引 ...

  3. (转载)js引擎的执行过程(二)

    概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 语法分析: 分别对加载完成的代码块进行语法检验,语法正 ...

  4. 浏览器渲染基本原理(二):JS引擎的工作方式

    JS引擎也可以叫做JS解释器 浏览器的组成 浏览器的核心是两部分:渲染引擎和JavaScript解释器(又称JavaScript引擎). (1)渲染引擎 渲染引擎的主要作用是,将网页从代码“渲染”为用 ...

  5. 浏览器内核、排版引擎、js引擎

    [定义] 浏览器最重要或者说核心的部分是“Rendering Engine”,可大概译为“渲染引擎”,不过我们一般习惯将之称为“浏览器内核”.负责对网页语法的解释(如标准通用标记语 言下的一个应用HT ...

  6. javascript从定义到执行 js引擎 闭包

    javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境 栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链 ...

  7. 微信小游戏开发之四:使用three.js引擎

    一.前言 微信小游戏中最魔性的'跳一跳'就是基于three.js 引擎开发的 源码放到github上了:GitHub地址   请自行下载. 二.下载 three.min.js 打开页面,复制代码到本地 ...

  8. JS引擎线程的执行过程的三个阶段(一)

    浏览器首先按顺序加载由<script>标签分割的js代码块,加载js代码块完毕后,立刻进入以下三个阶段,然后再按顺序查找下一个代码块,再继续执行以下三个阶段,无论是外部脚本文件(不异步加载 ...

  9. JS引擎的执行机制:探究EventLoop(含Macro Task和Micro Task)

    在我看来理解好JS引擎的执行机制对于理解JS引擎至关重要,今天将要好好梳理下JS引擎的执行机制. 首先解释下题目中的名词:(阅读本文后你会对这些概念掌握了解) Event Loop:事件循环Micro ...

随机推荐

  1. linux之shell脚本学习篇一

    此文包含脚本服务请求,字符串截取,文件读写内容,打印内容换行. #!/bin/bashretMsg="";while read LINEdo        echo "t ...

  2. 域名解析的DNS缓存如何清理

    域名解析(DNS)缓存是什么? 域名解析缓存又名DNS缓存,常见表现名称是TTL:(TimeToLive)生存时间,就是域名解析记录在DNS服务器中的存留有效时间. 当各地的DNS服务器接受到解析请求 ...

  3. 【bzoj1455】罗马游戏 可并堆+并查集

    题目描述 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻.他决定玩这样 ...

  4. ashx文件和aspx

    ashx文件和aspx文件有什么不同? 我们先新建一个ashx文件看看: <%@ WebHandler Language="C#" Class="Handler&q ...

  5. 【题解】HAOI2011Problem b

    第一次接触莫比乌斯反演,总之脑子都快要炸掉了……好难啊!本蒟蒻表示根本无法理解呜呜呜呜呜……不过在机房DL的帮助下总算是磕磕绊绊的A掉了这一题: 这道题目要我们的求的是:(1)ΣiΣj [gcd(i, ...

  6. C&C++——标准库

    1.什么是C&C++的标准库? C语言被发明出来时并没有什么库函数,随着C语言的流行,越来越多的厂商或者机构组织开始提供C的编译器,并且同时把经常用到的函数封装成“库”的形式发布:不同的组织发 ...

  7. 如何设置项目encoding为utf-8

    1.鼠标右键点击项目,选择[properties] 2.选择[Resource],在Text file encoding里面选择UTF-8,点击[ok] 大功告成! 木头大哥所发的文章均基于自身实践, ...

  8. POJ1459:Power Network(多源点多汇点的最大流)

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 31086   Accepted: 15986 题 ...

  9. BZOJ1001:狼抓兔子(最小割最大流+vector模板)

    1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...

  10. 动态性能视图v$session_longops

    v$session_longops This view displays the status of various operations that run for longer than 6 sec ...