(转)WEB前端开发工程师面试题大全(一)

依照我个人答案与网上相关答案进行编写

作者:刘建

毕业院校:家里蹲大学低能班

联系邮箱:243376129@qq.com

如果有错误,欢迎发邮件,本人尽量修正。

一个前端技术工程师必须掌握的知识,写得很详细了,相信看完会对大家有所帮助。

——————————————————————————————————————————————————————————————————————

当然,高手就不用看这些面试题了。

见过某个高手,有自己的个人网站,然后把工作经历(他的工作单位基本都是著名网站,比如网易)、网站作品、掌握知识的熟练程度和掌握时间做成了一个页面。

人家网上应聘直接发个网页地址就够了。

当然这样的高手很少,这些题是为了大部分人出的,检测知识面。

开始进入正题:

——————————————————————————————————————————————————————————————————————

HTML与XHTML有什么区别?

①XHTML 元素必须被正确地嵌套。

错误:<p><span>this is example.</p></span>

正确:<p><span>this is example.</span></p>

HTML下<table width=100>,可以不写引号"",

而XHTML必须正确的写成:<table width="100">

②XHTML元素必须被关闭。

错误:<p>this is example.

正确:<p>this is example.</p>

HTML下可以写:<br>,而XHTML有严格限制,每个标签都得关闭,要写成:<br />

③标签名必须用小写字母。

错误:<P>this is example.<P>

正确:<p>this is example.</p>

④XHTML 文档必须拥有根元素。所有的 XHTML 元素必须被嵌套于 <html> 根元素中。

HTML根元素:在HTML文档中,元素<html>代表了文档的根,其他所有的元素都是在该元素的基础上进行延伸或拓展的。

该元素也是HTML文档的最外层元素,因此也称为根元素。

⑤XHTML废除了一些html里面的标签,原因是制定这个规范的w3c的人觉得有些旧东西该淘汰或不科学。

在XHTML和HTML下,同样的CSS样式表解析出来会有很多细节上的小差异。

——————————————————————————————————————————————————————————————————————

——————————————————————————————————————————————————————————————————————

——————————————————————————————————————————————————————————————————————

——————————————————————————————————————————————————————————————————————

网站重构的测试(来自腾讯的前端工程师面试题)

HTML文档流必须从Main开始然后才是两侧

原题解答看着让人有些没说到关键点,我进行下补充。

布局基本框架

上面只是一个简化图,实际比这个复杂不少:Left与Right是固定宽度,中间Main要求自适应。

——————

文档流:文档流是文档中可显示对象在排列时所占用的位置。将窗体自上而下分成一行行,并在每行中按从左至右的挨次排放元素。

网页中大部分对象默认是占用文档流,也有一些对象是不占文档流的,比如表单中隐藏域。

当然我们也可以让占用文档流的元素转换成不占文档流,这就要用到CSS中属性position来控制。

有三种状况将使得元素离开文档流而存在,分别是浮动、绝对定位、固定定位。然则在IE中浮动元素也存在于文档流中。

浮动元素不占任何正常文档流空间,而浮动元素的定位照样基于正常的文档流,然后从文档流中抽出并且能够尽量远的挪动至左侧或者右侧。

文字内容会环绕在浮动元素四周。当一个元素从正常文档流中抽出后,依然在文档流中的其他元素将疏忽该元素并填补他原先的空间。

——————

核心问题是Html文档流必须从Main开始然后才是两侧,下面就是这个要求的Html结构

1 <div id=”main”>
2 </div>
3 <div id=”left”>
4 </div>
5 <div id=”right”>
6 </div>

常规做法把两侧放在主要内容的前面进行左右浮动,然后中间使用边距,这样有个缺点就是网速慢的时候主要内容却在最后显示。

按照上面的Html布局,如果按常规把left和right各自左右浮动,中间main使用边距的话就会出现下面这种情况:

一、使用绝对定位。

不占用文档流的先读

绝对定位需要设置左右边距(实际应用中往往需要在外面套一个相对定位的盒子)。整个Demo如下(通过Firefox与IE5.5——8测试):

