上一篇,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. java线程(3)——详解Callable、Future和FutureTask

    回顾: 接上篇博客 java线程--三种创建线程的方式,这篇博客主要介绍第三种方式Callable和Future.比较继承Thread类和实现Runnable接口,接口更加灵活,使用更广泛.但这两种方 ...

  2. [STL] 遍历删除两个vector中交集

    #include <vector> #include <string> #include <algorithm> using namespace std; int ...

  3. Delphi函数详解:全局函数,内部函数,类的成员函数,类的静态方法

    1. Delphi中的全局函数 //要点: 需要给其他单元调用, 必须在 interface 声明, 但必须在 uses 区后面 unit Unit1; interface uses   Window ...

  4. DELPHI控件属性事件说明

    常用DELPHI控件属性事件设置说明 常用DELPHI控件属性设置说明目录TForm Class TPanel组件 TToolBar Class TToolButton Class TTimer Cl ...

  5. BZOJ4537 HNOI2016最小公倍数(莫队+并查集)

    考虑边只有一种权值的简化情况.那么当且仅当两点可以通过边权<=x的边连通,且连通块内最大边权为x时,两点间存在路径max为x的路径.可以发现两种权值是类似的,当且仅当两点可以通过边权1<= ...

  6. JSP语法,运行机理等

    JSP是几年前就接触了,但是用归用,很多实际的意义含义等还是不太明白,借此机会,梳理一下. 1.JSP运行原理:当浏览器web应用服务器请求一个JSP页面时,Web应用服务器将其转换成一个Servle ...

  7. [BZOJ1283]序列

    Description 给出一个长度为n的正整数序列Ci,求一个子序列,使得原序列中任意长度为m的子串中被选出的元素不超过K(K,M<=100) 个,并且选出的元素之和最大. Input 第1行 ...

  8. 从CUBIC/BBR的TCP ACK失速说起

    上周有同事问,延迟ACK到底对应用层会产生什么后果,我也不知道该如何作答,于是丢了一个链接: TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK: 是的,这是 ...

  9. 根据约束id名找到表名

    数据库运行删除某条数据出现 [Err] ORA-02292: 违反完整约束条件 (ITOUCH_FDA.FKC7DB45E29C5A81ED) - 已找到子集 根据ITOUCH_FDA.FKC7DB4 ...

  10. 【NOIP模拟赛】与非 乱搞

    biubiu~~~ 正解是线段树维护真值表,但是我觉得对于这道题来说乱搞就够了....... 我们发现如果我们把每一个数都一开始取反就会发现对于最后结果来说 x=x^1,x nand x=x|x ,x ...