<?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>fuhei.net Lucars' Blog &#187; Javascript</title>
	<atom:link href="http://fuhei.net/category/all-about-frontend/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://fuhei.net</link>
	<description>这里有家里蹲宅男和宅女们喜欢的动漫、电影、音乐；这里有想和我交朋友的人想知道的一切信息。</description>
	<lastBuildDate>Thu, 03 Jun 2010 15:53:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>如何从子窗口向父窗口传递DOM节点？</title>
		<link>http://fuhei.net/2009/07/how-to-pass-dom-nodes-to-parent-document/</link>
		<comments>http://fuhei.net/2009/07/how-to-pass-dom-nodes-to-parent-document/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 17:23:24 +0000</pubDate>
		<dc:creator>Lucars</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[iframe]]></category>
		<category><![CDATA[正则表达式]]></category>

		<guid isPermaLink="false">http://fuhei.net/?p=320</guid>
		<description><![CDATA[注：本文不考虑跨域问题
现在在做的项目有非常多的DOM操作，而且还有从iframe或者子窗口中向父级窗口传递DOM节点的需求。一开始，按照经验都是使用innerHTML来操作，其实后来证明使用innerHTML是最可靠和行之有效的方法，不过我在这个问题上面却绕了一点远路，想尝试尝试是否可以直接用DOM节点作为参数传递给父级窗口。
过程略~~~
结果是在Firefox、Opera、Chrome、Safari都可以将clone过的node插入到父级文档中去，唯有IE系列（IE8未验证）浏览器会在appendChild方法上报一个“参数无效”的错误，即便使用YUI或者jQuery来操作也是一样的结果，看来IE完全把它认作是其他页面的东西。当然这个外来节点还是可以被操作的，至少可以获取数据，这样我想如果建一个代理节点是否可以解决呢？事实证明，是可以的，这里做了一个很猥琐的操作：

?View Code JAVASCRIPT1
2
3
4
5
6
7
8
9
if&#40;$FHD.browser.msie&#41;&#123;
	newDom = document.createElement&#40;dom.tagName&#41;;
	for&#40;var i in dom&#41;&#123;
		try&#123;
			newDom&#91;i&#93; = dom&#91;i&#93;;
		&#125;
		catch&#40;e&#41;&#123;&#125;
	&#125;
&#125;

不过上面这样的操作我觉得太浪费资源了，其实有innerHTML，完全没有必要这样做，试想本来就是要想让后台程序获取到innerHTML，没有必要走DOM操作的弯路。可能有人会说innerHTML在IE下会有所有标签变大写和属性丢失引号的问题，这应该属于IE恶劣行径之一，其实写两个正则表达式就可以解决这个问题：

?View Code JAVASCRIPT1
2
3
4
5
6
7
8
9
//替换大写标签为小写的正则表达式
str_html = str_html.replace&#40;/&#38;lt;\/?(a&#124;abbr&#124;acronym&#124;address&#124;applet&#124;area&#124;b&#124;base&#124;basefont&#124;bdo&#124;biq&#124;blockquote&#124;body&#124;br&#124;button&#124;coption&#124;center&#124;cite&#124;code&#124;col&#124;colgroup&#124;dd&#124;del&#124;dir&#124;div&#124;dfn&#124;dl&#124;dt&#124;em&#124;fieldset&#124;font&#124;form&#124;frame&#124;frameset&#124;h1&#124;h2&#124;h3&#124;h4&#124;h5&#124;h6&#124;head&#124;hr&#124;html&#124;i&#124;iframe&#124;img&#124;input&#124;ins&#124;kbd&#124;label&#124;legend&#124;li&#124;link&#124;map&#124;menu&#124;meta&#124;noframes&#124;noscript&#124;object&#124;ol&#124;optgroup&#124;option&#124;p&#124;param&#124;pre&#124;q&#124;s&#124;samp&#124;script&#124;select&#124;small&#124;span&#124;strike&#124;strong&#124;style&#124;sub&#124;sup&#124;table&#124;tbody&#124;td&#124;textarea&#124;tfoot&#124;th&#124;thead&#124;title&#124;tr&#124;tt&#124;u&#124;ul&#124;var)([&#38;gt;&#124;\s]+)/gi, function&#40;m, m1, m2&#41;&#123;
	return m.toLocaleLowerCase&#40;&#41;;
&#125;&#41;;
&#160;
//为属性加回引号，并将属性名替换为小写的正则表达式
str_html = str_html.replace&#40;/\s(\w+)=&#34;?([^&#34;&#38;gt;]+)&#34;?([&#38;gt;&#124;\s]+)/gi, function&#40;m, m1, m2, m3&#41;&#123;
	return ' ' + m1.toLocaleLowerCase&#40;&#41; + '=&#34;' + m2 + '&#34;' + m3;
&#125;&#41;;

不过IE的恶劣行径还没有完，li闭合标签丢失问题让我很想抽MS开发人员巴掌，大小写也就罢了，标签丢失可是大问题，这应该属于故障级BUG，为什么从IE6到IE7都没有修正呢？再扇他们两个巴掌。为此不得不再多写一个正则表达式：

?View Code JAVASCRIPT1
str = str.replace&#40;/&#40;\/&#124;a&#124;abbr&#124;acronym&#124;address&#124;applet&#124;area&#124;b&#124;base&#124;basefont&#124;bdo&#124;biq&#124;blockquote&#124;body&#124;br&#124;button&#124;coption&#124;center&#124;cite&#124;code&#124;col&#124;colgroup&#124;dd&#124;del&#124;dir&#124;div&#124;dfn&#124;dl&#124;dt&#124;em&#124;fieldset&#124;font&#124;form&#124;frame&#124;frameset&#124;h1&#124;h2&#124;h3&#124;h4&#124;h5&#124;h6&#124;head&#124;hr&#124;html&#124;i&#124;iframe&#124;img&#124;input&#124;ins&#124;kbd&#124;label&#124;legend&#124;link&#124;map&#124;menu&#124;meta&#124;noframes&#124;noscript&#124;object&#124;optgroup&#124;option&#124;p&#124;param&#124;pre&#124;q&#124;s&#124;samp&#124;script&#124;select&#124;small&#124;span&#124;strike&#124;strong&#124;style&#124;sub&#124;sup&#124;table&#124;tbody&#124;td&#124;textarea&#124;tfoot&#124;th&#124;thead&#124;title&#124;tr&#124;tt&#124;u&#124;var&#41;&#38;gt;&#40;&#91;\t\r\n\s&#93;*&#41;

以上均为完成项目为首要目标，对问题没有深究，尤其是IE中不能插入本文档流以外的DOM节点，不知道是什么原因，有ET路过的时候希望能留下点什么。
本文例程
]]></description>
			<content:encoded><![CDATA[<p><strong>注：本文不考虑跨域问题</strong></p>
<p>现在在做的项目有非常多的DOM操作，而且还有从iframe或者子窗口中向父级窗口传递DOM节点的需求。一开始，按照经验都是使用innerHTML来操作，其实后来证明使用innerHTML是最可靠和行之有效的方法，不过我在这个问题上面却绕了一点远路，想尝试尝试是否可以直接用DOM节点作为参数传递给父级窗口。</p>
<p>过程略~~~</p>
<p>结果是在Firefox、Opera、Chrome、Safari都可以将clone过的node插入到父级文档中去，唯有IE系列（IE8未验证）浏览器会在appendChild方法上报一个“参数无效”的错误，即便使用YUI或者jQuery来操作也是一样的结果，看来IE完全把它认作是其他页面的东西。当然这个外来节点还是可以被操作的，至少可以获取数据，这样我想如果建一个代理节点是否可以解决呢？事实证明，是可以的，这里做了一个很猥琐的操作：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p320code4'); return false;">View Code</a> JAVASCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3204"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p320code4"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>$FHD.<span style="color: #660066;">browser</span>.<span style="color: #660066;">msie</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	newDom <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span>dom.<span style="color: #660066;">tagName</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">for</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #000066; font-weight: bold;">in</span> dom<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span>
			newDom<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> dom<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>不过上面这样的操作我觉得太浪费资源了，其实有innerHTML，完全没有必要这样做，试想本来就是要想让后台程序获取到innerHTML，没有必要走DOM操作的弯路。可能有人会说innerHTML在IE下会有<strong>所有标签变大写</strong>和<strong>属性丢失引号</strong>的问题，这应该属于IE恶劣行径之一，其实写两个正则表达式就可以解决这个问题：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p320code5'); return false;">View Code</a> JAVASCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3205"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p320code5"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">//替换大写标签为小写的正则表达式</span>
str_html <span style="color: #339933;">=</span> str_html.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/&amp;lt;\/?(a|abbr|acronym|address|applet|area|b|base|basefont|bdo|biq|blockquote|body|br|button|coption|center|cite|code|col|colgroup|dd|del|dir|div|dfn|dl|dt|em|fieldset|font|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|hr|html|i|iframe|img|input|ins|kbd|label|legend|li|link|map|menu|meta|noframes|noscript|object|ol|optgroup|option|p|param|pre|q|s|samp|script|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|u|ul|var)([&amp;gt;|\s]+)/gi</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>m<span style="color: #339933;">,</span> m1<span style="color: #339933;">,</span> m2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">return</span> m.<span style="color: #660066;">toLocaleLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//为属性加回引号，并将属性名替换为小写的正则表达式</span>
str_html <span style="color: #339933;">=</span> str_html.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/\s(\w+)=&quot;?([^&quot;&amp;gt;]+)&quot;?([&amp;gt;|\s]+)/gi</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>m<span style="color: #339933;">,</span> m1<span style="color: #339933;">,</span> m2<span style="color: #339933;">,</span> m3<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">' '</span> <span style="color: #339933;">+</span> m1.<span style="color: #660066;">toLocaleLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'=&quot;'</span> <span style="color: #339933;">+</span> m2 <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&quot;'</span> <span style="color: #339933;">+</span> m3<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>不过IE的恶劣行径还没有完，<strong>li闭合标签丢失问题</strong>让我很想抽MS开发人员巴掌，大小写也就罢了，标签丢失可是大问题，这应该属于故障级BUG，为什么从IE6到IE7都没有修正呢？再扇他们两个巴掌。为此不得不再多写一个正则表达式：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p320code6'); return false;">View Code</a> JAVASCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3206"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p320code6"><pre class="javascript" style="font-family:monospace;">str <span style="color: #339933;">=</span> str.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">/</span><span style="color: #009900;">&#40;</span>\<span style="color: #339933;">/|</span>a<span style="color: #339933;">|</span>abbr<span style="color: #339933;">|</span>acronym<span style="color: #339933;">|</span>address<span style="color: #339933;">|</span>applet<span style="color: #339933;">|</span>area<span style="color: #339933;">|</span>b<span style="color: #339933;">|</span>base<span style="color: #339933;">|</span>basefont<span style="color: #339933;">|</span>bdo<span style="color: #339933;">|</span>biq<span style="color: #339933;">|</span>blockquote<span style="color: #339933;">|</span>body<span style="color: #339933;">|</span>br<span style="color: #339933;">|</span>button<span style="color: #339933;">|</span>coption<span style="color: #339933;">|</span>center<span style="color: #339933;">|</span>cite<span style="color: #339933;">|</span>code<span style="color: #339933;">|</span>col<span style="color: #339933;">|</span>colgroup<span style="color: #339933;">|</span>dd<span style="color: #339933;">|</span>del<span style="color: #339933;">|</span>dir<span style="color: #339933;">|</span>div<span style="color: #339933;">|</span>dfn<span style="color: #339933;">|</span>dl<span style="color: #339933;">|</span>dt<span style="color: #339933;">|</span>em<span style="color: #339933;">|</span>fieldset<span style="color: #339933;">|</span>font<span style="color: #339933;">|</span>form<span style="color: #339933;">|</span>frame<span style="color: #339933;">|</span>frameset<span style="color: #339933;">|</span>h1<span style="color: #339933;">|</span>h2<span style="color: #339933;">|</span>h3<span style="color: #339933;">|</span>h4<span style="color: #339933;">|</span>h5<span style="color: #339933;">|</span>h6<span style="color: #339933;">|</span>head<span style="color: #339933;">|</span>hr<span style="color: #339933;">|</span>html<span style="color: #339933;">|</span>i<span style="color: #339933;">|</span>iframe<span style="color: #339933;">|</span>img<span style="color: #339933;">|</span>input<span style="color: #339933;">|</span>ins<span style="color: #339933;">|</span>kbd<span style="color: #339933;">|</span>label<span style="color: #339933;">|</span>legend<span style="color: #339933;">|</span>link<span style="color: #339933;">|</span>map<span style="color: #339933;">|</span>menu<span style="color: #339933;">|</span>meta<span style="color: #339933;">|</span>noframes<span style="color: #339933;">|</span>noscript<span style="color: #339933;">|</span>object<span style="color: #339933;">|</span>optgroup<span style="color: #339933;">|</span>option<span style="color: #339933;">|</span>p<span style="color: #339933;">|</span>param<span style="color: #339933;">|</span>pre<span style="color: #339933;">|</span>q<span style="color: #339933;">|</span>s<span style="color: #339933;">|</span>samp<span style="color: #339933;">|</span>script<span style="color: #339933;">|</span>select<span style="color: #339933;">|</span>small<span style="color: #339933;">|</span>span<span style="color: #339933;">|</span>strike<span style="color: #339933;">|</span>strong<span style="color: #339933;">|</span>style<span style="color: #339933;">|</span>sub<span style="color: #339933;">|</span>sup<span style="color: #339933;">|</span>table<span style="color: #339933;">|</span>tbody<span style="color: #339933;">|</span>td<span style="color: #339933;">|</span>textarea<span style="color: #339933;">|</span>tfoot<span style="color: #339933;">|</span>th<span style="color: #339933;">|</span>thead<span style="color: #339933;">|</span>title<span style="color: #339933;">|</span>tr<span style="color: #339933;">|</span>tt<span style="color: #339933;">|</span>u<span style="color: #339933;">|</span>var<span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span>\t\r\n\s<span style="color: #009900;">&#93;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>以上均为完成项目为首要目标，对问题没有深究，尤其是IE中不能插入本文档流以外的DOM节点，不知道是什么原因，有ET路过的时候希望能留下点什么。</p>
<p><a class="sample-link" title="How to pass dom nodes to parent document" href="http://fuhei.net/laboratories/20090707-sample.html">本文例程</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fuhei.net/2009/07/how-to-pass-dom-nodes-to-parent-document/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
