5.JavaScript

  • ECMAScript:客户端脚本语言的标准,且JavaScript = ECMAScript + JavaScript自己特有的东西(BOM+DOM)
5.1.基本语法
5.1.1.与html结合方式
  1. 内部JS:
    • 定义<script>,标签体内容就是js代码
  2. 外部JS:
    • 定义<script>,通过src属性引入外部的js文件

    <script>可以定义在html页面的任何地方。但是定义的位置会影响执行顺序。且<script>可以定义多个。

5.1.2.注释
  1. 单行注释://注释内容
  2. 多行注释:/*注释内容*/
5.1.3.数据类型:
  • 原始数据类型(基本数据类型):
    1. number:数字。 整数/小数/NaN(not a number 一个不是数字的数字类型)
    2. string:字符串。 字符串 “abc” “a” ‘abc’
    3. boolean:true 和 false
    4. null:一个对象为空的占位符
    5. undefined:未定义。如果一个变量没有给初始化值,则会被默认赋值为undefined
  • 引用数据类型:对象
5.1.4.变量
  • 变量:一小块存储数据的内存空间
  • Java语言是强类型语言,而JavaScript是弱类型语言。
  • 强类型:在开辟变量存储空间时,定义了空间将来存储的数据的数据类型。只能存储固定类型的数据
  • 弱类型:在开辟变量存储空间时,不定义空间将来的存储数据类型,可以存放任意类型的数据。
  • 语法:var 变量名 = 初始化值;
  • typeof运算符:获取变量的类型。

    null运算后得到的是object

5.1.5.运算符
  1. 一元运算符:只有一个运算数的运算符
    • ++,-- , +(正号)
    • ++ --: 自增(自减)
      • ++(–) 在前,先自增(自减),再运算
      • ++(–) 在后,先运算,再自增(自减)
    • +(-):正负号
    • 注意:在JS中,如果运算数不是运算符所要求的类型,那么js引擎会自动的将运算数进行类型转换
      • 其他类型转number:
        • string转number:按照字面值转换。如果字面值不是数字,则转为NaN(不是数字的数字)
        • boolean转number:true转为1,false转为0
  2. 算数运算符:+、-,*,/ 、% …
    var str = "123";
    var i = "23";
    
    console.log(str - i);  //100
    console.log(typeof(str - i));  //number
    
    console.log(str + i);  //146
    console.log(typeof(str + i));  //number
    
    console.log(str * i);  //2829
    console.log(typeof(str * i));  //number
    
  3. 赋值运算符:=、+=、-+ …
  4. 比较运算符:>、<、 >=、<=、<mark>、</mark>=(全等于)、!==(全不等于)
    • 比较方式
      • 类型相同:直接比较
        • 字符串:按照字典顺序比较。按位逐一比较,直到得出大小为止。
      • 类型不同:先进行类型转换,再比较
        • ===:全等于。在比较之前,先判断类型,如果类型不一样,则直接返回false
        • !==:全不等于。全等于的相反
  5. 逻辑运算符:&&、||、!
  6. 三元运算符: ? : 表达式
    • 表达式? 值1:值2;
    • 判断表达式的值,如果是true则取值1,如果是false则取值2;
  7. 其他类型转boolean:
    1. number:0或NaN为假,其他为真
    2. string:除了空字符串(""),其他都是true
    3. null&undefined:都是false
    4. 对象:所有对象都为true
5.1.6.流程控制语句:
  • if…else…
  • switch:
    • 在java中,switch语句可以接受的数据类型: byte int shor char,枚举(1.5) ,String(1.7)
    • switch(变量),case 值。
  • 在JS中,switch语句可以接受任意的原始数据类型
  • while
  • do…while
  • for:用来遍历数组
  • 增强for:用来遍历对象
    var arr = ["zs", "ls", "wu", "zl"]
    arr.aaa = "aaa"  //数组的属性
    console.log(arr)
    
    // 遍历数组元素: 用来遍历数组
    // aaa不会被遍历到
    for (var i = 0; i < arr.length; i++) {
         
        console.log(arr[i])
    }
    
    var obj = {
         name: "zs", age: "18"}
    // 专用于遍历属性: 用来遍历对象
    // aaa会被遍历到
    for( var item in obj){
         
        // console.log(item)
        console.log(obj[item])
    }
    