复制代码
 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5 <title>三栏布局</title>
 6 <style type="text/css">
 7 * { margin:0; padding:0; }
 8 #main { position:absolute; left:200px; right:200px }/*绝对定位,使content不占据html文档流空间,让后面的left,right浮上去*/
 9 #left, #right { 200px; }
10 #left { float:left; }
11 #right { float:right; }
12 </style>
13 </head>
14 <body>
15 <div id="main">
16 <p style="height:999px; background:#fffaba; ">content</p>
17 </div>
18 <div id="left">
19 <p style="height:999px; background:#8fc41f;">left</p>
20 </div><div id="right">
21 <p style="height:999px; background:#00b7ef;">right</p>
22 </div>
23 </body>
24 </html>
复制代码

CSS2引入了一种新的简单选择器:通配选择器(universal selector),显示为一个星号(*)。该选择器可以与任何元素匹配,就像是一个通配符。

例如,下面的规则可以使文档中的每个元素都为红色:

* {color:red;}

二、Main左浮动。

如果Main浮动的话首先要解决宽度自适应的问题,设置宽度100%显示,然后就得把Left拉到Main左侧,这里巧妙使用两种偏移方法。

先定义为浮动的先读。

IE6会有兼容问题,需要Hack一下。

Hack解释:一般基于开源的程序的基础,对其代码进行增加、删除或者修改、优化,使之在功能上符合新的需求。

这里的Hack就是修改的意思。

复制代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>三栏布局-浮动方法</title>
<style type="text/css">
* { margin:0; padding:0; }
#wrap { padding:0 300px 0 200px; *overflow:hidden;  }
#main { float:left; 100%; }
#left, #right { position:relative; _display:inline; }
#left { 200px; float:left; margin-left:-100%; right:200px; _right:-300px; }
#right { 300px; float:right; margin-right:-300px; }
</style>
</head>
<body>
<div id="wrap">
 <div id="main">
 <p style="height:999px; background:#fffaba; ">content</p>
 </div>

 <div id="left">
 <p style="height:999px; background:#8fc41f;">left</p>
 </div>
 <div id="right">
 <p style="height:999px; background:#00b7ef;">right2</p>
 </div>
</div>
</body>
</html>
复制代码

后记:关于侧栏宽度固定,主要部分宽度自适应的布局是再普通不过了,而大部分人的做法就是把侧栏放在自适应盒子前面,

然后进行浮动解决,从来没有想过使用最优化的html文档流完成这个布局。第一种方法由于用了绝对定位,适合在特殊应用中使用,

常规布局推荐使用第二种解决。

此题原文转自:http://www.planeart.cn/?p=446

在原文基础上进行修改。

——————————————————————————————————————————————————————————————————————

Doctype?严格模式与混杂模式,如何触发这两种模式,区分它们有何意义?

Doctype(document type 文档类型)

可声明三种DTD(document type definition 文档类型固定)类型,分别表示严格版本、过渡版本以及基于框架的 HTML 文档。

HTML

HTML 4.01 规定了三种文档类型:Strict、Transitional 以及 Frameset。

HTML Strict DTD(HTML严格模式)

如果您需要干净的标记,免于表现层的混乱,请使用此类型。请与层叠样式表(CSS)配合使用:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "
http://www.w3.org/TR/html4/strict.dtd">

HTML Transitional DTD(过度版本)

Transitional DTD 可包含 W3C 所期望移入样式表的呈现属性和元素。如果您的读者使用了不支持层叠样式表(CSS)的浏览器以至于您不得不使用 HTML 的呈现特性时,请使用此类型:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">

Frameset DTD

Frameset DTD 应当被用于带有框架的文档。除 frameset 元素取代了 body 元素之外,Frameset DTD 等同于 Transitional DTD:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "
http://www.w3.org/TR/html4/frameset.dtd">

进一步讲解

严格模式:必须按照声明的标准执行,规定元素的位置后,这个元素就必须在这个位置不能乱动。

好处:层次分明,便于阅读。

混杂模式:标准比较宽松,主要为了兼容,模拟老式浏览器去看老网站。了解一下就行。

