<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/extend-Array-prototype-indexOf-problem/</link>
<title><![CDATA[扩展Array.prototype.indexOf而引发的问题]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[前端开发]]></category>
<pubDate>Wed, 10 Nov 2010 03:22:22 +0000</pubDate> 
<guid>https://www.heckjj.com/extend-Array-prototype-indexOf-problem/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 微软雅黑;">因为Array没有indexOf方法，这样在一个数组中查找某个元素的索引时比较麻烦，为了调用方便，于是通过prototype原型扩展了Array.prototype.indexOf()，这样用起来就比较方便了。<br/>Array.prototype.indexOf = function(item) &#123;<br/>for (var i = 0; i &lt; this.length; i++) &#123;<br/>if (this[i] == item)<br/>return i;<br/>&#125;<br/>return -1;<br/>&#125; <br/><br/>用的时候直接<br/>var arr=[1,2,3,4,5];<br/>var index=arr.indexOf(1); //index==0<br/><br/>扩展了以后，用起来很爽很方便，一片和谐景象，但是某次是遍历数组元素的时候，使用for..in..循环，引发了其他的问题，打破了这个和谐的氛围。<br/>var a=[&quot;张飞&quot;,&quot;关羽&quot;,&quot;刘备&quot;,&quot;吕布&quot;];<br/>for(var p in a)&#123;<br/>&nbsp;&nbsp;document.write(p+&quot;=&quot;+a[p]+&quot;&lt;br/&gt;&quot;);<br/>&#125;</span><span style="font-family: 微软雅黑;"><br/><br/>本来想输出这四个人的名字，结果输出的是什么呢？<br/><br/>输出的居然是：</span><textarea name="code" class="js" rows="15" cols="100">
//0=张飞
//1=关羽
//2=刘备
//3=吕布
//indexOf=function(item)
&#123;
&nbsp;&nbsp;for (var i = 0; i &lt; this.length; i++)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;if (this[i] == item) return i;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;return -1;
&#125;</textarea><br/><span style="font-family: 微软雅黑;"><br/>除了把名字打出来以外，还额外输出了自己扩展的方法indexOf，但是令人疯狂的是，firefox却是“正常”的，只有四个人的人名，为什么会这样？<br/>输出indexOf，自己扩展的，可以理解，毕竟for..in是遍历一个对象的所有用户定义的属性或者一个数组的所有元素。那么firefox为什么不会？后来查了资料才明白，Array在javascript1.6版本已经支持Array.indexOf()，而我用的firefox是3.5版本，已经支持javascript1.8了，indexOf是其Array本身固有的方法了。<br/><br/>而IE，即使我用的是IE8，也才支持到javascript1.3版本。所以IE8认为indexOf是“用户定义的属性”，而firefox认为是自己原生支持的固有的属性。真的是这样吗？做个实验，把indexOf更名为myIndexOf，再试试，结果IE和firefox都输出myIndexOf，证明前面的观点是正确。那么又来了个问题，我扩展indexOf很久了，现在不少项目的代码都已经在使用这个方法，而现在我非要使用for..in输出数组本身的元素，不要其他我自己扩展到俄方法，怎么办？<br/><br/>好在javascript提供了hasOwnProperty方法。<br/>看一下其描述：<br/>Every object descended from Object inherits the hasOwnProperty method. This method can be used to determine whether an object has the specified property as a direct property of that object; unlike the in operator, this method does not check down the object’s prototype chain<br/><br/>看描述，就是我们想要的东西。在for…in..里做个 判断就OK了</span><textarea name="code" class="js" rows="15" cols="100">
if(a.hasOwnProperty(p))&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.write(p+&quot;=&quot;+a[p]+&quot;&lt;br/&gt;&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;</textarea><br/><br/><span style="font-family: 微软雅黑;">另外，附上hasOwnProperty用法示例，来源于互联网：</span><textarea name="code" class="js" rows="15" cols="100">
function Book(title, author) &#123;
&nbsp;&nbsp; this.title = title;
&nbsp;&nbsp; this.author = author;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp; Book.prototype.price = 9.99;
&nbsp;&nbsp; Object.prototype.copyright = &quot;idcpw.com&quot;;
&nbsp;&nbsp; var myBook = new Book(&quot;JavaScript Tutorials&quot;, &quot;Jony Heck&quot;);
&nbsp;&nbsp; // Dumping built-in properties at the base prototype level
&nbsp;&nbsp; document.writeln(&quot;&#92;nObject.prototype&#039;s built-in properties:&quot;);
&nbsp;&nbsp; dumpProperty(Object.prototype, &quot;constructor&quot;);
&nbsp;&nbsp; dumpProperty(Object.prototype, &quot;hasOwnProperty&quot;);
&nbsp;&nbsp; dumpProperty(Object.prototype, &quot;isPrototypeOf&quot;);
&nbsp;&nbsp; dumpProperty(Object.prototype, &quot;toString&quot;);
&nbsp;&nbsp; dumpProperty(Object.prototype, &quot;valueOf&quot;);
&nbsp;&nbsp; dumpProperty(Object.prototype, &quot;copyright&quot;);
&nbsp;&nbsp; // Dumping built-in properties at the my prototype level
&nbsp;&nbsp; document.writeln(&quot;&#92;n==================&#92;nBook.prototype&#039;s built-in properties:&quot;);
&nbsp;&nbsp; dumpProperty(Book.prototype, &quot;constructor&quot;);
&nbsp;&nbsp; dumpProperty(Book.prototype, &quot;hasOwnProperty&quot;);
&nbsp;&nbsp; dumpProperty(Book.prototype, &quot;isPrototypeOf&quot;);
&nbsp;&nbsp; dumpProperty(Book.prototype, &quot;toString&quot;);
&nbsp;&nbsp; dumpProperty(Book.prototype, &quot;valueOf&quot;);
&nbsp;&nbsp; dumpProperty(Book.prototype, &quot;copyright&quot;);
&nbsp;&nbsp; // Dumping built-in properties at the object level
&nbsp;&nbsp; document.writeln(&quot;&#92;n==================&#92;nmyBook&#039;s built-in properties:&quot;);
&nbsp;&nbsp; dumpProperty(myBook, &quot;constructor&quot;);
&nbsp;&nbsp; dumpProperty(myBook, &quot;hasOwnProperty&quot;);
&nbsp;&nbsp; dumpProperty(myBook, &quot;isPrototypeOf&quot;);
&nbsp;&nbsp; dumpProperty(myBook, &quot;toString&quot;);
&nbsp;&nbsp; dumpProperty(myBook, &quot;valueOf&quot;);
&nbsp;&nbsp; dumpProperty(myBook, &quot;copyright&quot;);

function dumpProperty(object, property) &#123;
&nbsp;&nbsp; var inheritance;
&nbsp;&nbsp; if (object.hasOwnProperty(property))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inheritance = &quot;Local&quot;;
&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inheritance = &quot;Inherited&quot;;
&nbsp;&nbsp; document.writeln(property+&quot;: &quot;+inheritance+&quot;: &quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+object[property]);
&#125;</textarea><br/><span style="font-family: 微软雅黑;">查看浏览器支持javascript到哪个版本：</span><textarea name="code" class="js" rows="15" cols="100">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&nbsp;&nbsp;&lt;title&gt;浏览器的JavaScript版本支持测试&lt;/title&gt;
 &lt;/head&gt;
 &lt;body&gt;
&nbsp;&nbsp; &lt;script language=&quot;JavaScript&quot;&gt;
&nbsp;&nbsp; //document.write(&quot;您的浏览器类型：&quot;+navigator.appName+&quot;&lt;br/&gt;&quot;);
&nbsp;&nbsp; //document.write(&quot;浏览器版本：&quot;+navigator.appVersion+&quot;&lt;br/&gt;&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//支持JavaScript1.0的浏览器才能够执行该脚本
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.write(&#039;该浏览器支持JavaScript1.0&lt;br/&gt;&#039;);
&nbsp;&nbsp;&lt;/script&gt;
&nbsp;&nbsp;&lt;script language=&quot;JavaScript1.1&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//支持JavaScript1.1的浏览器才能够执行该脚本
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.write(&#039;该浏览器支持JavaScript1.1&lt;br/&gt;&#039;);
&nbsp;&nbsp;&lt;/script&gt;
&nbsp;&nbsp;&lt;script language=&quot;JavaScript1.2&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//支持JavaScript1.2的浏览器才能够执行该脚本
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.write(&#039;该浏览器支持JavaScript1.2&lt;br/&gt;&#039;);
&nbsp;&nbsp;&lt;/script&gt;
&nbsp;&nbsp;&lt;script language=&quot;JavaScript1.3&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//支持JavaScript1.3的浏览器才能够执行该脚本
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.write(&#039;该浏览器支持JavaScript1.3&lt;br/&gt;&#039;);
&nbsp;&nbsp;&lt;/script&gt;
&nbsp;&nbsp;&lt;script language=&quot;JavaScript1.4&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//支持JavaScript1.4的浏览器才能够执行该脚本
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.write(&#039;该浏览器支持JavaScript1.4&lt;br/&gt;&#039;);
&nbsp;&nbsp;&lt;/script&gt;
&nbsp;&nbsp;&lt;script language=&quot;JavaScript1.5&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//支持JavaScript1.5的浏览器才能够执行该脚本
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.write(&#039;该浏览器支持JavaScript1.5&lt;br/&gt;&#039;);
&nbsp;&nbsp;&lt;/script&gt;
&nbsp;&nbsp;&lt;script language=&quot;JavaScript1.6&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//支持JavaScript1.6的浏览器才能够执行该脚本
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.write(&#039;该浏览器支持JavaScript1.6&lt;br/&gt;&#039;);
&nbsp;&nbsp;&lt;/script&gt;
&nbsp;&nbsp;&lt;script&nbsp;&nbsp; language=&quot;JavaScript1.7&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//支持JavaScript1.7的浏览器才能够执行该脚本
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.write(&#039;该浏览器支持JavaScript1.7&lt;br/&gt;&#039;);
&nbsp;&nbsp;&lt;/script&gt;
&nbsp;&nbsp;&lt;script language=&quot;JavaScript1.8&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//支持JavaScript 1.8的浏览器才能够执行该脚本
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.write(&#039;该浏览器支持JavaScript1.8&lt;br/&gt;&#039;);
&nbsp;&nbsp;&lt;/script&gt;
&nbsp;&nbsp;&lt;script language=&quot;JavaScript1.9&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//支持JavaScript1.9的浏览器才能够执行该脚本
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.write(&#039;该浏览器支持JavaScript1.9&lt;br/&gt;&#039;);
&nbsp;&nbsp;&lt;/script&gt;
 &lt;/body&gt;
&lt;/html&gt;</textarea><br/>Tags - <a href="https://www.heckjj.com/tags/array/" rel="tag">array</a> , <a href="https://www.heckjj.com/tags/firefox/" rel="tag">firefox</a> , <a href="https://www.heckjj.com/tags/ie/" rel="tag">ie</a> , <a href="https://www.heckjj.com/tags/javascript/" rel="tag">javascript</a> , <a href="https://www.heckjj.com/tags/prototype/" rel="tag">prototype</a> , <a href="https://www.heckjj.com/tags/%25E5%2585%25BC%25E5%25AE%25B9/" rel="tag">兼容</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/css-table-tr-border-html/</link>
<title><![CDATA[css中指定table的tr边框]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[前端开发]]></category>
<pubDate>Tue, 21 Sep 2010 07:56:14 +0000</pubDate> 
<guid>https://www.heckjj.com/css-table-tr-border-html/</guid> 
<description>
<![CDATA[ 
	<span style="font-family: 微软雅黑;">你可能发现在css中指定的tr边框不起作用，而如果指定td的边框又会有间断的现象出现。这种情况下可以参照下面的代码：</span><br/><textarea name="code" class="css" rows="15" cols="100">
 table &#123; border-collapse:collapse; &#125;&nbsp;&nbsp;
 td &#123; border-bottom:1px solid #0f0; &#125;
</textarea><br/><span style="font-family: 微软雅黑;">对于某些浏览器，在设定了border-collapse为collapse之后也可以直接指定tr的边框。</span><br/>Tags - <a href="https://www.heckjj.com/tags/web%25E5%25BC%2580%25E5%258F%2591/" rel="tag">web开发</a> , <a href="https://www.heckjj.com/tags/html/" rel="tag">html</a> , <a href="https://www.heckjj.com/tags/css/" rel="tag">css</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/oop-javascript-code-html/</link>
<title><![CDATA[面向对象的JavaScript编程 ]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[前端开发]]></category>
<pubDate>Tue, 21 Sep 2010 06:31:07 +0000</pubDate> 
<guid>https://www.heckjj.com/oop-javascript-code-html/</guid> 
<description>
<![CDATA[ 
	<span style="font-family: 微软雅黑;"><span style="font-size: 14px;"><strong><span style="color: #4169E1;">一、引言</span></strong></span><br/><br/> 这么久以来，JavaScript在Web开发中一直处于被忽视的地位，甚至有相当一部分开发人员对它产生了误解，认为JavaScript只不过是用来完成一些花哨功能的雕虫小技。网络上广为流传的低质量的JavaScript代码对此也起到了推波助澜的作用...很多应用中JavaScript都采用了面向过程的编程方式，代码的可扩展性不好，复制粘贴的代码比比皆是...<br/>&nbsp;&nbsp;随着Ajax等技术的广泛使用，YUI、Prototype等对JavaScript的应用可谓是淋漓尽致、出神入化。人们才发现原来JavaScript可以实现如此强大的功能，具备如此优雅的架构...<br/><span style="font-size: 14px;"><strong><span style="color: #4169E1;">二、准备</span></strong></span><br/><br/><strong>1、概念</strong><br/><br/>JavaScript是一种弱类型语言。包括：<br/>基本类型：数字Number，字符串String，布尔值Boolean；<br/>复合类型：对象Object，数组Array；<br/>工具类型：全局对象Global，日期Date，数学对象Math，正则表达式RegExp，错误对象Error；<br/>特殊类型：函数Function。<br/><br/>这里我只想说两点：<br/>1）基本数据类型的包装对象<br/>每一个基本数据类型都有一个对应的对象类。可以灵活地实现类型转换。简单地说，JavaScript不仅支持数字、字符串和布尔值这些数据类型，还支持Number、String、Boolean类，这些类是基本数据类型的包装(wrapper)。<br/>例子：</span><textarea name="code" class="js" rows="15" cols="100">
var s="some string";
var len=s.length;</textarea><br/><span style="font-family: 微软雅黑;">这里，s保存了一个字符串，原始的字符串值是不会改变的。一个新的String对象被创建了，实现了对长度属性的访问，之后它就被销毁了。</span><span style="font-family: 微软雅黑;"><br/>其它例子：</span><textarea name="code" class="js" rows="15" cols="100">
var a="some string";
var b=new String("some string");
var c=["a","b","c"];
var d=new Array("a","b","c");

alert(typeof a);//string
alert(a instanceof String);//false
alert(a instanceof Object);//false

alert(typeof b);//object
alert(b instanceof String);//true
alert(b instanceof Object);//true

alert(typeof c);//object
alert(c instanceof Array);//true
alert(c instanceof Object);//true

alert(typeof d);//object
alert(d instanceof Array);//true
alert(d instanceof Object);//true</textarea><br/><br/><span style="font-family: 微软雅黑;"><strong>2）Function类型</strong><br/>做为JavaScript的一种特殊类型，我们将看到函数在面向对象编程中起到了非常关键的作用。<br/><br/>2.值和引用<br/><br/>类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 复制&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;传递&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;比较<br/>数字&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;值<br/>布尔值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;值<br/>字符串&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不可变的&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不可变的&nbsp;&nbsp;&nbsp;&nbsp; 值<br/>对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用<br/>函数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用<br/>数组&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;引用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用<br/> <br/>例子：</span><textarea name="code" class="js" rows="15" cols="100">
var s1="hello";
var s2="hell"+"o";
alert(s1==s2);//true

var d1=new Date();
var d2=new Date();
alert(d1==d2);//false</textarea><br/><br/><span style="font-family: 微软雅黑;">3.this<br/>在构造函数中，指代新创建的对象实例；<br/>在对象的方法被调用时，指代调用该方法的对象实例。<br/><br/>4.arguments<br/>arguments属性由解释器创建，用于访问函数对象的每一个参数。<br/><br/>5.callee,caller<br/>arguments的callee属性获取对正在执行的Function对象的引用；<br/>Function对象的caller属性获取正在调用当前函数的父函数对象。<br/><br/>6.apply,call<br/>两者都是将函数绑定到其它对象上执行的，区别在于调用方式：</span><textarea name="code" class="js" rows="15" cols="100">
apply([thisObj[,argArray]])
call([thisObj[,arg1[,arg2[,[,.argN]]]]])</textarea><br/><br/><span style="font-family: 微软雅黑;">7.匿名函数</span><textarea name="code" class="js" rows="15" cols="100">
(function(a,b)&#123;
 return a+b;
 &#125;)(1,1);
等价于：
function f(a,b)&#123;
 return a+b;
&#125;
f(1,1);</textarea><br/><br/><span style="font-family: 微软雅黑;">8.null,undefined<br/>null是JavaScript的关键字，表示空值。可以看作Object类型的一个特殊值。<br/>undefined不是关键字，它是一个全局变量，使用了未定义变量、变量未赋值、void运算符，都会返回“undefined”。<br/><br/>9.constructor<br/>从JavaScript1.1开始，每个对象都具有一个constructor属性，它引用的是用来初始化该对象的构造函数。<br/><br/>10.prototype<br/>JavaScript1.1引入了原型对象的概念，每一个对象都有一个原型对象，对象可以继承它的原型对象的所有属性和方法。<br/>要为一个对象的类制定原型对象，需要将构造函数的prototype属性设置为指定的对象。之后，如果用构造函数初始化对象时，会自动将指定的对象作为新创建对象的原型对象。<br/><br/>注意：<br/>1）使用原型对象可以减少每个继承对象的内存需求量；<br/>2）即使属性是在对象被创建后才加到它的原型对象中的，对象也能够继承这些后定义的属性。<br/>3）当调用一个对象的一个属性时，先在该对象定义内查找该属性，如果没有该属性才到该对象的原型对象中查找，依此类推。<br/><br/><span style="font-size: 14px;"><strong><span style="color: #4169E1;">三、实现</span></strong></span><br/><br/>在面向对象编程中，我们可以把过程编程中的一个个function看作一个个独立定义的类，函数名即为类名。<br/><strong>1.例子：Circle类</strong></span><br/><textarea name="code" class="js" rows="15" cols="100">
function Circle(radius)&#123;
 //实例变量
 this.r=radius;
&#125;

//静态变量
Circle.PI=3.14159;

//实例方法
Circle.prototype.area=function()&#123;
 return Circle.PI*this.r*this.r;
&#125;

//静态方法
Circle.max=function(a,b)&#123;
 if(a.r>=b.r)&#123;
&nbsp;&nbsp;return a;
 &#125;
 else&#123;
&nbsp;&nbsp;return b;
 &#125;
&#125;

//调用
var a=new Circle(2);
var b=new Circle(3);
var c=a.area();
var d=Circle.max(a,b);</textarea><br/><span style="font-family: 微软雅黑;">2.继承<br/><br/><br/>1）一种继承方式<br/></span><textarea name="code" class="js" rows="15" cols="100">
//这里我们将CircleMore类的prototype指向了一个Circle类实例，
//并增加了circumference方法。
function CircleMore(radius)&#123;
 this.r=radius;
&#125;

CircleMore.prototype=new Circle(0);

CircleMore.prototype.circumference=function()&#123;
 return 2*Circle.PI*this.r;
&#125;</textarea><br/><br/><span style="font-family: 微软雅黑;">这样能够实现对Circle的继承，但是这里存在一点问题：我们直接把CircleMore类的prototype指向了一个Circle类实例，这样就覆盖了JavaScript提供的原型对象，而且抛弃了给定的 constructor属性，这样CircleMore的constructor属性就指向了父类Circle的constructor属性。而且这种方式总是使人感觉怪怪的。<br/><br/>2)Ajax架构Prototype（区别前面提到的prototype哦）的继承方式<br/></span><textarea name="code" class="js" rows="15" cols="100">
//Prototype框架为Object对象定义了extend方法，
//将source的属性和方法复制到了destination。
Object.extend = function(destination, source) &#123;
&nbsp;&nbsp;for (var property in source)
&nbsp;&nbsp;&nbsp;&nbsp;destination[property] = source[property];
&nbsp;&nbsp;return destination;
&#125;;

//调用
function ParentClass()&#123;...&#125;
function SubClass()&#123;&#125;
SubClass.prototype=Object.extend(&#123;
 newMethod:function()&#123;
&nbsp;&nbsp;alert("newMethod");
 &#125;
&#125;,
ParentClass.prototype
);</textarea><span style="font-family: 微软雅黑;"><br/><br/>3）如果这里对两个参数交换位置，则是对原对象的开展。<br/>例子：通过extend方法对String对象进行了扩展<br/></span><textarea name="code" class="js" rows="15" cols="100">
Object.extend(String.prototype,&#123;
 newMethod:function()&#123;
&nbsp;&nbsp;alert("newMethod");
 &#125;
&#125;);</textarea><br/><span style="font-family: 微软雅黑;">3.多态</span><br/><textarea name="code" class="js" rows="15" cols="100">
Object.extend = function(destination, source) &#123;
&nbsp;&nbsp;for (var property in source)
&nbsp;&nbsp;&nbsp;&nbsp;destination[property] = source[property];
&nbsp;&nbsp;return destination;
&#125;

//基类
function base()&#123;&#125;
base.prototype=&#123;
 initialize:function()&#123;
&nbsp;&nbsp;this.oninit();//调用了一个虚方法
 &#125;
&#125;

//子类SubClassA
function SubClassA()&#123;&#125;
SubClassA.prototype=Object.extend(&#123;
 //...其它属性方法
 prop:"SubClassA",
 oninit:function()&#123;
&nbsp;&nbsp;alert(this.prop);
 &#125;&#125;,
 base.prototype
&#125;

//子类SubClassB
function SubClassB()&#123;&#125;
SubClassB.prototype=Object.extend(&#123;
 //...其它属性方法
 prop:"SubClassB",
 oninit:function()&#123;
&nbsp;&nbsp;alert(this.prop);
 &#125;&#125;,
 base.prototype
&#125;

//调用
var a=new SubClassA();
var b=new SubClassB();</textarea><br/><span style="font-family: 微软雅黑;"><br/><span style="color: #4169E1;">a.initialize();//输出"SubClassA"<br/>b.initialize();//输出"SubClassB"</span><br/><br/><span style="font-size: 14px;"><strong><span style="color: #4169E1;">四、JavaScript与设计模式</span></strong></span><br/><br/>1.Singleton</span><br/><textarea name="code" class="js" rows="15" cols="100">
function Singleton()&#123;
 if(Singleton.caller!=Singleton.getInstance)&#123;
&nbsp;&nbsp;throw new Error("Can not new Singleton instance!");
 &#125;
 this.prop="some string";
 //...
&#125;

Singleton._instance=null;

Singleton.getInstance=function()&#123;
 if(this._instance==null)&#123;
&nbsp;&nbsp;this._instance=new Singleton();
 &#125;
 return this._instance;
&#125;

var a=Singleton.getInstance();
var b=Singleton.getInstance();
b.prop="another string";
alert(a.prop);//"another string"
alert(b.prop);//"another string"

2.Factory

function XMLHttpFactory()&#123;&#125;

XMLHttpFactory.createXMLHttp=function()&#123;
 if(...)&#123;
&nbsp;&nbsp;return new XMLHttpRequest();
 &#125;
 else if(...)&#123;
&nbsp;&nbsp;return new ActiveXObject("MSXML2.XMLHttp");
 &#125;
 ...
&#125;

var xmlhttp=XMLHttpFactory.createXMLHttp();</textarea><br/><span style="font-family: 微软雅黑;"><span style="font-size: 14px;"><strong><span style="color: #4169E1;">五、备注</span></strong></span><br/><br/>参考资料：<br/>《JavaScript权威指南(第三版)》 中国电力出版社<br/>《JavaScript高级程序设计与应用实例》 人民邮电出版社<br/> Prototype 1.6.0<br/> YUI 2.3.1</span><br/>Tags - <a href="https://www.heckjj.com/tags/javascript/" rel="tag">javascript</a> , <a href="https://www.heckjj.com/tags/%25E9%259D%25A2%25E5%2590%2591%25E5%25AF%25B9%25E8%25B1%25A1/" rel="tag">面向对象</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/div-parent-container-self-opening/</link>
<title><![CDATA[如何解决Div父容器不根据内容自动撑开、自适应的问题]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[前端开发]]></category>
<pubDate>Mon, 20 Sep 2010 05:51:32 +0000</pubDate> 
<guid>https://www.heckjj.com/div-parent-container-self-opening/</guid> 
<description>
<![CDATA[ 
	<span style="font-family: 微软雅黑;">Div即父容器不根据内容自适应高度，我们看下面的代码：<br/>程序代码<br/>&lt;div id=&quot;main&quot;&gt;<br/>&lt;div id=&quot;content&quot;&gt;&lt;/div&gt;<br/>&lt;/div&gt;<br/><br/>当Content内容多时，即使main设置了高度100%或auto。在不同浏览器下还是不能完好的自动伸展。内容的高度比较高了，但容器main的高度还是不能撑开。<br/>我们可以通过三种方法来解决这个问题。<br/>一，增加一个清除浮动，让父容器知道高度。请注意，清除浮动的容器中有一个空格。<br/>程序代码&lt;div id=&quot;main&quot;&gt; <br/>&lt;div id=&quot;content&quot;&gt;&lt;/div&gt; <br/>&lt;div style=&quot;font: 0px/0px sans-serif;clear: both;display: block&quot;&gt; &lt;/div&gt; <br/>&lt;/div&gt;</span><span style="font-family: 微软雅黑;"><br/><br/>二，增加一个容器，在代码中存在，但在视觉中不可见。<br/>程序代码&lt;div id=&quot;main&quot;&gt; <br/>&lt;div id=&quot;content&quot;&gt;&lt;/div&gt; <br/>&lt;div style=&quot;height:1px; margin-top:-1px;clear: both;overflow:hidden;&quot;&gt;&lt;/div&gt;<br/>&lt;/div&gt; <br/><br/>三，增加一个BR并设置样式为clear:both。<br/>程序代码&lt;div id=&quot;main&quot;&gt; <br/>&lt;div id=&quot;content&quot;&gt;&lt;/div&gt; <br/>&lt;br style=&quot;clear:both;&quot; /&gt;<br/>&lt;/div&gt;&nbsp;&nbsp; </span><br/>Tags - <a href="https://www.heckjj.com/tags/div%25E8%2587%25AA%25E5%258A%25A8%25E6%2592%2591%25E5%25BC%2580/" rel="tag">div自动撑开</a> , <a href="https://www.heckjj.com/tags/div%25E7%2588%25B6%25E5%25AE%25B9%25E5%2599%25A8/" rel="tag">div父容器</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/css-bug-compatible-html/</link>
<title><![CDATA[浏览器CSS BUG兼容汇总]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[前端开发]]></category>
<pubDate>Fri, 10 Sep 2010 13:08:19 +0000</pubDate> 
<guid>https://www.heckjj.com/css-bug-compatible-html/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 微软雅黑;">有关于浏览器CSS BUG的一些兼容问题和具体案例总结如下，供自己以后查看，也分享给大家，以便大家节约学习和工作的时间，如果你有什么好的方法对浏览器兼容方面，那么也请你和大家一起分享下。<br/><br/><strong>1.div的垂直居中问题 </strong><br/>vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字，就垂直居中了。缺点是要控制内容不要换行。<br/><br/><strong>2. margin加倍的问题</strong><br/>设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。 <br/>解决方案是在这个div里面加上display:inline;&nbsp;&nbsp;</span><span style="font-family: 微软雅黑;"><br/>例如： <br/>&lt;#div&gt;<br/>相应的css为</span> <br/><textarea name="code" class="css" rows="15" cols="100">#IamFloat 
&#123; 
&nbsp;&nbsp; float:left; margin:5px;/*IE下理解为10px*/ 
&nbsp;&nbsp; display:inline;/*IE下再理解为5px*/ 
&#125;</textarea><br/><strong>3.浮动ie产生的双倍距离</strong><br/><textarea name="code" class="css" rows="15" cols="100">#box
&#123; 
&nbsp;&nbsp; float:left; width:100px; margin:0 0 0 100px; //这种情况之下IE会产生200px的距离 display:inline; //使浮动忽略 
&#125; </textarea><br/>这里细说一下block与inline两个元素： <br/>block元素的特点是,总是在新行上开始,高度,宽度,行高,边距都可以控制(块元素); <br/>Inline元素的特点是,和其他元素在同一行上,不可控制(内嵌元素);<textarea name="code" class="css" rows="15" cols="100">&nbsp;&nbsp;
#box 
&#123; 
&nbsp;&nbsp;&nbsp;&nbsp;display:block; //可以为内嵌元素模拟为块元素 
&nbsp;&nbsp;&nbsp;&nbsp;display:inline; //实现同一行排列的效果 
&nbsp;&nbsp;&nbsp;&nbsp;diplay:table; 
&#125;</textarea><br/><strong>4 IE与宽度和高度的问题 </strong><br/>IE 不认得min-这个定义，但实际上它把正常的width和height当作有min的情况来使。这样问题就大了，如果只用宽度和高度，正常的浏览器里这两 个值就不会变，如果只用min-width和min-height的话，IE下面根本等于没有设置宽度和高度。&nbsp;&nbsp;&nbsp;&nbsp; <br/>比如要设置背景图片，这个宽度是比较重要的。 <br/>要解决这个问题，可以这样：<textarea name="code" class="css" rows="15" cols="100">&nbsp;&nbsp;&nbsp;&nbsp; 
#box&#123; width: 80px; height: 35px;&#125; 
html&gt;body #box 
&#123; 
&nbsp;&nbsp; width: auto; height: auto; min-width: 80px; min-height: 35px; 
&#125;</textarea><br/><strong>5.页面的最小宽度&nbsp;&nbsp; </strong>&nbsp;&nbsp;<br/>min -width是个非常方便的CSS命令，它可以指定元素最小也不能小于某个宽度，这样就能保证排版一直正确。但IE不认得这个，而它实际上把width当 做最小宽度来使。为了让这一命令在IE上也能用，可以把一个&lt;div&gt; 放到 &lt;body&gt; 标签下，然后为div指定一个类, 然后CSS这样设计： <br/><textarea name="code" class="css" rows="15" cols="100">
#container
&#123;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;min-width: 600px; 
&nbsp;&nbsp;&nbsp;&nbsp;width:e-xpression(document.body.clientWidth &lt; 600? &quot;600px&quot;: &quot;auto&quot; );
&#125;</textarea>&nbsp;&nbsp;&nbsp;&nbsp; <br/>第一个min-width是正常的；但第2行的width使用了Javascript，这只有IE才认得，这也会让你的HTML文档不太正规。它实际上通过Javascript的判断来实现最小宽度。<br/><br/><strong>6.DIV浮动IE文本产生3象素的bug&nbsp;&nbsp;&nbsp;&nbsp;</strong> <br/>左边对象浮动，右边采用外补丁的左边距来定位，右边对象内的文本会离左边有3px的间距.<textarea name="code" class="css" rows="15" cols="100">&nbsp;&nbsp;&nbsp;&nbsp; 
#box&#123; float:left; width:800px;&#125;&nbsp;&nbsp;&nbsp;&nbsp;
#left&#123; float:left; width:50%;&#125;&nbsp;&nbsp;&nbsp;&nbsp;
#right&#123; width:50%;&#125;&nbsp;&nbsp;&nbsp;&nbsp;
*html #left&#123; margin-right:-3px; //这句是关键&#125;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;div &gt; 
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div &gt;&lt;/div&gt; 
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div &gt;&lt;/div&gt; 
&lt;/div&gt;</textarea><br/><strong>7.IE捉迷藏的问题&nbsp;&nbsp;&nbsp;&nbsp;</strong> <br/>当div应用复杂的时候每个栏中又有一些链接，DIV等这个时候容易发生捉迷藏的问题。有些内容显示不出来，当鼠标选择这个区域是发现内容确实在页面。 <br/>解决办法： <br/>对#layout使用line-height属性 或者给#layout使用固定高和宽。页面结构尽量简单。<br/><br/><strong>8.float的div闭合;清除浮动;自适应高度; </strong>&nbsp;&nbsp; <br/>例如：&lt;#div &gt;&lt;#div &gt;&lt;#div NOTfloatC” &gt;这里的NOTfloatC并不希望继续平移，而是希望往下排。(其中floatA、floatB的属性已经设置为 float:left;)&nbsp;&nbsp; 这段代码在IE中毫无问题，问题出在FF。原因是NOTfloatC并非float标签，必须将float标签闭合。在 &lt;#div &lt;#div &lt; #div 并且将clear这种样式定义为为如下即可： .clear&#123; clear:both;&#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>作为外部 wrapper 的 div 不要定死高度 <br/>为了让高度能自动适应，要在wrapper里面加上overflow:hidden; 当包含float的 box的时候，高度自动适应在IE下无效，这时候应该触发IE的layout私有属性(万恶的IE啊！)用zoom:1;可以做到，这样就达到了兼容。&nbsp;&nbsp;&nbsp;&nbsp;<br/>例如某一个wrapper如下定义：<textarea name="code" class="css" rows="15" cols="100">.colwrapper&#123; overflow:hidden; zoom:1; margin:5px auto;&#125;</textarea><br/><br/><strong>9.对于排版 </strong><br/>我们用得最多的css描述可能就是float:left.有的时候我们需要在n栏的float div后面做一个统一的背景, <br/>譬如:&nbsp;&nbsp; &lt;div &lt;div &lt;div &lt;div &lt;/div&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>比如我们要将page的背景设置成蓝色,以达到所有三栏的背景颜色是蓝色的目的, <br/>但是我们会发现随着left center right的向下拉长,而 page居然保存高度不变,问题来了, <br/>原因在于page不是float属性,而我们的page由于要居中,不能设置成float, <br/>所以我们应该这样解决:<textarea name="code" class="css" rows="15" cols="100">&nbsp;&nbsp;&nbsp;&nbsp;
&lt;div 
&lt;div style=”float:left;width:100%”&gt;&nbsp;&nbsp; 
&lt;div 
&lt;div 
&lt;div 
&lt;/div&gt;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;/div&gt;</textarea><br/>再嵌入一个float left而宽度是100%的DIV解决之。<br/><br/><strong>10.万能float 闭合(非常重要!)&nbsp;&nbsp;</strong>&nbsp;&nbsp; <br/>关于 clear float 的原理可参见 [How To Clear Floats Without Structural Markup],将以下代码加入Global CSS 中,给需要闭合的div加上 即可,屡试不爽.<textarea name="code" class="css" rows="15" cols="100">&nbsp;&nbsp;&nbsp;&nbsp;
/* Clear Fix */ 
.clearfix:after &#123; content:&quot;.&quot;; display:block; height:0; clear:both; visibility:hidden; &#125;&nbsp;&nbsp;&nbsp;&nbsp;
.clearfix &#123; display:inline-block; &#125;&nbsp;&nbsp;&nbsp;&nbsp; 
/* Hide from IE Mac */&nbsp;&nbsp;&nbsp;&nbsp; 
.clearfix &#123;display:block;&#125;&nbsp;&nbsp;&nbsp;&nbsp;
/* End hide from IE Mac */&nbsp;&nbsp;&nbsp;&nbsp;
/* end of clearfix */&nbsp;&nbsp;&nbsp;&nbsp; 
或者这样设置：.hackbox&#123; display:table; //将对象作为块元素级的表格显示&#125;</textarea><br/><br/><strong>11.高度不适应&nbsp;&nbsp;&nbsp;&nbsp; </strong><br/>高度不适应是当内层对象的高度发生变化时外层高度不能自动进行调节，特别是当内层对象使用margin 或paddign 时。&nbsp;&nbsp;&nbsp;&nbsp; <br/>例：<textarea name="code" class="css" rows="15" cols="100">&nbsp;&nbsp;&nbsp;&nbsp; 
#box &#123;background-color:#eee; &#125;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#box p &#123;margin-top: 20px;margin-bottom: 20px; text-align:center; &#125;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;div &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;p&gt;p对象中的内容&lt;/p&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;/div&gt; </textarea>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>解决方法： <br/>在P对象上下各加2个空的div对象CSS代码： <br/>.1&#123;height:0px;overflow:hidden;&#125;或者为DIV加上border属性。<br/><br/><strong>12 .IE6下为什么图片下有空隙产生 </strong><br/>解决这个BUG的方法也有很多, <br/>可以是改变html的排版, <br/>或者设置img 为display:block <br/>或者设置vertical-align 属性为 vertical-align:top &#124; bottom &#124;middle &#124;text-bottom 都可以解决.<br/><br/><strong>13.如何对齐文本与文本输入框 </strong><br/>加上 vertical-align:middle;&nbsp;&nbsp;<textarea name="code" class="css" rows="15" cols="100"> 
&lt;style type=&quot;text/css&quot;&gt; 
&lt;!-- 
input &#123;width:200px; height:30px;border:1px solid red;vertical-align:middle; &#125; 
--&gt; 
&lt;/style&gt; </textarea><br/><br/><strong>14.web标准中定义id与class有什么区别吗? </strong><br/>一.web标准中是不容许重复ID的,比如 div&nbsp;&nbsp;&nbsp;&nbsp;不容许重复2次,而class 定义的是类,理论上可以无限重复, 这样需要多次引用的定义便可以使用他. <br/>二.属性的优先级问题 ID 的优先级要高于class,看上面的例子 <br/>三.方便JS等客户端脚本,如果在页面中要对某个对象进行脚本操作,那么可以给他定义一个ID,否则只能利用遍历页面元素加上指定特定属性来找到它,这是相对浪费时间资源,远远不如一个ID来得简单.<br/><br/><strong>15. LI中内容超过长度后以省略号显示的方法 </strong><br/>此方法适用与IE与OP浏览器<textarea name="code" class="css" rows="15" cols="100">&nbsp;&nbsp;
&lt;style type=&quot;text/css&quot;&gt; 
&lt;!-- 
li &#123; 
width:200px; 
white-space:nowrap; 
text-overflow:ellipsis; 
-o-text-overflow:ellipsis; 
overflow: hidden;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&#125; 
--&gt; 
&lt;/style&gt; </textarea><br/>16.为什么web标准中IE无法设置滚动条颜色了 <br/>解决办法是 <br/>将body换成html<textarea name="code" class="css" rows="15" cols="100">&nbsp;&nbsp;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt; 
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=gb2312&quot; /&gt; 
&lt;style type=&quot;text/css&quot;&gt; 
&lt;!-- 
html &#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
scrollbar-face-color:#f6f6f6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
scrollbar-highlight-color:#fff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
scrollbar-shadow-color:#eeeeee;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
scrollbar-3dlight-color:#eeeeee;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
scrollbar-arrow-color:#000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
scrollbar-track-color:#fff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
scrollbar-darkshadow-color:#fff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&#125; 
--&gt; 
&lt;/style&gt; </textarea><br/><strong>17.为什么无法定义1px左右高度的容器 </strong><br/>IE6下这个问题是因为默认的行高造成的, 解决的方法也有很多，例如:overflow:hidden &#124; zoom:0.08 &#124; line-height:1px<br/><br/><strong>18.怎么样才能让层显示在FLASH之上呢 </strong><br/>解决的办法是给FLASH设置透明 &lt;param value=&quot;transparent&quot; /&gt;<br/><br/><strong>19.怎样使一个层垂直居中于浏览器中 </strong><br/>这里我们使用百分比绝对定位,与外补丁负值的方法,负值的大小为其自身宽度高度除以2 <br/><textarea name="code" class="css" rows="15" cols="100">&lt;style type=&quot;text/css&quot;&gt; 
&lt;!— 
div 
&#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;top:50%;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;left:50%;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;margin:-100px 0 0 -100px;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;width:200px;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;height:200px;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;border:1px solid red;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&#125; 
--&gt; 
&lt;/style&gt;</textarea><br/><br/>FF与IE<br/>1. Div居中问题 <br/>div设置 margin-left, margin-right 为 auto 时已经居中，IE 不行，IE需要设定body居中，首先在父级元素定义text-algin: center; <br/>这个的意思就是在父级元素内的内容居中。&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>2.链接(a标签)的边框与背景 <br/>a 链接加边框和背景色，需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。 <br/><br/>3.超链接访问过后hover样式就不出现的问题 <br/>被点击访问过的超链接样式不在具有hover和active了，解决方法是改变CSS属性的排列顺序: L-V-H-A <br/><textarea name="code" class="css" rows="15" cols="100">
&lt;style type=&quot;text/css&quot;&gt; 
&lt;!-- 
a:link &#123;&#125; 
a:visited &#123;&#125; 
a:hover &#123;&#125; 
a:active &#123;&#125; 
--&gt; 
&lt;/style&gt;</textarea><br/><br/>4. 游标手指cursor <br/>cursor: pointer 可以同时在 IE FF 中显示游标手指状，hand 仅 IE 可以&nbsp;&nbsp; <br/><br/>5.UL的padding与margin <br/>ul标签在FF中默认是有padding值的, 而在IE中只有margin默认有值, 所以先定义 ul&#123;margin:0;padding:0;&#125;就能解决大部分问题&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>6. FORM标签&nbsp;&nbsp;&nbsp;&nbsp;<br/>这个标签在IE中,将会自动margin一些边距,而在FF中margin则是0, 因此,如果想显示一致,所以最好在css中指定margin和 padding, <br/>针对上面两个问题,我的css中一般首先都使用这样的样式 ul,form&#123;margin:0;padding:0;&#125; 给定义死了,所以后面就不会为这个头疼了.&nbsp;&nbsp; <br/><br/>7. BOX模型解释不一致问题&nbsp;&nbsp;&nbsp;&nbsp;<br/>在FF和IE 中的BOX模型解释不一致导致相差2px <br/>解决方法： <br/>div&#123;margin:30px!important;margin:28px;&#125; 注意这两个 margin的顺序一定不能写反， important这个属性IE不能识别，但别的浏览器可以识别。 所以在IE下其实解释成这样： div &#123;maring:30px;margin:28px&#125;重复定义的话按照最后一个来执行，所以不可以只写margin:xx<textarea name="code" class="css" rows="15" cols="100">px!important;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#box 
&#123; 
width:600px; //for ie6.0&#92; 
- w&#92;idth:500px; //for ff+ie6.0&#125;&nbsp;&nbsp;&nbsp;&nbsp; 
#box&#123; 
width:600px!important //for ff 
width:600px; //for ff+ie6.0 
width /**/:500px; //for ie6.0-&#125;</textarea><br/><br/>8.属性选择器(这个不能算是兼容,是隐藏css的一个bug)&nbsp;&nbsp;&nbsp;&nbsp; <br/>p[id]&#123;&#125;div[id]&#123;&#125;这个对于IE6.0和IE6.0以下的版本都隐藏, FF和OPera作用.属性选择器和子选择器还是有区别的, 子选择器的范围从形式来说缩小了, 属性选择器的范围比较大, 如p[id]中,所有p标签中有id的都是同样式的.&nbsp;&nbsp; <br/><br/>9.最狠的手段 - !important;&nbsp;&nbsp;&nbsp;&nbsp; <br/>如果实在没有办法解决一些细节问题, 可以用这个方法.FF对于”!important”会自动优先解析, 然而IE则会忽略. 如下&nbsp;&nbsp;&nbsp;&nbsp;<br/><textarea name="code" class="css" rows="15" cols="100">.tabd1 
&#123;&nbsp;&nbsp;&nbsp;&nbsp; 
background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style for FF*/&nbsp;&nbsp;&nbsp;&nbsp; 
background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */&#125;</textarea>&nbsp;&nbsp;&nbsp;&nbsp;<br/>值得注意的是，一定要将xxxx !important 这句放置在另一句之上，上面已经提过&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>10.IE,FF的默认值问题&nbsp;&nbsp;&nbsp;&nbsp;<br/>或许你一直在抱怨为什么要专门为IE和FF写不同的CSS，为什么IE这样让人头疼，然后一边写css，一边咒骂那个可恶的M$ IE. 其实对于css的标准支持方面，IE并没有我们想象的那么可恶，关键在于IE和FF的默认值不一样而已，掌握了这个技巧， 你会发现写出兼容FF和IE的css并不是那么困难，或许对于简单的css，你完全可以不用”!important”这个东西了。我们都知道，浏览器在显示网页的时候，都会根据网页的 css样式表来决定如何显示，但是我们在样式表中未必会将所有的元素都进行了具体的描述，当然也没有必要那么做，所以对于那些没有描述的属性，浏览器将采用内置默认的方式来进行显示，譬如文字，如果你没有在css中指定颜色，那么浏览器将采用黑色或者系统颜色来显示，div或者其他元素的背景，如果在 css中没有被指定，浏览器则将其设置为白色或者透明，等等其他未定义的样式均如此。所以有很多东西出现FF和IE显示不一样的根本原因在于它们的默认显示不一样，而这个默认样式该如何显示我知道在w3中有没有对应的标准来进行规定，因此对于这点也就别去怪罪IE了。 <br/><br/>11.为什么FF下文本无法撑开容器的高度 <br/>标准浏览器中固定高度值的容器是不会象IE6里那样被撑开的, 那我又想固定高度,又想能被撑开需要怎样设置呢？办法就是去掉height设置min-height:200px; 这里为了照顾不认识min-height的IE6 可以这样定义: <br/><textarea name="code" class="css" rows="15" cols="100">&#123;
&nbsp;&nbsp;height:auto!important; 
&nbsp;&nbsp;height:200px;
&nbsp;&nbsp;min-height:200px;
&#125; </textarea><br/><br/>12.FireFox下如何使连续长字段自动换行 <br/>众所周知IE中直接使用 word-wrap:break-word 就可以了, FF中我们使用JS插入的方法来解决 <br/><textarea name="code" class="css" rows="15" cols="100">&lt;style type=&quot;text/css&quot;&gt; 
&lt;!-- 
div 
&#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
width:300px;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
word-wrap:break-word;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
border:1px solid red; &#125; 
--&gt; 
&lt;/style&gt; 
&lt;div &gt;这里是一行很长的文字Heck is a good man&lt;/div&gt; 
&lt;scrīpt type=&quot;text/javascrīpt&quot;&gt; 
/* &lt;![CDATA[ */ 
function toBreakWord(el, intLen) 
&#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
var ōbj=document.getElementById(el);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
var strContent=obj.innerHTML;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
var strTemp=&quot;&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
while(strContent.length&gt;intLen) 
&#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
strTemp+=strContent.substr(0,intLen)+&quot; &quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
strContent=strContent.substr(intLen,strContent.length);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&#125;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
strTemp+=&quot; &quot;+strContent;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
obj.innerHTML=strTemp; 
&#125; 
if(document.getElementById&nbsp;&nbsp; &amp;&amp;&nbsp;&nbsp; !document.all)&nbsp;&nbsp;&nbsp;&nbsp;
toBreakWord(&quot;ff&quot;, 37); 
/* ]]&gt; */ 
&lt;/scrīpt&gt; </textarea><br/><br/><strong>13.为什么IE6下容器的宽度和FF解释不同呢 </strong><br/><textarea name="code" class="css" rows="15" cols="100">&lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&gt; 
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt; 
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=gb2312&quot; /&gt; 
&lt;style type=&quot;text/css&quot;&gt; 
&lt;!--div 
&#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
cursor:pointer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
width:200px;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
height:200px;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
border:10px solid red&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&#125; 
--&gt; 
&lt;/style&gt;
&lt;div ōnclick=&quot;alert(this.offsetWidth)&quot;&gt;让FireFox与IE兼容&lt;/div&gt;</textarea><br/><br/>问题的差别在于容器的整体宽度有没有将边框（border）的宽度算在其内, 这里IE6解释为200PX ,而FF则解释为220PX,那究竟是怎么导致的问题呢？ <br/>大家把容器顶部的xml去掉就会发现原来问题出在这,顶部的申明触发了IE的qurks mode,关于qurks mode、 standards mode的相关知识,<br/>请参考:http: //www.microsoft.com/china/msdn/library/webservices/asp.net/ ASPNETusStan.mspx?mfr=true <br/>IE6,IE7,FF&nbsp;&nbsp; IE7.0 出来了，对CSS的支持又有新问题。浏览器多了，网页兼容性更差了，疲于奔命的还是我们 ，为解决IE7.0的兼容问题，找来了下面这篇文章：现在我大部分都是用!important来hack，对于ie6和firefox测试可以正常显示，但是ie7对!important可以正确解释，会导致页面没按要求显示！下面是三个浏览器的兼容性收集.<br/><br/>第一种，是CSS HACK的方法&nbsp;&nbsp;&nbsp;&nbsp; <br/><textarea name="code" class="css" rows="15" cols="100">height:20px; /*For Firefox*/&nbsp;&nbsp;&nbsp;&nbsp; 
*height:25px; /*For IE7 &amp; IE6*/&nbsp;&nbsp;&nbsp;&nbsp; 
_height:20px; /*For IE6*/</textarea>&nbsp;&nbsp;&nbsp;&nbsp; <br/>注意顺序。<br/>这样也属于CSS HACK，不过没有上面这样简洁。&nbsp;&nbsp;&nbsp;&nbsp; <br/><textarea name="code" class="css" rows="15" cols="100">#example &#123; color: #333; &#125; /* Moz */&nbsp;&nbsp;&nbsp;&nbsp; 
* html #example &#123; color: #666; &#125; /* IE6 */&nbsp;&nbsp;&nbsp;&nbsp; 
*+html #example &#123; color: #999; &#125; /* IE7 */</textarea><br/><br/>第二种,条件注释 <br/><textarea name="code" class="css" rows="15" cols="100">&lt;!--其他浏览器 –&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css.css&quot; /&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
&lt;!--[if IE 7]&gt; &lt;!-- 适合于IE7 –&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;ie7.css&quot; /&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
&lt;![endif]—&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
&lt;!--[if lte IE 6]&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
&lt;!-- 适合于IE6及一下 –&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;ie.css&quot; /&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
&lt;![endif]—&gt;</textarea><br/><br/>第三种，css filter的办法，以下为经典从国外网站翻译过来的。 <br/>新建一个css样式如下：&nbsp;&nbsp;&nbsp;&nbsp; <br/><textarea name="code" class="css" rows="15" cols="100">#item 
&#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
width: 200px;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
height: 200px;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
background: red;&nbsp;&nbsp;&nbsp;&nbsp; 
&#125;</textarea><span style="font-family: 微软雅黑;"><br/>新建一个div,并使用前面定义的css的样式：&nbsp;&nbsp;&nbsp;&nbsp; <br/>&lt;div &gt;some text here&lt;/div&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>在body表现这里加入lang属性,中文为zh： &lt;body lang=&quot;en&quot;&gt; 现在对div元素再定义一个样式：*:lang(en) #item&#123; background:green !important;&#125; 这样做是为了用!important覆盖原来的css样式,由于:lang选择器ie7.0并不支持,所以对这句话不会有任何作用, 于是也达到了ie6.0下同样的效果,但是很不幸地的是,safari同样不支持此属性,所以需要加入以下css样式：#item:empty &#123;background: green !important&nbsp;&nbsp;&nbsp;&nbsp;&#125; :empty选择器为css3的规范,尽管safari并不支持此规范, 但是还是会选择此元素,不管是否此元素存在,现在绿色会现在在除ie各版本以外的浏览器上。对IE6和FF的兼容可以考虑以前的!important 个人比较喜欢用第一种，简洁，兼容性比较好。</span><br/>Tags - <a href="https://www.heckjj.com/tags/css/" rel="tag">css</a> , <a href="https://www.heckjj.com/tags/bug/" rel="tag">bug</a> , <a href="https://www.heckjj.com/tags/%25E6%25B5%258F%25E8%25A7%2588%25E5%2599%25A8%25E5%2585%25BC%25E5%25AE%25B9/" rel="tag">浏览器兼容</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/front-end-optimization/</link>
<title><![CDATA[Web前端优化总结]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[前端开发]]></category>
<pubDate>Fri, 10 Sep 2010 10:26:01 +0000</pubDate> 
<guid>https://www.heckjj.com/front-end-optimization/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有关于Web前端优化的一些方法总结，面向内容的优化规则目前有10条，同时如果你有什么好的方法的话也希望你和大家一起来分享下<img src="images/emot/thumbnail/81.gif" border="0" alt="81" />。<br /><strong>1. 尽量减少 HTTP 请求 (Make Fewer HTTP Requests)</strong><br />作为第一条，可能也是最重要的一条。根据 Yahoo! 研究团队的数据分析，有很大一部分用户访问会因为这一条而取得最大受益。有几种常见的方法能切实减少 HTTP 请求：<br /><blockquote>&nbsp;&nbsp;&nbsp;&nbsp;1) <strong>合并文件，</strong>比如把多个 CSS 文件合成一个； <br />&nbsp;&nbsp;&nbsp;&nbsp;2) <strong>CSS Sprites</strong> 利用 CSS background 相关元素进行背景图绝对定位；参见：<a href="http://alistapart.com/articles/sprites" target="_blank">CSS Sprites: Image Slicing&rsquo;s Kiss of </a>Death <br />&nbsp;&nbsp;&nbsp;&nbsp;3) <strong>图像地图 </strong><br />&nbsp;&nbsp;&nbsp;&nbsp;4) <strong>内联图象 </strong>使用 <a href="http://tools.ietf.org/html/rfc2397" target="_blank">data: URL scheme </a>在实际的页面嵌入图像数据. </blockquote>&nbsp;&nbsp; <br />&nbsp;&nbsp;<strong>2. 减少 DNS 查找 (Reduce DNS Lookups)</strong><br />必须明确的一点，DNS 查找的开销是很大的。另外，我倒是觉得这是 Yahoo! 所有站点的通病，Yahoo！主站点可能还不够明显，一些分站点，存在明显的类似问题。对于国内站点来说，如果过多的使用了站外的 Widget ，也很容易引起过多的 DNS 查找问题。<br /><br /><strong>3. 避免重定向 (Avoid Redirects)</strong><br />不是绝对的避免，尽量减少。另外，应该注意一些不必要的重定向。比如对 Web 站点子目录的后面添加个 / (Slash) ，就能有效避免一次重定向。http://www.dbanotes.net/arch 与 http://www.dbanotes.net/arch/ 二者之间是有差异的。如果是 Apache 服务器，通过配置 Alias 或mod_rewrite 或是 DirectorySlash 能够消除这个问题。<br /><strong><br />4. 使得 Ajax 可缓存 (Make Ajax Cacheable)</strong><br />响应时间对 Ajax 来说至关重要，否则用户体验绝对好不到哪里去。提高响应时间的有效手段就是 Cache 。其它的一些优化规则对这一条也是有效的。<br /><br /><strong>5. 延迟载入组件 (Post-load Components)<br /></strong><br /><strong>6. 预载入组件 (Preload Components)</strong><br />上面两条严格说来，都是属于异步这个思想灵活运用的事儿。<br /><br /><strong>7. 减少 DOM 元素数量 (Reduce the Number of DOM Elements)</strong><br /><br /><strong>8. 切分组件到多个域 (Split Components Across Domains)</strong><br />主要的目的是提高页面组件并行下载能力。但不要跨太多域名，否则就和第二条有些冲突了。<br /><br /><strong>9. 最小化 iframe 的数量 (Minimize the Number of iframes)</strong><br />熟悉 SEO 的朋友知道 iframe 是 SEO 的大忌。针对前端优化来说 iframe 有其好处，也有其弊端，一分为二看问题吧。<br /><strong><br />10. 杜绝 http 404 错误 (No 404s)</strong><br />对页面链接的充分测试加上对 Web 服务器 error 日志的不断跟踪能有效减少 404 错误，亦能提升用户体验。值得一提的是，CSS 与 Java Script 引起的 404 错误因为定位稍稍&rdquo;难&rdquo;一点而往往容易被忽略。<br /><br />Web 前端优化最佳实践第二部分面向 Server 。目前共计有 6 条实践规则。【注，这最多算技术笔记，查看最原始内容，还请访问：<a href="http://developer.yahoo.com/performance/rules.html" target="_blank">Exceptional Performance : Best Practices for Speeding Up Your Web Site </a>】<br /><strong><br />1. 使用 CDN (Use a Content Delivery Network)</strong><br />国内 CDN 的普及还不够。不过我们有独特的电信、网通之间的问题，如果针对这个作优化，基本上也算能收到 CDN 或类似的效果吧(假装如此)。【Tin 说国内 CDN 用的挺多，看看 CDN 厂商的市场就知道了，还没走入寻常百姓家】<br /><br /><strong>2. 添加 Expires 或 Cache-Control 信息头 (Add an Expires or a Cache-Control Header)</strong><br />各个浏览器都有针对的方案, Apache 例子【注意：下面的说明例子还不够精细，具体的环境上还要加一些调整】:<br />ExpiresActive On ExpiresByType image/gif &ldquo;modification plus 1 weeks&rdquo;<br />Lighttpd 启用 mod_expire 模块 后：<br />$HTTP[&quot;url&quot;] =~ &ldquo;&quot;.(jpg&#124;gif&#124;png)$&rdquo; &#123; expire.url = ( &ldquo;&rdquo; =&gt; &ldquo;access 1 years&rdquo; ) &#125;<br />Nginx 例子参考:<br />location ~* &quot;.(jpg&#124;gif&#124;png)$ &#123; if (-f $request_filename) &#123; expires max; break; &#125; &#125;<br /><br /><strong>3. 压缩内容 (Gzip Components)</strong><br />对于绝大多数站点，这都是必要的一步，能有效减轻网络流量压力。或许有人担心对 CPU 压缩对于 CPU 的影响，放心大胆的整吧，没事儿。Nginx 例子：<br />gzip on; gzip_types text/plain text/html text/css ext/javascript;<br />另外参见：<br /><a href="http://www.dbanotes.net/web/iis_gzip_compression.html" target="_blank">IIS 如何启用 Gzip 压缩? </a><br /><br /><strong>4. 设置 Etags (Configure ETags)</strong><br />对于 <a href="http://www.dbanotes.net/web/http_11_etag_lastmodified.html" target="_blank">Etag</a>，可能是多数网站维护者都会忽略的地方。在这一系列优化规则出现之前，可能互联网上绝大多数站点都对这个问题忽略了。当然，Etag 对多数站点性能的影响并不是很大。除非是面向 RSS 的网站。【看到有朋友批评说写的简略，并且说 IE 不支持 ETag。明确说一下：IE 支持 ETag，倒是使用 IIS 要注意相关 Etag Bug。】<br />补充：我的意思是&rdquo;很多网站在不注意的情况下都是打开 Etag 的，而没有网站关心如何用，消耗资源而不知。并不是说 Etag 不好，合理利用 Etag ，绝对能取得很好的收益.<br /><br /><strong>5. 尽早刷新 Buffer (Flush the Buffer Early)</strong><br />对这一条，琢磨了半天，貌似还是异步的思路。能更好的提升用户体验?<br /><strong><br />6. 对 AJAX 请求使用 GET 方法 (Use GET for AJAX Requests)</strong><br />XMLHttpRequest POST 要两步，而 GET 只需要一步。但要注意的是在 IE 上 GET 最大能处理的 URL 长度是 2K。<br /><br />Web 前端优化最佳实践第三部分面向 Cookie 。目前只有 2 条实践规则。<br /><br /><strong>1. 缩小 Cookie (Reduce Cookie Size)</strong><br />Cookie 是个很有趣的话题。根据 <a href="http://www.ietf.org/rfc/rfc2109.txt" target="_blank">RFC 2109</a> 的描述，每个客户端最多保持 300 个 Cookie，针对每个域名最多 20 个 Cookie (实际上多数浏览器现在都比这个多，比如 Firefox 是 50 个) ，每个 Cookie 最多 4K，注意这里的 4K 根据不同的浏览器可能不是严格的 4096 。别扯远了，对于 Cookie 最重要的就是，尽量控制 Cookie 的大小，不要塞入一些无用的信息。<br /><br /><strong>2. 针对 Web 组件使用域名无关性的 Cookie (Use Cookie-free Domains for Components)</strong><br />这个话题在此前针对<a href="http://www.dbanotes.net/web/web_image_server.html" target="_blank"> Web 图片服务器</a>的讨论中曾经提及。这里说的 Web 组件(Component)，多指静态文件，比如图片 CSS 等，Yahoo! 的静态文件都在 yimg.com 上，客户端请求静态文件的时候，减少了 Cookie 的反复传输对主域名 (yahoo.com) 的影响。<br />从这篇 <a href="http://yuiblog.com/blog/2007/03/01/performance-research-part-3/" target="_blank">When the Cookie Crumbles</a> 能看出，MySpace 和 eBay 的 Cookie 都不小的，想必是对用户行为比较关心。<a href="http://www.dbanotes.net/database/ebay_personalization_platform_mysql.html" target="_blank">eBay 前不久构造了 Personalization Platform </a>，就是从 Cookie 的限制中跳出来。<br /><br />Web 前端优化最佳实践第四部分面向 CSS。目前共计有 6 条实践规则。另请参见 Mozilla 开发者中心的文章：<a href="http://developer.mozilla.org/en/docs/Writing_Efficient_CSS">Writing Efficient CSS</a><br /><br /><strong>1. 把 CSS 放到代码页上端 (Put Stylesheets at the Top)</strong><br />官方的解释我觉得多少有点语焉不详。这一条其实和用户访问期望有关。CSS 放到最顶部，浏览器能够有针对性的对 HTML 页面从顶到下进行解析和渲染。没有人喜欢等待，而浏览器已经考虑到了这一点。<br /><br /><strong>2. 避免 CSS 表达式 (Avoid CSS Expressions)</strong><br />个人认为通过 CSS 表达式能做到的事情，通过其它手段也同样能做到而且风险更小一些。<br /><strong><br />3. 从页面中剥离 JavaScript 与 CSS (Make JavaScript and CSS External)</strong><br />剥离后，能够有针对性的对其进行单独的处理策略，比如压缩或者缓存策略。<br /><strong><br />4. 精简 JavaScript 与 CSS (Minify JavaScript and CSS)</strong><br />如果没有 JavaScript 与 CSS 可能更好。但，这是不可能的，SO，尽量小点吧。语法能简写的简写。<br /><br /><strong>5. 使用 &lt;link&gt; 而不是@importChoose &lt;link&gt; over @import</strong><br />在 IE 中 @import 指令等同于把 link 标记写在 HTML 的底部。而这与第一条相违背。<br /><br /><strong>6. 避免使用Filter (Avoid Filters)</strong><br /> <br /><br />Web 前端优化最佳实践之 JavaScript 篇，这部分有 6 条规则，和 CSS 篇 重复的有几条。前端优化最佳实践，最重要的还是&rdquo;实践&rdquo;，要理解这东西容易得很，关键是要去&rdquo;实践&rdquo;，去&rdquo;执行&rdquo;，去&rdquo;反馈&rdquo;，去获取受益。<br /><strong><br />1. 脚本放到 HTML 代码页底部 (Put Scripts at the Bottom)</strong><br />当一个脚本在下载的时候，浏览器干不了其它的事儿(串行了)。所以，把它扔到最后面去处理。对于一些功能性的脚本，可能实现起来有些两难。不过对于 国内网站来说，有很多使用 Google Analytics 服务进行网站数据分析的。这这一点来说，绝对可行的建议，放到页面最底下。<br /><br /><strong>2. Make JavaScript and CSS External</strong><br />参见 <a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_css.html" target="_blank">CSS </a>篇的描述<br /><strong><br />3. 精简 JavaScript 与 CSS (Minify JavaScript and CSS)</strong><br />参见 <a href="http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_css.html" target="_blank">CSS </a>篇的描述<br /><strong><br />4. 移除重复脚本 (Remove Duplicate Scripts)</strong><br />对于一些历史遗留站点或是论坛类的网站来说，这倒是比较常见的。接手维护人前后变化过多，每个人都有自己的一套。这就会带来一些潜在的麻烦。<br /><br /><strong>5. 减少 DOM 访问 (Minimize DOM Access)</strong><br />有三条指导建议:<br /><br />缓存已经访问过的元素 (Cache references to accessed elements) <br />&ldquo;离线&rdquo;更新节点, 再将它们添加到树中 (Update nodes &ldquo;offline&rdquo; and then add them to the tree) <br />避免使用 JavaScript 输出页面布局&ndash;应该是 CSS 的事儿 (Avoid fixing layout with JavaScript) <br /><strong>6. Develop Smart Event Handlers</strong><br />除了英文解释外，这里也提醒一下注意关于 Java Script 内存泄漏的问题。<br /> <br />Web 前端优化最佳实践第六部分面向 图片(Image)，这部分目前有 4 条规则。在最近的 Velocity 2008 技术大会上，Yahoo! 的 Stoyan Stefanov 做的 <a href="http://en.oreilly.com/velocity2008/public/schedule/detail/2405">Image Optimization: How Many of These 7 Mistakes Are You Making </a>也非常有参考价值。结合一起说一下。<br /><br /><strong>1. 优化图片 (Optimize Images)</strong><br />使用 GIF 、JPG 还是 PNG 格式的图片? 尽可能的使用 PNG 格式的图片，更多的功能，更小的尺寸(与 GIF 相比)。<br />对于 PNG 图片，考虑用 <a href="http://pmt.sourceforge.net/pngcrush/">Pngcrush </a>或类似的工具进行优化。常见的工具如下表:<br /><blockquote><a href="http://pmt.sourceforge.net/pngcrush/" target="_blank">pngcrush </a>http://pmt.sourceforge.net/pngcrush/ <br /><a href="http://www.pobox.com/~jason1/pngrewrite/" target="_blank">pngrewrite </a>http://www.pobox.com/~jason1/pngrewrite/ <br /><a href="http://www.cs.toronto.edu/~cosmin/pngtech/optipng/" target="_blank">OptiPNG </a>http://www.cs.toronto.edu/~cosmin/pngtech/optipng/ (refer: <a href="http://linuxtoy.org/archives/optipng.html" target="_blank">教程</a>) <br /><a href="http://advsys.net/ken/utils.htm" target="_blank">PNGOut </a>http://advsys.net/ken/utils.htm <br /></blockquote>对 JPEG 图片的优化工具：<br /><a href="http://jpegclub.org/" target="_blank">jpegtran </a>(http://jpegclub.org/) <br />必需要强调的是，图片设计的同学啊，请考虑设计面向 Web 的图片，不要动不动就设计超过可接受尺寸之外大家伙，这应该是一种习惯，而不是什么高超的技能，只需要记住就成了。<br /><br />2. 使用 CSS Sprites 技巧对图片优化 (Optimize CSS Sprites)<br />之前提到过，简单的说就是&rdquo;利用 CSS background 相关元素进行背景图绝对定位&rdquo;，把多次 HTTP 调用变为一次调用，更多参考：<a href="http://alistapart.com/articles/sprites" target="_blank">CSS Sprites: Image Slicing&rsquo;s Kiss of Death</a><br />补充一下：对于这个技巧我曾经见到有人滥用的。把多个背景图片揉成一个，减少　HTTP 调用，这是一个很好的思路。但一定要记住这个大图片不能太&rdquo;重&rdquo;，我看到过 100 多K 的背景图。一个图片就把整个网站拖得很慢。比较好的例子可以参考<a href="http://cn.yimg.com/i/sns/img/ysred_1_0_6.png" target="_blank">雅虎关系的这个图</a>.<br /><br />3. 不要在 HTML 中使用缩放图片 (Don&rsquo;t Scale Images in HTML)<br />更多的时候，可能是因为偷懒而没有制作合适大小的图片，如果是批量处理图片的话，可能一条 <a href="http://www.imagemagick.org/" target="_blank">ImageMagic </a>命令（convert ）就能搞定 。必须提及的是，看到太多的对图片拉伸很难看的页面，救救这些页面!<br /><br />4. 用更小的并且可缓存的 favicon.ico (Make favicon.ico Small and Cacheable)<br />更小，可缓存，这两条可能都不是问题。问题是，太多站点根本没有 favicon.ico 。有的时候，判断独立域名的 Blog 是否专业，基本看一下是否有 favicon.ico 就差不多了。<br /><br />Web 前端优化最佳实践最后一部分是针对移动应用的，其实只是针对 iPhone 的，目前只有两条规则。<br /><br />1. 单个数据对象小于 25K (Keep Components under 25K)<br />这个似乎只是针对<a href="http://yuiblog.com/blog/2008/02/06/iphone-cacheability/" target="_blank"> iPhone 研究</a>的。建议保持单个 Web 数据对象在 25 K 以下。为什么是 25K? Apple 官方信息指出可缓存到内存中的 Web 对象最大支持到 10M，但经过测试，发现也就是 25K 左右。<br />iPhone 在市场上的优异表现，让 Web 人员不得不考虑如何针对其进行优化。相信这部分内容也在不断变化中。<br /><br />2. Pack Components into a Multipart Document<br />把Web 页面组件打包成一个多部分组成的文档。其目的是减少 HTTP 请求。对这部分语焉不详，等待后续更新吧。<br /><br/>Tags - <a href="https://www.heckjj.com/tags/%25E5%2589%258D%25E7%25AB%25AF%25E4%25BC%2598%25E5%258C%2596/" rel="tag">前端优化</a> , <a href="https://www.heckjj.com/tags/%25E7%25BD%2591%25E7%25AB%2599%25E4%25BC%2598%25E5%258C%2596/" rel="tag">网站优化</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/js-javascript-mask-layer/</link>
<title><![CDATA[js javascript弹出遮罩层,弹出半透明的遮罩层并显示注册文本框内容]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[前端开发]]></category>
<pubDate>Fri, 10 Sep 2010 07:53:46 +0000</pubDate> 
<guid>https://www.heckjj.com/js-javascript-mask-layer/</guid> 
<description>
<![CDATA[ 
	<textarea name="code" class="html" rows="15" cols="100">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=gb2312&quot; /&gt;
&lt;title&gt;弹出提示&lt;/title&gt;
&lt;style&gt;
* &#123;margin:0;padding:0;font-size:12px;&#125;
html,body &#123;height:100%;width:100%;&#125;
#content &#123;background:#FFFFFF;padding:30px;height:100%;&#125;
#content a &#123;font-size:30px;color:#369;font-weight:700;&#125;
#alert &#123;border:1px solid #369;width:300px;height:150px;background:#e2ecf5;z-index:1000;position:absolute;display:none;&#125;
#alert h4 &#123;height:20px;background:#369;color:#fff;padding:5px 0 0 5px;&#125;
#alert h4 span &#123;float:left;&#125;
#alert h4 span#close &#123;margin-left:210px;font-weight:500;cursor:pointer;&#125;
#alert p &#123;padding:12px 0 0 30px;&#125;
#alert p input &#123;width:120px;margin-left:20px;&#125;
#alert p input.myinp &#123;border:1px solid #ccc;height:16px;&#125;
#alert p input.sub &#123;width:60px;margin-left:30px;&#125;
&lt;/style&gt;
&lt;/head&gt;
&lt;body&nbsp;&nbsp; &gt;
&lt;div id=&quot;content&quot;&gt;
&lt;a href=&quot;#&quot;&gt;注册&lt;/a&gt;
&lt;/div&gt;
&lt;div id=&quot;alert&quot;&gt;
&lt;h4&gt;&lt;span&gt;现在注册&lt;/span&gt;&lt;span id=&quot;close&quot;&gt;关闭&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;label&gt; 用户名&lt;/label&gt;&lt;input type=&quot;text&quot; class=&quot;myinp&quot; onmouseover=&quot;this.style.border=&#039;1px solid #f60&#039;&quot; onfoucs=&quot;this.style.border=&#039;1px solid #f60&#039;&quot; onblur=&quot;this.style.border=&#039;1px solid #ccc&#039;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;label&gt; 密　码&lt;/label&gt;&lt;input type=&quot;password&quot; class=&quot;myinp&quot; onmouseover=&quot;this.style.border=&#039;1px solid #f60&#039;&quot; onfoucs=&quot;this.style.border=&#039;1px solid #f60&#039;&quot; onblur=&quot;this.style.border=&#039;1px solid #ccc&#039;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;input type=&quot;submit&quot; value=&quot;注册&quot; class=&quot;sub&quot; /&gt;&lt;input type=&quot;reset&quot; value=&quot;重置&quot; class=&quot;sub&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
var myAlert = document.getElementById(&quot;alert&quot;);
var reg = document.getElementById(&quot;content&quot;).getElementsByTagName(&quot;a&quot;)[0];
var mClose = document.getElementById(&quot;close&quot;);
reg.onclick = function()
&#123;
myAlert.style.display = &quot;block&quot;;
myAlert.style.position = &quot;absolute&quot;;
myAlert.style.top = &quot;50%&quot;;
myAlert.style.left = &quot;50%&quot;;
myAlert.style.marginTop = &quot;-75px&quot;;
myAlert.style.marginLeft = &quot;-150px&quot;;

mybg = document.createElement(&quot;div&quot;);
mybg.setAttribute(&quot;id&quot;,&quot;mybg&quot;);
mybg.style.background = &quot;#000&quot;;
mybg.style.width = &quot;100%&quot;;
mybg.style.height = &quot;100%&quot;;
mybg.style.position = &quot;absolute&quot;;
mybg.style.top = &quot;0&quot;;
mybg.style.left = &quot;0&quot;;
mybg.style.zIndex = &quot;500&quot;;
mybg.style.opacity = &quot;0.3&quot;;
mybg.style.filter = &quot;Alpha(opacity=30)&quot;;
document.body.appendChild(mybg);

document.body.style.overflow = &quot;hidden&quot;;
&#125;

mClose.onclick = function()
&#123;
myAlert.style.display = &quot;none&quot;;
mybg.style.display = &quot;none&quot;;
&#125;
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</textarea><br/>Tags - <a href="https://www.heckjj.com/tags/js/" rel="tag">js</a> , <a href="https://www.heckjj.com/tags/javascript/" rel="tag">javascript</a> , <a href="https://www.heckjj.com/tags/%25E5%25BC%25B9%25E5%2587%25BA%25E9%2581%25AE%25E7%25BD%25A9%25E5%25B1%2582/" rel="tag">弹出遮罩层</a> , <a href="https://www.heckjj.com/tags/%25E5%25BC%25B9%25E5%2587%25BA%25E5%258D%258A%25E9%2580%258F%25E6%2598%258E%25E7%259A%2584%25E9%2581%25AE%25E7%25BD%25A9%25E5%25B1%2582/" rel="tag">弹出半透明的遮罩层</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/javascript-js-detect-browser/</link>
<title><![CDATA[js javaScript检测浏览器和操作系统平台]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[前端开发]]></category>
<pubDate>Fri, 10 Sep 2010 05:15:25 +0000</pubDate> 
<guid>https://www.heckjj.com/javascript-js-detect-browser/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 微软雅黑;">今天看JavaScript高级程序设计第8章检测浏览器和操作系统时，发现浏览器发展历史带着一种没有统一规范的过程走到了今天，这些混乱的过程，主要体现在user-agent字符串内容上，用了Win的人，很多都无知地认为世界只有IE这么一个浏览器，对他们来说带着一种打开浏览器就是打开IE的意思，没有Mozilla,Opera,Konqueror,Safari,NetScape这些可选的概念，但对于Web人员则不能对这些无知了，一个可靠的javaScript脚必须针对不同的客户平台作出不同准确识别，不单是浏览器类型对javaScript函数调用有关，浏览器依附的操作系统平台对浏览器的支持功能也有制约和支持,书中附带的detect.js，软完整给出了针对一系列用户浏览器和操作系统平台的检测，虽然直接对Code看难理解，不过跟着书本解析，理解起来还是不难的，里面几乎全是通过对user-agent字符串信息分析得到的,我往代码里添加了自己的注释。<br/><br/>detect.js</span><br/><textarea name="code" class="js" rows="15" cols="100">
//全局变量
//userAgent--用户代理头字符串的字符串表示
//appVersion--浏览器版本信息的字符串表示
var sUserAgent = navigator.userAgent;
var fAppVersion = parseFloat(navigator.appVersion);

//比较usr-agent字符串里关于浏览器版本信息，两个比较参数不等位的，就在位小的一个后面全补0
/**
 * @params Version1, sVersion2 比较参数
 * @return 1表示version1版本高,-1表示sVersion2版本高，0表示两个user-Agent版本一样
 * 通过指定某一个版本参数，再根据返回值，则得知用户浏览器的版本信息
 */
function compareVersions(sVersion1, sVersion2) &#123;

&nbsp;&nbsp;&nbsp;&nbsp;var aVersion1 = sVersion1.split(".");
&nbsp;&nbsp;&nbsp;&nbsp;var aVersion2 = sVersion2.split(".");
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if (aVersion1.length > aVersion2.length) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (var i=0; i < aVersion1.length - aVersion2.length; i++) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aVersion2.push("0");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if (aVersion1.length < aVersion2.length) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (var i=0; i < aVersion2.length - aVersion1.length; i++) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aVersion1.push("0");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;for (var i=0; i < aVersion1.length; i++) &#123;
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (aVersion1[i] < aVersion2[i]) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if (aVersion1[i] > aVersion2[i]) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;return 0;

&#125;


//检测是不是Opera浏览器
var isOpera = sUserAgent.indexOf("Opera") > -1;
var isMinOpera4 = isMinOpera5 = isMinOpera6 = isMinOpera7 = isMinOpera7_5 = false;

if (isOpera) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;var fOperaVersion;
&nbsp;&nbsp;&nbsp;&nbsp;//检测user-agent以Opera开始,得到浏览器版本数字
&nbsp;&nbsp;&nbsp;&nbsp;if(navigator.appName == "Opera") &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fOperaVersion = fAppVersion;
&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//检测user-agent其中包含Opera和一或多个数字，再带一个.再带一个或多个数字;得到浏览器版本数字
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var reOperaVersion = new RegExp("Opera (&#92;&#92;d+&#92;&#92;.&#92;&#92;d+)");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reOperaVersion.test(sUserAgent);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fOperaVersion = parseFloat(RegExp["$1"]);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;//得到准确的Opera版本类型
&nbsp;&nbsp;&nbsp;&nbsp;isMinOpera4 = fOperaVersion >= 4;
&nbsp;&nbsp;&nbsp;&nbsp;isMinOpera5 = fOperaVersion >= 5;
&nbsp;&nbsp;&nbsp;&nbsp;isMinOpera6 = fOperaVersion >= 6;
&nbsp;&nbsp;&nbsp;&nbsp;isMinOpera7 = fOperaVersion >= 7;
&nbsp;&nbsp;&nbsp;&nbsp;isMinOpera7_5 = fOperaVersion >= 7.5;
&#125;




//检测是不是KTHML或Safari浏览器
var isKHTML = sUserAgent.indexOf("KHTML") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; sUserAgent.indexOf("Konqueror") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; sUserAgent.indexOf("AppleWebKit") > -1; 
//默认组赋值
var isMinSafari1 = isMinSafari1_2 = false;
var isMinKonq2_2 = isMinKonq3 = isMinKonq3_1 = isMinKonq3_2 = false;

if (isKHTML) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;isSafari = sUserAgent.indexOf("AppleWebKit") > -1;
&nbsp;&nbsp;&nbsp;&nbsp;isKonq = sUserAgent.indexOf("Konqueror") > -1;

&nbsp;&nbsp;&nbsp;&nbsp;if (isSafari) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var reAppleWebKit = new RegExp("AppleWebKit&#92;&#92;/(&#92;&#92;d+(?:&#92;&#92;.&#92;&#92;d*)?)");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reAppleWebKit.test(sUserAgent);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var fAppleWebKitVersion = parseFloat(RegExp["$1"]);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isMinSafari1 = fAppleWebKitVersion >= 85;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isMinSafari1_2 = fAppleWebKitVersion >= 124;
&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if (isKonq) &#123;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var reKonq = new RegExp("Konqueror&#92;&#92;/(&#92;&#92;d+(?:&#92;&#92;.&#92;&#92;d+(?:&#92;&#92;.&#92;&#92;d)?)?)");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reKonq.test(sUserAgent);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isMinKonq2_2 = compareVersions(RegExp["$1"], "2.2") >= 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isMinKonq3 = compareVersions(RegExp["$1"], "3.0") >= 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isMinKonq3_1 = compareVersions(RegExp["$1"], "3.1") >= 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isMinKonq3_2 = compareVersions(RegExp["$1"], "3.2") >= 0;
&nbsp;&nbsp;&nbsp;&nbsp;&#125; 
&nbsp;&nbsp;&nbsp;&nbsp;
&#125;



//检测是不是IE浏览器
var isIE = sUserAgent.indexOf("compatible") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; && sUserAgent.indexOf("MSIE") > -1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; && !isOpera;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
var isMinIE4 = isMinIE5 = isMinIE5_5 = isMinIE6 = false;

if (isIE) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;var reIE = new RegExp("MSIE (&#92;&#92;d+&#92;&#92;.&#92;&#92;d+);");
&nbsp;&nbsp;&nbsp;&nbsp;reIE.test(sUserAgent);
&nbsp;&nbsp;&nbsp;&nbsp;var fIEVersion = parseFloat(RegExp["$1"]);

&nbsp;&nbsp;&nbsp;&nbsp;isMinIE4 = fIEVersion >= 4;
&nbsp;&nbsp;&nbsp;&nbsp;isMinIE5 = fIEVersion >= 5;
&nbsp;&nbsp;&nbsp;&nbsp;isMinIE5_5 = fIEVersion >= 5.5;
&nbsp;&nbsp;&nbsp;&nbsp;isMinIE6 = fIEVersion >= 6.0;
&#125;



//检测是不是Mozllia浏览器
var isMoz = sUserAgent.indexOf("Gecko") > -1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&& !isKHTML;

var isMinMoz1 = sMinMoz1_4 = isMinMoz1_5 = false;

if (isMoz) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;var reMoz = new RegExp("rv:(&#92;&#92;d+&#92;&#92;.&#92;&#92;d+(?:&#92;&#92;.&#92;&#92;d+)?)");
&nbsp;&nbsp;&nbsp;&nbsp;reMoz.test(sUserAgent);
&nbsp;&nbsp;&nbsp;&nbsp;isMinMoz1 = compareVersions(RegExp["$1"], "1.0") >= 0;
&nbsp;&nbsp;&nbsp;&nbsp;isMinMoz1_4 = compareVersions(RegExp["$1"], "1.4") >= 0;
&nbsp;&nbsp;&nbsp;&nbsp;isMinMoz1_5 = compareVersions(RegExp["$1"], "1.5") >= 0;
&#125;


//检测是不是NetScape Communicator4.x浏览器
var isNS4 = !isIE && !isOpera && !isMoz && !isKHTML 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&& (sUserAgent.indexOf("Mozilla") == 0) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&& (navigator.appName == "Netscape") 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&& (fAppVersion >= 4.0 && fAppVersion < 5.0);

var isMinNS4 = isMinNS4_5 = isMinNS4_7 = isMinNS4_8 = false;

if (isNS4) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;isMinNS4 = true;
&nbsp;&nbsp;&nbsp;&nbsp;isMinNS4_5 = fAppVersion >= 4.5;
&nbsp;&nbsp;&nbsp;&nbsp;isMinNS4_7 = fAppVersion >= 4.7;
&nbsp;&nbsp;&nbsp;&nbsp;isMinNS4_8 = fAppVersion >= 4.8;
&#125;



//~~~~~~~~~~~~~~检测客户操作系统平台~~~~~~~~~~~

//检测Win平台标志
var isWin = (navigator.platform == "Win32") &#124;&#124; (navigator.platform == "Windows");

//检测Macintosh平台标志
var isMac = (navigator.platform == "Mac68K") &#124;&#124; (navigator.platform == "MacPPC") 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; (navigator.platform == "Macintosh");

//检测Unix平台标志
var isUnix = (navigator.platform == "X11") && !isWin && !isMac;


//平台具体版本号组赋值
var isWin95 = isWin98 = isWinNT4 = isWin2K = isWinME = isWinXP = false;
var isMac68K = isMacPPC = false;
var isSunOS = isMinSunOS4 = isMinSunOS5 = isMinSunOS5_5 = false;

//得到准确的平台版本类型
if (isWin) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;isWin95 = sUserAgent.indexOf("Win95") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; sUserAgent.indexOf("Windows 95") > -1;
&nbsp;&nbsp;&nbsp;&nbsp;isWin98 = sUserAgent.indexOf("Win98") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; sUserAgent.indexOf("Windows 98") > -1;
&nbsp;&nbsp;&nbsp;&nbsp;isWinME = sUserAgent.indexOf("Win 9x 4.90") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; sUserAgent.indexOf("Windows ME") > -1;
&nbsp;&nbsp;&nbsp;&nbsp;isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; sUserAgent.indexOf("Windows 2000") > -1;
&nbsp;&nbsp;&nbsp;&nbsp;isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; sUserAgent.indexOf("Windows XP") > -1;
&nbsp;&nbsp;&nbsp;&nbsp;isWinNT4 = sUserAgent.indexOf("WinNT") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; sUserAgent.indexOf("Windows NT") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; sUserAgent.indexOf("WinNT4.0") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124;&#124; sUserAgent.indexOf("Windows NT 4.0") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&& (!isWinME && !isWin2K && !isWinXP);
&#125; 

//得到准确的平台版本类型
if (isMac) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;isMac68K = sUserAgent.indexOf("Mac_68000") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&#124; sUserAgent.indexOf("68K") > -1;
&nbsp;&nbsp;&nbsp;&nbsp;isMacPPC = sUserAgent.indexOf("Mac_PowerPC") > -1 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&#124; sUserAgent.indexOf("PPC") > -1;&nbsp;&nbsp;
&#125;

//得到准确的平台版本类型
if (isUnix) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;isSunOS = sUserAgent.indexOf("SunOS") > -1;

&nbsp;&nbsp;&nbsp;&nbsp;if (isSunOS) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var reSunOS = new RegExp("SunOS (&#92;&#92;d+&#92;&#92;.&#92;&#92;d+(?:&#92;&#92;.&#92;&#92;d+)?)");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reSunOS.test(sUserAgent);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isMinSunOS4 = compareVersions(RegExp["$1"], "4.0") >= 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isMinSunOS5 = compareVersions(RegExp["$1"], "5.0") >= 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isMinSunOS5_5 = compareVersions(RegExp["$1"], "5.5") >= 0;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&#125;
</textarea><br/>Tags - <a href="https://www.heckjj.com/tags/js/" rel="tag">js</a> , <a href="https://www.heckjj.com/tags/javascript%25E6%25A3%2580%25E6%25B5%258B%25E6%25B5%258F%25E8%25A7%2588%25E5%2599%25A8/" rel="tag">javascript检测浏览器</a> , <a href="https://www.heckjj.com/tags/%25E6%2593%258D%25E4%25BD%259C%25E7%25B3%25BB%25E7%25BB%259F%25E5%25B9%25B3%25E5%258F%25B0/" rel="tag">操作系统平台</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/js-javascript-array-join/</link>
<title><![CDATA[js javascript array.join 字符串连接处理]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[前端开发]]></category>
<pubDate>Fri, 10 Sep 2010 05:11:41 +0000</pubDate> 
<guid>https://www.heckjj.com/js-javascript-array-join/</guid> 
<description>
<![CDATA[ 
	<textarea name="code" class="js" rows="15" cols="100">//字符串连接处理
array=new Array()
array[0]=&quot;AAA&quot;
array[1]=&quot;BBB&quot;
array[2]=&quot;CCC&quot;
array[3]=&quot;DDD&quot;
str1=array.join()
str2=array.join(&quot;&#124;&quot;)
document.write(str1+&quot;&quot;)
document.write(str2)</textarea><br/>Tags - <a href="https://www.heckjj.com/tags/%25E5%25AD%2597%25E7%25AC%25A6%25E4%25B8%25B2%25E8%25BF%259E%25E6%258E%25A5%25E5%25A4%2584%25E7%2590%2586/" rel="tag">字符串连接处理</a> , <a href="https://www.heckjj.com/tags/js/" rel="tag">js</a> , <a href="https://www.heckjj.com/tags/javascript/" rel="tag">javascript</a> , <a href="https://www.heckjj.com/tags/array.join/" rel="tag">array.join</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/jsp-ajax-XMLHttpRequest-html/</link>
<title><![CDATA[jsp页面用XMLHttpRequest简单的异步调用]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[前端开发]]></category>
<pubDate>Fri, 10 Sep 2010 03:52:52 +0000</pubDate> 
<guid>https://www.heckjj.com/jsp-ajax-XMLHttpRequest-html/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 微软雅黑;">下面来讨论下jsp页面用XMLHttpRequest简单的异步调用，请看例子程序步骤<a href="https://www.heckjj.com/plugin/album/pictures/2a09fd5295c23e6d9a2a79e5adfc5463.gif" target="_blank"><img src="https://www.heckjj.com/plugin/album/pictures/2a09fd5295c23e6d9a2a79e5adfc5463.gif" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a>：<br/>a.创建一个新的XMLHttpRequest--function newXMLHttpRequest()<br/>b.创建DOM事件处理器--function onContinentChanged(selectCont, inForm)<br/>c.创建回调函数callback--function displayNations(xmlData)<br/>d.创建封装回调函数的函数--function getReadyStateHandler(requestFromServer, responseXMLHandler)<br/>e.工具函数--IE下创建新的Dom文档--function createDomDoc()<br/><br/>前面五步在jsp接受的javaScript函数;<br/>处理流程是 b捕html页面事件，a创建新XMLHttpRequest，a利用c往XMLHttpRequest里这塞url，和回调函数，还有其它参数;由于沙箱原理，所有由XMLHttpRequest访问的url都不会离开本页面的根地址;<br/>具体函数内容在下面<br/>a.新建XMLHttpRequest</span><br/><textarea name="code" class="js" rows="15" cols="100">
function newXMLHttpRequest() &#123;
&nbsp;&nbsp;if (window.XMLHttpRequest) &#123;
&nbsp;&nbsp; request = new XMLHttpRequest();
&nbsp;&nbsp;&#125; else if (window.ActiveXObject) &#123;
&nbsp;&nbsp; try &#123;
&nbsp;&nbsp;&nbsp;&nbsp;request = new XMLHttpRequest("Msxml2.XMLHTTP");
&nbsp;&nbsp; &#125; catch (e1) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;try &#123;
&nbsp;&nbsp;&nbsp;&nbsp; request = new ActiveXObject("Microsoft.XMLHTTP");
&nbsp;&nbsp;&nbsp;&nbsp;&#125; catch (e2) &#123;
&nbsp;&nbsp;&nbsp;&nbsp; //create XMLHttpRequest failed
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp; &#125;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;return request;
 &#125;
</textarea><br/>b.html页面事件处理器<br/><textarea name="code" class="js" rows="15" cols="100">function onContinentChanged(selectCont, inForm) &#123;
&nbsp;&nbsp;if (selectCont.options[selectCont.selectedIndex].value == 'none')
&nbsp;&nbsp; return;
&nbsp;&nbsp;newXMLHttpRequest();
&nbsp;&nbsp;var contId = selectCont.options[selectCont.selectedIndex].value;

//组装url, 和加入参数，excape（）函数为javascript需要的特别字符转换
&nbsp;&nbsp;var url = "selectContinent.do?contId=" + escape(contId);
&nbsp;&nbsp;request.open("GET", url, true);//true为异步调用，false为同步
&nbsp;&nbsp;var handlerFunction = getReadyStateHandler(request, displayNations);
&nbsp;&nbsp;request.onreadystatechange = handlerFunction; //设置回调函数
&nbsp;&nbsp;//request.onreadystatechange = displayNations(); //设置回调函数
&nbsp;&nbsp;request.send(null);
 &#125;
</textarea><br/>c.callBack<br/><textarea name="code" class="js" rows="15" cols="100">
function displayNations(xmlData) &#123;
&nbsp;&nbsp;var selectNation = document.getElementById("nation");
&nbsp;&nbsp;var domDoc = createDomDoc();
&nbsp;&nbsp;domDoc.loadXML(xmlData);

&nbsp;&nbsp;var nations = domDoc.getElementsByTagName("nation")
&nbsp;&nbsp;//window.alert("in displayNations");
&nbsp;&nbsp;var arNations = new Array(new Option("请选择", "none"));
&nbsp;&nbsp;for ( var i = 0; i < nations.length; i++) &#123;
&nbsp;&nbsp; var nationId = nations.item(i).getAttribute("id");
&nbsp;&nbsp; var nationName = nations.item(i).getAttribute("name");
&nbsp;&nbsp; var optNation = new Option(nationName, nationId);
&nbsp;&nbsp; //window.alert("从server取得的国家id和国家名" + nationId + " " + nationName);
&nbsp;&nbsp; arNations[i + 1] = optNation;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;selectNation.disable = false;
&nbsp;&nbsp;for ( var j = 0; j < arNations.length; j++) &#123;
&nbsp;&nbsp; selectNation.options[j] = arNations[j];
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;selectNation.disabled = false;
 &#125;</textarea><br/><br/>d.封装callBack<br/><textarea name="code" class="js" rows="15" cols="100">
function getReadyStateHandler(requestFromServer, responseXMLHandler) &#123;
&nbsp;&nbsp;return function() &#123;
&nbsp;&nbsp; if (requestFromServer.readyState == 4) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;if (requestFromServer.status == 200) &#123;
&nbsp;&nbsp;&nbsp;&nbsp; //window.alert("200 in getReadyStateHandler" + requestFromServer.responseText)
&nbsp;&nbsp;&nbsp;&nbsp; responseXMLHandler(requestFromServer.responseText);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp; &#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;windwo.alert("在getReadyStateHandler里执行... 不是4也不是200")
&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp; &#125;
&nbsp;&nbsp;&#125;
 &#125;</textarea><br/><br/>e.Util<br/><textarea name="code" class="js" rows="15" cols="100">
 function createDomDoc() &#123;
&nbsp;&nbsp;var domDoc = false;
&nbsp;&nbsp;try &#123;
&nbsp;&nbsp; domDoc = new ActiveXObject("Msxml.DOMDocument");
&nbsp;&nbsp;&#125; catch (e) &#123;
&nbsp;&nbsp; window.alert("创建domDoc异常")
&nbsp;&nbsp; domDoc = false;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;return domDoc;
 &#125;
</textarea><br/> <br/><br/>servlert处理异步调用<br/><textarea name="code" class="java" rows="15" cols="100">
 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
&nbsp;&nbsp; throws ServletException, IOException &#123;
&nbsp;&nbsp;String contId = req.getParameter("contId");

 // 取得用户选择的洲对应的回家组,根据服务类
&nbsp;&nbsp;Continent cont = GeographyService.getContinentById(contId);

&nbsp;&nbsp;Element elNatinons = null;
&nbsp;&nbsp;try &#123;
&nbsp;&nbsp; elNatinons = cont.toXML();
&nbsp;&nbsp;&#125; catch (RuntimeException e) &#123;
&nbsp;&nbsp; System.out.println("servlet异常..");
&nbsp;&nbsp; e.printStackTrace();
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;Document docCont = new Document(elNatinons);
&nbsp;&nbsp;resp.setContentType("application/xml");
&nbsp;&nbsp;new XMLOutputter().output(docCont, resp.getWriter());
 &#125;

 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
&nbsp;&nbsp; throws ServletException, IOException &#123;
&nbsp;&nbsp;this.doPost(req, resp);
 &#125;</textarea><br/>Tags - <a href="https://www.heckjj.com/tags/ajax/" rel="tag">ajax</a>
]]>
</description>
</item>
</channel>
</rss>