5.1.7.JS变量声明和函数
  1. 语句以;结尾,如果一行只有一条语句则;可以省略 (不建议)
  2. 变量的定义使用var关键字,也可以不使用
    • 用: 定义的变量是局部变量
    • 不用:定义的变量是全局变量(不建议)
  3. alert()是弹出窗口,必须确定才可以继续执行,document.write函数是打印在网页上
  4. console.log()函数是打印在浏览器开发者模式的控制台上,常用于调试
  5. ES6语法中可以使用let关键字表示变量的局部声明,如for循环里的 for(let i = 0;i<n;i++)
  6. ES6语法中,可以用const关键字声明一个变量,不可修改
  7. typeof关键字:返回变量类型;instanceof:检测变量类型(但是有很奇怪的bug)
    var str = "zs";
    console.log(type str); //string
    console.log(str instanceof String); //false
    //很奇怪,第二句打印了是string类型的,但是检测一下又打印false,奇怪
    
5.1.8.Example
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
		    <title>99乘法表</title>
	<style> td{
     border: 1px solid; } </style>

	<script> document.write("<table align='center'>"); //1.完成基本的for循环嵌套,展示乘法表 for (var i = 1; i <= 9 ; i++) {
     document.write("<tr>"); for (var j = 1; j <=i ; j++) {
     document.write("<td>"); //输出 1 * 1 = 1 document.write(i + " * " + j + " = " + ( i*j) +"&nbsp;&nbsp;&nbsp;"); document.write("</td>"); } //输出换行 document.write("<br>"); document.write("</tr>"); } //2.完成表格嵌套 document.write("</table>"); </script>

</head>
<body>	
</body>
</html>
5.2.基本对象
5.2.1.Function:函数(方法)对象
  1. 创建:
	1. var fun = new Function(形式参数列表,方法体);  //不建议使用
    2. function 方法名称(形式参数列表){
   
            方法体
        }
    3. var 方法名 = function(形式参数列表){
   
            方法体
        }
  1. 方法:
  2. 属性:length:代表形参的个数
  3. 特点:
    1. 方法定义是,形参的类型不用写,返回值类型也不写。
    2. 方法是一个对象,如果定义名称相同的方***覆盖
    3. 在JS中,方法的调用只与方法的名称有关,和参数列表无关
    4. 在方法声明中有一个隐藏的内置对象(数组),arguments,封装所有的实际参数
  4. 调用:方法名称(实际参数列表);
5.2.2.Array:数组对象
  1. 创建:
    • var arr = new Array(元素列表);
    • var arr = new Array(默认长度);
    • var arr = [元素列表];
  2. 方法
    • join(参数):将数组中的元素按照指定的分隔符拼接为字符串
    • push():向数组的末尾添加一个或更多元素,并返回新的长度。
    • toString() 返回数组转换的数组值(逗号分隔)的字符串。
    • pop() 方法从数组中删除最后一个元素,返回删除的元素
    • push() 方法(在数组结尾处)向数组添加一个新的元素,返回数组长度
    • splice() 方法可用于向数组添加新项, 返回([])
    • sort() 方法以字母顺序对数组进行排序,返回值和原数组是经过排序的数组
    • reverse() 方法反转数组中的元素。返回值和原数组都变为经过反转数组
  3. 属性:length:数组的长度
  4. 特点:
    • JS中,数组元素的类型可变的。
    • JS中,数组长度可变的。
5.2.3.Boolean
  • var myBoolean=new Boolean();
  • var myBoolean=new Boolean(0);
  • var myBoolean=new Boolean(null);
  • var myBoolean=new Boolean("");
  • var myBoolean=new Boolean(false);
5.2.4.Date:日期对象
  1. 创建:
    • var date = new Date();
  2. 方法:
    • toLocaleString():返回当前date对象对应的时间本地字符串格式
    • getTime():获取毫秒值。返回当前如期对象描述的时间到1970年1月1日零点的毫秒值差
5.2.5.Math:数学对象
  1. 创建:
    • 特点:Math对象不用创建,直接使用。 Math.方法名();
  2. 方法:
    • Math.random():返回 0 ~ 1 之间的随机数。 含0不含1
    • Math.ceil(x):对数进行上舍入。
    • Math.floor(x):对数进行下舍入。
    • Math.round(x):把数四舍五入为最接近的整数。
    • Math.max(x,y,z,…,n):返回最大值
    • Math.min(x,y,z,…,n):返回最小值
  3. 属性:
    • PI
5.2.6.Number
  1. 创建
    • var x1=34.00; //使用小数点来写
    • var x2=34; //不使用小数点来写

      只要是个数,那么就是数值型的,无论整浮、无论大小、无论正负,都是number类型的

  2. 方法
    • toString():以字符串返回数值
    • toFixed():返回字符串值,它包含了指定位数小数的数字(四舍五入)
    • toPrecision():返回字符串值,它包含了指定长度的数字
    • parseInt():允许空格。只返回首个数字
    • parseFloat():允许空格。只返回首个数字:
    • split():将字符串转换为数组
  3. 属性
    • MIN_VALUE:最小值
    • MAX_VALUE:最大值
5.2.7.String
  1. 创建
    • var str=‘123s’;
    • var str=“123s”;
    • var str = new String(“123s”);
  2. 方法
    • indexOf()方法返回字符串中指定文本首次出现的索引(位置),不存在返回 -1。
    • slice() 提取字符串的某个部分并在新字符串中返回被提取的部分。
    • split() 将字符串转换为数组
  3. 属性
    • length:数组长度
5.2.8.RegExp:正则表达式对象
  • 正则表达式:定义字符串的组成规则。
    1. 单个字符:[],如: [a] [ab] [a-zA-Z0-9]
      • 特殊符号代表特殊含义的单个字符:
        • \d:单个数字字符 [0-9]
        • \w:单个单词字符[a-zA-Z0-9_]
    2. 量词符号:
      • ?:表示出现0次或1次
      • *:表示出现0次或多次
      • +:出现1次或多次
      • {m,n}:表示 m<= 数量 <= n
        • m如果缺省: {,n}:最多n次
        • n如果缺省:{m,} 最少m次
    3. 开始结束符号
      • ^:开始,$:结束
  • 正则对象:
    1. 创建
      • var reg = new RegExp(“正则表达式”);
      • var reg = /正则表达式/;
    2. 方法:test(参数):验证指定的字符串是否符合正则定义的规范
5.2.9.Global
  1. 特点:全局对象,这个Global中封装的方法不需要对象就可以直接调用。 方法名();
  2. 方法:
    • encodeURI():url编码
    • decodeURI():url解码
    • encodeURIComponent():url编码,编码的字符更多
    • decodeURIComponent():url解码
    • parseInt():将字符串转为数字,逐一判断每一个字符是否是数字,直到不是数字为止,将前边数字部分转为number
    • isNaN():判断一个值是否是NaN
      • NaN六亲不认,连自己都不认。NaN参与的==比较全部问false
    • eval(): JavaScript 字符串,并把它作为脚本代码来执行。
  3. URL编码
5.3.DOM简单介绍
5.3.1.功能:
  • 控制html文档的内容
5.3.2.获取页面标签(元素)对象:Element
  • document.getElementById(“id值”):通过元素的id获取元素对象
5.3.3.操作Element对象:
  • 修改属性值:
    1. 明确获取的对象是哪一个?
    2. 查看API文档,找其中有哪些属性可以设置
  • 修改标签体内容:属性:innerHTML
    1. 获取元素对象
    2. 使用innerHTML属性修改标签体内容
5.3.***
  • 功能: 某些组件被执行了某些操作后,触发某些代码的执行。

    • 造句: xxx被xxx,我就xxx
      • 我方水晶被摧毁后,我就责备对友。
      • 敌方水晶被摧毁后,我就夸奖自己。
  • 如何绑定事件

    1. 直接在html标签上,指定事件的属性(操作),属性值就是js代码
    • 事件:onclick— 单击事件
    1. 通过js获取元素对象,指定事件属性,设置一个函数
  • 事件案例

<body>
    
    <img id="light" src="img/off.gif" onclick="fun();">
    <img id="light2" src="img/off.gif">

	<script> function fun(){
     alert('我被点了'); alert('我又被点了'); } function fun2(){
     alert('咋老点我?'); } //1.获取light2对象 var light2 = document.getElementById("light2"); //2.绑定事件 light2.onclick = fun2; </script>

</body>


//电灯开关
	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>电灯开关</title>
	
	</head>
	<body>
	
	<img id="light" src="img/off.gif">
	
	<script> /* 分析: 1.获取图片对象 2.绑定单击事件 3.每次点击切换图片 * 规则: * 如果灯是开的 on,切换图片为 off * 如果灯是关的 off,切换图片为 on * 使用标记flag来完成 */ //1.获取图片对象 var light = document.getElementById("light"); var flag = false;//代表灯是灭的。 off图片 //2.绑定单击事件 light.onclick = function(){
     if(flag){
    //判断如果灯是开的,则灭掉 light.src = "img/off.gif"; flag = false; }else{
     //如果灯是灭的,则打开 light.src = "img/on.gif"; flag = true; } } </script>
	</body>
	</html>
5.4.BOM
5.4.1.概念
  • Browser Object Model 浏览器对象模型

  • 将浏览器的各个组成部分封装成对象。

5.4.2.组成:
  • Window:窗口对象
  • Navigator:浏览器对象
  • Screen:显示器屏幕对象
  • History:历史记录对象
  • Location:地址栏对象
5.4.3.Window:窗口对象
  1. 创建
  2. 方法
    1. 与弹出框有关的方法:
      • alert():显示带有一段消息和一个确认按钮的警告框。
      • confirm():显示带有一段消息以及确认按钮和取消按钮的对话框。
        • 如果用户点击确定按钮,则方法返回true
        • 如果用户点击取消按钮,则方法返回false
      • prompt():显示可提示用户输入的对话框。
        • 返回值:获取用户输入的值
    2. 与打开关闭有关的方法:
      • close():关闭浏览器窗口。谁调用我 ,我关谁
      • open():打开一个新的浏览器窗。返回新的Window对象
    3. 与定时器有关的方式
      • setTimeout():在指定的毫秒数后调用函数或计算表达式。
        • 参数:
          • js代码或者方法对象
          • 毫秒值
        • 返回值:唯一标识,用于取消定时器
      • clearTimeout() 取消由 setTimeout() 方法设置的 timeout。
      • setInterval() 按照指定的周期(以毫秒计)来调用函数或计算表达式。
      • clearInterval() 取消由 setInterval() 设置的 timeout。
  3. 属性:
    1. 获取其他BOM对象:
      • history
      • location
      • Navigator
      • Screen:
    2. 获取DOM对象
      • document
  4. 特点
    • Window对象不需要创建可以直接使用 window使用。 window.方法名();
    • window引用可以省略,直接使用 方法名();
5.4.4.Location:地址栏对象
  1. 创建(获取):
    • window.location
    • location
  2. 方法:
  • reload():重新加载当前文档。刷新
  1. 属性
  • href:设置或返回完整的 URL。
5.4.5.History:历史记录对象
  1. 创建(获取):
    • window.history
    • history
  2. 方法:
    • back() 加载 history 列表中的前一个 URL。
    • forward() 加载 history 列表中的下一个 URL。
    • go(参数) 加载 history 列表中的某个具体页面。
    • 参数:
      • 正数:前进几个历史记录
      • 负数:后退几个历史记录
  3. 属性:
    • length:返回当前窗口历史列表中的 URL 数量。
5.5.DOM
5.5.1.概念:
  • Document Object Model 文档对象模型
  • 将标记语言文档的各个组成部分,封装为对象。可以使用这些对象,对标记语言文档进行CRUD的动态操作
5.5.2.W3C DOM标准
  • 核心DOM - 针对任何结构化文档的标准模型
    • Document:文档对象
    • Element:元素对象
    • Attribute:属性对象
    • Text:文本对象
    • Comment:注释对象
    • Node:节点对象,上述5个对象的父对象
  • XML DOM - 针对 XML 文档的标准模型
  • HTML DOM - 针对 HTML 文档的标准模型
    dom加载文档:dom树
                               文档
                                |
                            根元素<html>
                                |
           ------------------------------------------------------
           |													|
           |													|
        元素<head>										    元素<body>
           |													|
           |									      ----------------------------
        元素<title>									 |							|
           |						属性:href------ 元素<a>                    元素<h1>
           |										  |							 |
        文本:文档标题								  文本:我的链接				 文本:我的标题	
    
    
    对于dom结点:
        dom树中的节点彼此拥有层级关系(由节点构成)
        整个文档是一个文档节点
        每个HTML元素是元素节点 
        HTML元素内的文本是文本节点 
        每个HTML属性是属性节点 
        注释是注释节点
        在节点树中,顶端节点被称为根(root) 
        每个节点都有父节点、除了根(它没有父节点) 
        一个节点可拥有任意数量的子节点,父、子和同胞(兄弟或姐妹)节点。 
        同胞是拥有相同父节点的节点 
    
  • dom加载顺序
    1. 超链接/form/直接输入 --à 告诉浏览器一个url
    2. 浏览器拿到这个url : 解析(url里面可能有域名) 如果域名对应一个ip,那么进行Dns解析(hosts文件. )(dns服务器)
    3. 浏览器根据带ip地址的url, 在互联网上找到这台服务器, (端口)
    4. 服务器,接收这次请求, 分析url第三部分分析参数, 准备相应的资源(html代码), 返回
    5. 浏览器获得返回的html代码
    • 解析HTML结构(从上向下的过程)。(已经一边解析一边构建dom树)
    • 加载外部脚本和样式表文件(导入从css js文件)。
    • 解析并执行脚本代码。
    • 构造HTML DOM模型。 (完成DOM树的构建并显示)
    • 加载图片等外部文件。
    • 页面加载完毕。
5.5.3.核心DOM模型:
  • Document:文档对象
    • 创建(获取):在html dom模型中可以使用window对象来获取
      • window.document
      • document
    • 方法:
      • 获取Element对象:
        • getElementById():根据id属性值获取元素对象。id属性值一般唯一
        • getElementsByTagName():根据元素名称获取元素对象们。返回值是一个数组
        • getElementsByClassName():根据Class属性值(即CSS的修饰)获取元素对象们。返回值是一个数组
        • getElementsByName():根据name属性值获取元素对象们。返回值是一个数组
      • 创建其他DOM对象:
        • createAttribute(name)
        • createComment()
        • createElement()
        • createTextNode()
    • 属性
  • Element:元素对象
    • 获取/创建:通过document来获取和创建
    • 方法:
      • removeAttribute():删除属性
      • setAttribute():设置属性
  • Node:节点对象,其他5个对象的父对象
    • 特点:所有dom对象都可以被认为是一个结点
    • 方法:
      • CRUD dom树:
        • appendChild():向节点的子结点列表的结尾添加新的子结点。
        • removeChild():删除(并返回)当前结点的指定子结点。
        • replaceChild():用新节点替换一个子结点。
    • 属性:
      • parentNode:返回节点的父结点。
      • childNode:返回结点的子结点

    个人理解:可以把其他五个对象当做五个类的对象,这五个类中有很多方法,而Node类的对象就是这五个类的父类,所以五个对象也可以用Node的方法

5.5.4.HTML DOM
  1. 标签体的设置和获取:innerHTML、innerText
  2. 使用html元素对象的属性
  3. 控制元素样式
    • 使用元素的style属性来设置
    //修改样式方式1
        div1.style.border = "1px solid red";
        div1.style.width = "200px";
    //font-size--> fontSize
        div1.style.fontSize = "20px";	 
    
    • 提前定义好类选择器的样式,通过元素的className属性来设置其class属性值。
    • 利用事件来修改内容
    <div id="div1">
        div
    </div>
    <button onclick="changediv()">改变</button>
    
    function changediv() {
    	var divNode = document.getElementById("div1")
        var textNode = document.createTextNode('div1')
        divNode.replaceChild(textNode, divNode.childNodes[0])
    }
    
    //和上面的方式是一样的,但是更简便
    function changediv() {
        // 无法解析b标签
        // document.getElementById("div1").innerText = "<b>div1</b>"
        // 可以解析b标签
        document.getElementById("div1").innerHTML = "<b>div1</b>"
    }
    
5.5.5.DOM树的CRUD
  • 添加结点
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <ul id="ul1">
        <li>zs</li>
        <li>ls</li>
        <li>wu</li>
    </ul>
    <input id="inputstr"><button onclick="add()">添加</button>

    <script> function add() {
     // 获得input这个节点 var inputNode = document.getElementById('inputstr') // 用户的输入值 var inputStr = inputNode.value // 根据用户输入的值, 创建一个文本节点 var textNode = document.createTextNode(inputStr) // 创建一个结点(创建一个li结点) var liNode = document.createElement("li") // 给li结点天际一个子文本结点 liNode.appendChild(textNode) // 获得input这个节点 var ulNode = document.getElementById('ul1') // 给ul这个节点添加一个新的孩子, newChild ulNode.appendChild(liNode) // 给input这个节点的value置空 inputNode.value = "" } </script>

</body>
</html>
  • 删除结点
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul id="ul1" ><li>zs</li><li>ls</li><li>wu</li></ul>

<input id="inputstr"><button onclick="deleteli()">删除</button>

<script> function deleteli() {
     var inputNode = document.getElementById('inputstr') var inputStr = inputNode.value var ulNode = document.getElementById('ul1') // var liNodes = document.getElementsByTagName('li') // 获得ulNode这个节点的所有子节点 var childNodes = ulNode.childNodes; console.log(childNodes) // 参数要求: 要删除是哪一个子节点 ulNode.removeChild(childNodes[inputStr]) } </script>

</body>
</html>
  • 修改结点
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul id="ul1" ><li>zs</li><li>ls</li><li>wu</li></ul>

改变位置:<input id="inputtag"><br>
改变内容:<input id="inputstr">
<button onclick="changeli()">改变</button>

<script> function changeli() {
     // 获得下标, 以及改变的内容 var inputTagNode = document.getElementById('inputtag') var inputStrNode = document.getElementById('inputstr') var liNode = document.createElement('li') var textNode = document.createTextNode(inputStrNode.value) liNode.appendChild(textNode) var ulNode = document.getElementById('ul1') // 参数要求: 新节点, 旧结点 ulNode.replaceChild(liNode , ulNode.childNodes[inputTagNode.value]) } </script>

</body>
</html>
5.6.事件监听机制
5.6.1.概念
  • 某些组件被执行了某些操作后,触发某些代码的执行。
  • 事件:某些操作。如: 单击,双击,键盘按下了,鼠标移动了
  • 事件源:组件。如: 按钮 文本输入框…
  • ***:代码。
  • 注册监听:将事件,事件源,***结合在一起。 当事件源上发生了某个事件,则触发执行某个***代码。
5.6.2.常见的事件
  • 点击事件:
    • onclick:单击事件
    • ondblclick:双击事件
  • 焦点事件
    • onblur:失去焦点
    • onfocus:元素获得焦点。
  • 加载事件:
    • onload:一张页面或一幅图像完成加载。
  • 鼠标事件:
    • onmousedown 鼠标按钮被按下。
    • onmouseup 鼠标按键被松开。
    • onmousemove 鼠标被移动。
    • onmouseover 鼠标移到某元素之上。
    • onmouseout 鼠标从某元素移开。
  • 键盘事件:
    • onkeydown 某个键盘按键被按下。
    • onkeyup 某个键盘按键被松开。
    • onkeypress 某个键盘按键被按下并松开。
  • 选择和改变
    • onchange 域的内容被改变。
    • onselect 文本被选中。
  • 表单事件:
    • onsubmit 确认按钮被点击。
  • onreset 重置按钮被点击。
    • onchange 该事件在表单元素的内容改变时触发( , , , 和 )
5.7.Example:汇率转换器
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style> td{
     width: 200px; height: 30px; text-align: center; } [colspan]{
     background: red; } div{
     margin: 0 0 5px 0; } select{
     height: 35px; } button{
     height: 33px; } input{
     height: 30px; } </style>
</head>
<body>

<!-- 成套标签:select:option -->

    <div>
        <select id="select1" onchange="getrate()">
            <option value="0">美元</option>
            <option value="1">人民币</option>
            <option value="2">欧元</option>
            <option value="3">日元</option>
            <option value="4">韩币</option>
            <option value="5">港币</option>
        </select>
        <button onclick="changeselected()">互换</button>
        <select id="select2" onchange="getrate()">
            <option value="0">美元</option>
            <option value="1">人民币</option>
            <option value="2">欧元</option>
            <option value="3">日元</option>
            <option value="4">韩币</option>
            <option value="5">港币</option>
        </select>
        数额:
        <input id="inputstr">
        <button onclick="getrate()">按汇率换算</button>


    </div>
    <table border="1">
        <tr>
            <td colspan="3">按当前汇率换算结果</td>
        </tr>
        <tr>
            <td id="td11">人民币</td>
            <td>汇率</td>
            <td id="td13">美元</td>
        </tr>
        <tr>
            <td id="td21">1</td>
            <td id="td22">0.16</td>
            <td id="td23">6</td>
        </tr>

    </table>


    <script> function changeselected() {
     var select1Node = document.getElementById('select1') var select2Node = document.getElementById('select2') var mid = select1Node.value select1Node.value = select2Node.value select2Node.value = mid } var arrRate = [1, 6, 0.9, 100, 1000, 7 ] var arrStr = ['美元', '人民币', '欧元', '日元', '韩币', '港币'] // 不行: html(表单元素value) css js // 存储? 存储 function getrate() {
     var inputMoney = document.getElementById('inputstr').value var select1Value = document.getElementById('select1').value var select2Value = document.getElementById('select2').value if (inputMoney == ""){
     return } var rate = arrRate[select2Value] /arrRate[select1Value] var money = rate * inputMoney console.log(typeof rate) document.getElementById('td11').innerText = arrStr[select1Value] document.getElementById('td13').innerText = arrStr[select2Value] document.getElementById('td21').innerText = inputMoney document.getElementById('td22').innerText = rate document.getElementById('td23').innerText = money } </script>

</body>
</html>