关于触发

严格模式:都会有一个DTD,比如上面的DTD HTML 4.01

混杂模式:①声明一个混杂模式的DTD

     ②如果严格模式找不到他要执行的标准,就会变成混杂模式

区分它们的意义:

严格模式:有些老的浏览器不支持新技术设计网页的标准,所以用新技术设计的网页无法显示

混杂模式:为了让使用老浏览器的用户看到你网页的内容。

举个例子

标准模式:就如一个标准美女,样子好看,不过做饭,干家务等基本不会。

混杂模式:不是美女,有可能很普通、有可能很难看,不过能干家务。

你娶媳妇的时候觉得这两个有区别没?

——————————————————————————————————————————————————————————————————————

行内元素有哪些?块级元素有哪些?CSS的盒模型?

行内元素:

就是内联元素(inline element)一般都是基于语义级(semantic)的基本元素。内联元素只能容纳文本或者其他内联元素。

其实就是元素与元素之间不换行

a:锚点

img:图片

abbr:缩写

acronym:首字

input:输入框

span:常用内联容器,定义文本内区块

select:项目选择

var:定义变量

label:表格标签

code:计算机代码(在引用源码的时候需要)

big:大字体

b:粗体(不推荐

br:换行

cite:引用

dfn:定义字段

em:强调

i:斜体

kbd:定义键盘文本

q:短引用

s:中划线(不推荐)

samp:定义范例计算机代码

small:小字体文本

strike:中划线

strong:粗体强调

sub:下标

sup:上标

textarea:多行文本输入框

u:下划线

块级元素:

块元素一般都从新行开始,它可以容纳内联元素和其他块元素,常见块元素是段落标签P。form这个块元素比较特殊,它只能用来容纳其他块元素。  

块元素(block element)和内联元素(inline element)都是html规范中的概念。块元素和内联元素的基本差异是块元素一般都从新行开始。

而当加入了css控制以后,块元素和内联元素的这种属性差异就不成为差异了。

比如,我们完全可以把内联元素cite加上display:block这样的属性,让他也有每次都从新行开始的属性。 

块元素(block element)
address:地址   
blockquote:块引用   
center:举中对齐块   
dir:目录列表   
div:常用块级容易,也是css layout的主要标签   
dl:定义列表   
fieldset-form:控制组   
form:交互表单   
h1:大标题

h2:副标题

h3:3级标题

h4:4级标题

h5:5级标题

h6:6级标题
hr:水平分隔线
menu:菜单列表   
noframes:frames可选内容(对于不支持frame的浏览器显示此区块内容) 
noscript:可选脚本内容(对于不支持script的浏览器显示此内容)   
ol:排序表单   
p:段落   
pre:格式化文本   
table:表格   
ul:非排序列表

CSS的盒子模型

顾名思义,就是用把某些内容用一个盒子包装起来,需要给这个盒子设定一些属性,才能让这个盒子看起来是个盒子

属性名:

内容:content 要放一只大闸蟹

填充:padding 需要冷藏,就用冰块,这个属性就是冰块填了多厚

边框:border 盒子纸质的厚度,用什么颜色的纸

边界:margin 别的盒子离这个盒子的距离

把上面这几个属性属性说明一下,那主考官就知道了,除非他不了解CSS

——————————————————————————————————————————————————————————————————————

如果让你来制作一个访问量很高的大型网站,你会如何来管理所有CSS文件、JS与图片

在原答案基础上,加上我个人建站的心得。

回答:涉及到人手、分工、同步;

前期团队必须确定好网站全局样式(globe.css),编码模式(utf-8)等;

编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行);

继承式写法举例

function test(a,b)

{}

var date1 =new date;
date1.test(a,b);
var date1 =new date;
date1.test(a,b);

标注样式编写人,各模块都及时标注(标注关键样式调用的地方);

易于纠正错误,查清责任。

页面进行标注(例如 页面 模块 开始和结束);

CSS跟HTML分文件夹并行存放,命名都得统一(例如style.css)

JS 分文件夹存放 命名以该JS功能为准英文翻译;

图片采用png8(256色PNG类型图片格式的别名)其他别的图片文件格式也行,保证格式基本一致,不要这几张用JPG,那几张用GIF

格式相同的整合在一起,使用方便,便于将来的管理

——————————————————————————————————————————————————————————————————————

用JS实现随机选取10到100之间的10个数字,存入到数组,并排序。

在网上看到一道题,算是有一定难度,然后那题给出的答案无论是语法还是算法,错得一塌糊涂。

以下给我自己写的答案

复制代码
<script>
var array=[];
function getRandom(start,end)
{
    var choice=end-start;
    var a1=[];
    for(var i=0;i<91;i++)
    {
        a1[i]=i+10
    }
    var a2=[];
    for(var i=0;i<10;i++)
    {
        a2.push(a1.splice(Math.floor(Math.random()*a1.length) , 1));
        a2.sort();
    }
    return a2;
}
array.push(getRandom(10,100));
alert(array);
</script>
复制代码

测试通过,有更好答案的朋友麻烦告诉我这低能儿一声,感激不尽。

——————————————————————————————————————————————————————————————————————

双击表格每一列头进行该列整行排序,再双击倒序。(腾讯2012前端开发笔试题)

涉及到很多知识点,建议认真看看。不愧为腾讯,这题实在不容易。

复制代码
  1 以下的代码直接存为sortTable.js,在页面中包含:
  2 <script type="text/javascript" src="sortTable.js"></script>
  3 
  4 function ieOrFireFox(ob)
  5 {       
  6     if (ob.textContent != null)       
  7     return ob.textContent;       
  8     var s = ob.innerText;       
  9     return s.substring(0, s.length);       
 10 }       
 11        
 12 //排序 tableId: 表的id,iCol:第几列 ;dataType:iCol对应的列显示数据的数据类型       
 13 function sortAble(tableId, iCol, dataType)
 14 {       
 15     var table = document.getElementById(tableId);       
 16     var tbody = table.tBodies[0];       
 17     var colRows = tbody.rows;       
 18     var aTrs = new Array;       
 19     //将将得到的列放入数组,备用       
 20     for (var i=0; i < colRows.length-1; i++)
 21     {       
 22         aTrs[i] = colRows[i+1];       
 23     }       
 24                                                
 25     //判断上一次排列的列和现在需要排列的是否同一个。       
 26     if (table.sortCol == iCol) 
 27     {       
 28         aTrs.reverse();       
 29     } 
 30     else 
 31     {       
 32         //如果不是同一列,使用数组的sort方法,传进排序函数       
 33         aTrs.sort(compareEle(iCol, dataType));       
 34     }                
 35     oFragment = document.createDocumentFragment(); 
 36     
 37     for (var i=0; i < aTrs.length; i++)
 38     {       
 39         oFragment.appendChild(aTrs[i]);       
 40     }                       
 41     tbody.appendChild(oFragment);       
 42     //记录最后一次排序的列索引       
 43     table.sortCol = iCol;       
 44 }       
 45     //将列的类型转化成相应的可以排列的数据类型       
 46 function convert(sValue, dataType) 
 47 {       
 48     switch(dataType)
 49     {       
 50         case "int":       
 51             return parseInt(sValue);       
 52         case "float":       
 53             return parseFloat(sValue);       
 54         case "date":       
 55             return new Date(Date.parse(sValue));       
 56         default:       
 57             return sValue.toString();       
 58     }       
 59 }       
 60             
 61 //排序函数,iCol表示列索引,dataType表示该列的数据类型       
 62 function compareEle(iCol, dataType) 
 63 {       
 64     return function (oTR1, oTR2)
 65     {       
 66         var vValue1 = convert(ieOrFireFox(oTR1.cells[iCol]), dataType);       
 67         var vValue2 = convert(ieOrFireFox(oTR2.cells[iCol]), dataType);       
 68         if (vValue1 < vValue2)
 69         {       
 70             return -1;       
 71         } 
 72         else if (vValue1 > vValue2)
 73         {       
 74             return 1;
 75         } 
 76         else 
 77         {     
 78             return 0;       
 79         }       
 80     };       
 81 }      
 82 
 83 
 84 
 85 
 86 然后直接在页面中就可以使用排序方法了:  
 87 
 88 表格写法:  
 89 <table width="96%" height="" border="0" id="tableId">  
 90 <tr>                              
 91 <th >日期</th>  
 92 <th onclick="sortAble('tableId', 1)" style="cursor:pointer">某列</th>
 93 <th onclick="sortAble('tableId', 2)" style="cursor:pointer">某列</th>
 94 <th onclick="sortAble('tableId', 3)" style="cursor:pointer">某列</th>
 95 <th >某列</th>
 96 <th >某列</th>  
 97 <th onclick="sortAble('tableId', 6, 'int')" style="cursor:pointer">某整数列</th>  
 98 </tr>  
 99 <tr>  
100 jsp循环生成列表数据  
101 </tr>  
102 </table>
复制代码

XML DOM textContent 属性

定义和用法

textContent 属性返回或设置选定元素的文本。

如果返回文本,则该属性返回元素节点内所有文本节点的值。

如果设置文本,则该属性删除所有子节点,并用单个文本节点来替换它们。

语法:

返回文本:

elementNode.textContent

设置文本:

elementNode.textContent=string

JavaScript sort() 方法

定义和用法

sort() 方法用于对数组的元素进行排序。

语法

arrayObject.sort(sortby)
参数 描述
sortby 可选。规定排序顺序。必须是函数。

返回值

对数组的引用。请注意,数组在原数组上进行排序,不生成副本。

说明

如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。

如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:

  • 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
  • 若 a 等于 b,则返回 0。
  • 若 a 大于 b,则返回一个大于 0 的值。

在本例中,我们将创建一个数组,并按字母顺序进行排序:

复制代码
<script type="text/javascript">

var arr = new Array(6)
arr[0] = "10"
arr[1] = "5"
arr[2] = "40"
arr[3] = "25"
arr[4] = "1000"
arr[5] = "1"

document.write(arr + "<br />")
document.write(arr.sort())

</script>
复制代码

输出:

10,5,40,25,1000,1
1,10,1000,25,40,5

请注意,上面的代码没有按照数值的大小对数字进行排序,要实现这一点,就必须使用一个排序函数:

复制代码
<script type="text/javascript">

function sortNumber(a,b)
{
return a - b
}

var arr = new Array(6)
arr[0] = "10"
arr[1] = "5"
arr[2] = "40"
arr[3] = "25"
arr[4] = "1000"
arr[5] = "1"

document.write(arr + "<br />")
document.write(arr.sort(sortNumber))

</script>
复制代码

输出:

10,5,40,25,1000,1
1,5,10,25,40,1000

实例

复制代码
 1 <html>
 2 <body>
 3 
 4 <script type="text/javascript">
 5 
 6 function sortNumber(a, b)
 7 {
 8 return a - b
 9 }
10 
11 var arr = new Array(6)
12 arr[0] = "10"
13 arr[1] = "5"
14 arr[2] = "40"
15 arr[3] = "25"
16 arr[4] = "1000"
17 arr[5] = "1"
18 
19 document.write(arr + "<br />")
20 document.write(arr.sort(sortNumber))
21 
22 </script>
23 
24 </body>
25 </html>
复制代码

输出:

10,5,40,25,1000,1
1,5,10,25,40,1000 

HTML <th> 标签

定义表格内的表头单元格。

HTML 表单中有两种类型的单元格:

  • 表头单元格 - 包含表头信息(由 th 元素创建)
  • 标准单元格 - 包含数据(由 td 元素创建)

th 元素内部的文本通常会呈现为居中的粗体文本,而 td 元素内的文本通常是左对齐的普通文本。

实例

普通的 HTML 表格,包含两行两列:

复制代码
<table border="1">
  <tr>
    <th>Company</th>
    <th>Address</th>
  </tr>

  <tr>
    <td>Apple, Inc.</td>
    <td>1 Infinite Loop Cupertino, CA 95014</td>
  </tr>
</table>
复制代码

HTML <col> 标签

 <col> 标签为表格中一个或多个列定义属性值。

如需对全部列应用样式,<col> 标签很有用,这样就不需要对各个单元和各行重复应用样式了。

您只能在 table 或 colgroup 元素中使用 <col> 标签。

实例

col 元素为表格中的三个列规定了不同的对齐方式:

复制代码
<table width="100%" border="1">
  <col align="left" />
  <col align="left" />
  <col align="right" />
  <tr>
    <th>ISBN</th>
    <th>Title</th>
    <th>Price</th>
  </tr>
  <tr>
    <td>3476896</td>
    <td>My first HTML</td>
    <td>$53</td>
  </tr>
</table>
复制代码

HTML DOM rows 集合

定义和用法

rows 集合返回表格中所有行(TableRow 对象)的一个数组,即一个 HTMLCollection。

该集合包括 <thead>、<tfoot> 和 <tbody> 中定义的所有行。

语法

tableObject.rows[]

实例

下面的例子使用了 rows 集合来显示第一行中的内容:

复制代码
 1 <html>
 2 <head>
 3 <script type="text/javascript">
 4 function showRow()
 5   {
 6   alert(document.getElementById('myTable').rows[0].innerHTML)
 7   }
 8 </script>
 9 </head>
10 <body>
11 
12 <table id="myTable" border="1">
13 <tr>
14 <td>Row1 cell1</td>
15 <td>Row1 cell2</td>
16 </tr>
17 <tr>
18 <td>Row2 cell1</td>
19 <td>Row2 cell2</td>
20 </tr>
21 </table>
22 <br />
23 <input type="button" onclick="showRow()" value="Show innerHTML">
24 
25 </body>
26 </html>
复制代码

CSS cursor 属性

定义和用法

cursor 属性规定要显示的光标的类型(形状)。

该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状(不过 CSS2.1 没有定义由哪个边界确定这个范围)。

描述
url

需使用的自定义光标的 URL。

注释:请在此列表的末端始终定义一种普通的光标,以防没有由 URL 定义的可用光标。

default 默认光标(通常是一个箭头)
auto 默认。浏览器设置的光标。
crosshair 光标呈现为十字线。
pointer 光标呈现为指示链接的指针(一只手)
move 此光标指示某对象可被移动。
e-resize 此光标指示矩形框的边缘可被向右(东)移动。
ne-resize 此光标指示矩形框的边缘可被向上及向右移动(北/东)。
nw-resize 此光标指示矩形框的边缘可被向上及向左移动(北/西)。
n-resize 此光标指示矩形框的边缘可被向上(北)移动。
se-resize 此光标指示矩形框的边缘可被向下及向右移动(南/东)。
sw-resize 此光标指示矩形框的边缘可被向下及向左移动(南/西)。
s-resize 此光标指示矩形框的边缘可被向下移动(北/西)。
w-resize 此光标指示矩形框的边缘可被向左移动(西)。
text 此光标指示文本。
wait 此光标指示程序正忙(通常是一只表或沙漏)。
help 此光标指示可用的帮助(通常是一个问号或一个气球)。

——————————————————————————————————————————————————————————————————————

——————————————————————————————————————————————————————————————————————

——————————————————————————————————————————————————————————————————————

HTML DOM 对象

HTML DOM hash 属性

复制代码
 1 <html>
 2 <head>
 3 <script type="text/javascript">
 4 function changeLink()
 5 {
 6 document.getElementById('venus').hash="bottom"
 7 }
 8 </script>
 9 </head>
10 <body>
11 
12 <img src="/i/eg_planets.jpg"
13 usemap="#planetmap" />
14 
15 <map name="planetmap">
16 <area
17 id="venus"
18 shape="circle"
19 coords="180,139,14"
20 href ="/example/hdom/venus2.html#top"
21 alt="Venus" />
22 </map>
23 
24 <input type="button" onclick="changeLink()" value="改变链接" />
25 
26 </body>
27 </html>
原文地址:https://www.cnblogs.com/christal-11/p/5684500.html