学java第43天 JS DOM&Ajax

JavascriptDOM&Ajax

1. DOM

1.1.DOM概述 document Object Model

1.2. 元素操作

<div id="mydiv">这是我的div</div>
<div>
	<input type="text" name="username" />
	<input type="checkbox" name="hobboy" value="java"/>java
	<input type="checkbox" name="hobboy" value="C"/>C	
	<span>那些年错过的大雨</span>
</div>



查找:
document.getElementById()
通过标签元素的ID获取到标签对象[id具有唯一性]
document.getElementsByName()
通过标签元素的name属性获取到标签对象,返回的是数组
document.getElementsByTagName()
通过标签名称获取到标签对象,返回的是数组
[node].parentNode:父节点,返回Node
获取指定元素的父节点
doocument.documentElement:获取根节点   <html>
document.body: 获取body节点  <body>
创建和添加:
document.createElement()
创建新的元素
insertBefore(newnode, refnode)
在childNodes中的refnode之前插入newnode,返回Node
appendChild()
父节点追加子节点
删除:
removeChild()
   父节点删除子节点

1.3. 属性和样式操作

setAttribute(“type”,”button”) --  node.type=’button’
	设置属性
getAttribute(“type”) -- node.type
	获取属性值
removeAttribute()				
删除某属性;
node.style.样式
    设置样式
node.className
    设置样式名

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			.div {
				background-color: green;
			}
		</style>
		<script type="text/javascript">
			window.onload = function() { //页面加载完成之后才执行函数
				/*属性操作*/
				var mydiv = document.getElementById("mydiv")

				//添加属性
				mydiv.setAttribute("name", "littlevv")
				mydiv.setAttribute("name", "Bigvv")
				/*样式的操作part1*/
				//css 
				mydiv.style.backgroundColor = "palevioletred"
				/*样式的操作part2*/
				document.getElementById("div").className = "div";
			}
		</script>
	</head>
	<body>
		<div id="mydiv">这是我的div</div>

		<div id="div">
			<input type="text" name="username" value="username" />
			<input type="checkbox" name="hobboy" value="java" />java
			<input type="checkbox" name="hobboy" value="C++" />C
			<span>那些年错过的啊炜</span>
	</body>
</html>

1.4.文本操作

innerHTML

   设置或者获取带有标签的元素

innerText

设置或者获取元素中的纯文本

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			.div {
				background-color: aqua;
			}
		</style>
		<script type="text/jscript">
			window.onload = function() { //页面加载事件:页面加载完成之后才执行函数
					/*文本操作:innerText*/
					var div = document.getElementById("div");
					/*添加*/
					div.innerText = "scsccccc";
					//覆盖修改
					div.innerText = "<input type='text' value='123456'>";
					//删除
					div.innerText = "";
					/*查*/
					var text = div.innerText;
					console.debug(text)
					/*文本操作:innerHTML*/
					/**/
					div.innerHTML = "dfasdfasd"
					div.innerHTML = "<input type='text' value='123456'>"
					console.debug(div.innerHTML)
		</script>
	</head>
	<body>
		<div id="mydiv">这是div</div>
		<div id="div">
	</body>
</html>

1.5. 事件注册方式

\1. 注册事件通常有二种方式:

  1. 元素上直接注册

    function b t n 1 ( ) c o n s o l e . d e b u g ( ′ 我 点 了 ′ ) ; < i n p u t t y p e = " b u t t o n " i d = " b t n 1 " v a l u e = " 我 点 " o n c l i c k = " btn1() { console.debug('我点了'); } <input type="button" id="btn1" value="我点" οnclick=" btn1()console.debug();<inputtype="button"id="btn1"value=""onclick="btn1();" />

  2. 元素.事件名称

    var $btn2 = document.getElementById(“btn2”);
    $btn2.onclick = function() {
    console.debug(‘我又点了’);
    }

API

onabort用户终止页面加载。
onblur	用户离开对象。失去焦点
onchange	用户改变对象的值。
onclick	用户点击对象。
ondblclick	用户双击对象。
onfocus(和onblur相反)	用户激活对象。
onkeydown	按下键盘。
onkeypress	按压键盘。
onkeyup	松开键盘。
onload	页面完成加载。注释:在 Netscape 中,当页面加载时会发生该事件。
onmousedown	用户按鼠标按钮。
onmousemove	鼠标指针在对象上移动。
onmouseover	鼠标指针移动到对象上。
onmouseout	鼠标指针移出对象。
onmouseup	用户释放鼠标按钮。
onreset	用户重置表单。
onselect	用户选取页面上的内容。
onsubmit	用户提交表单。
onunload	用户关闭页面。
  1. 第一种注册

i. 直接在元素上绑定对应的方法

ii. 缺点:js代码与html代码写在一起了

  1. 第二种注册

i. 通过元素.事件名称去动态绑定

2.Ajax异步请求

2.1. Ajax概述

① 传统请求

② 异步请求

③ 异步请求的使用场景

④ 异步请求的实质

写ajax代码就是写js代码,学习ajax其实是学习使用浏览器的ajax(XMLHttpRequest对象)对象发异步请求,将响应的数据局部更新到页面;

2.2. 如何获取Ajax对象

如何获取Ajax对象

\1. AJAX对象本身是浏览器中的一个对象,但在低版本IE中表现为一个ActiveX。所以在使用JavaScript语言进行创建该对象时,Ajax没有标准化,需要区分不同的浏览器;

\2. 有时候我们会把XMLHttpRequest对象称为AJAX对象,或异步对象

创建方式1:判断方式

function getXhr(){
var xhr = null;
if(window.XMLHttpRequest){//针对其他浏览器
xhr = new XMLHttpRequest();
}else{//针对低版本的ie浏览器
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
return xhr;
}

创建方式2:try…catch…方式

var ajax;
try {
//如果是其它浏览器,这句代码可以成功,ajax对象就拿到了
ajax  = new XMLHttpRequest(); 
} catch (e) {
//如果是IE,上面肯定会报错,被抓取,就执行下面这句代码(IE支持)
ajax = new ActiveXObject("Microsoft.XMLHTTP"); 
}

2.3. Ajax的Api

https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/open

2.4. Ajax发送get请求

/* 创建ajax的核心对象 */
	function createXhr(){
		try{
			return new XMLHttpRequest();//主流浏览器是支持的
		}catch(e){
			return new ActiveXObject("Microsoft.XMLHTTP"); //针对低版本的IE浏览器支持创建的 核心对象
		}
		
	}
	function getTimer(){
		//创建ajax的核心对象
		var xhr = createXhr();
		/*
			发送请求的准备工作
				1.第一个参数:使用GET提交还是POST提交
				2.第二个参数:请求的url地址
				3.第三个参数:请求是同步还是异步
						true:异步
						false:同步
		*/
		xhr.open("GET","/getTimer",true);
		//准备监听函数,监听ajax发送请求状态的改变和响应状态码
		xhr.onreadystatechange = function(){
			//当readyState=4的时候,就代表后台数据已经响应完成
			if(xhr.readyState==4 && xhr.status==200){
				var text = xhr.responseText;
				alert(text);
			}
		}
		//发送请求
		xhr.send();
	}

2.5. Ajax发送Post请求

function login(){
		//获取用户名的值
		var username = document.getElementById("username").value;
		//获取密码的值
		var password = document.getElementById("password").value;
		//创建ajax的核心对象
		var xhr = new XMLHttpRequest();
		//发送请求的准备工作
		xhr.open("POST","/login",true); 
		//准备监听函数,监听请求状态的改变和状态码的值
		xhr.onreadystatechange = function(){
			//4代表后台响应完毕,200代表响应码成功			
			if(xhr.readyState==4&&xhr.status==200){
				//返回后台相应的数据
				var text = xhr.responseText;
				if("true"==text){
					//跳转到新界面
					location.href="/success.html";
				}else{
					alert("登陆失败!!用户名或者密码错误!!");
				}
			}
		}
		//使用ajax的post提交,你要让后台传递参数,你还得设置请求头信息
		xhr.setRequestHeader("content-type","application/x-www-form-urlencoded");//传递的参数是以普通文本传输的
		//准备参数
		var param = "username="+username+"&password="+password;
		//发送请求
		xhr.send(param);
		//send的语法格式: xhr.send([param]);  注意:只有post提交传递参数才放到send方法内部
	}

2.6. Ajax请求编码问题

2.6.1. 解决GET请求时的乱码问题

前台:

\1. 使用encodeURI对请求地址进行编码。encodeURI会使用utf-8对请求地址中的中文参数进行编码:xhr.open(“get”, encodeURI(uri) , true);

后台:指定字符集进行解码(tomcat8及其以上不需要,默认就是UTF-8)

\1. Tomcat可以修改conf/server.xml文件中 ,使得tomcat按UTF-8方式解码;

2.6.2. POST请求时的乱码问题

\1. 因为所有浏览器在进行POST方式提交时都是使用UTF-8方式进行编码的,到了服务器端则默认使用ISO-8859-1方式来解码;

\2. 所以只需要修改服务器端的解码格式,保证是UTF-8的方式来解码就可以避免乱码:request.setCharacterEncoding(“UTF-8”);

2.7. Ajax请求IE缓存问题

\1. IE浏览器提供的AJAX对象,在发送GET请求时,会先查看是否访问过该地址,如果该地址已经访问过,那么浏览器不再发送请求;

\2. 表现在页面上是,第一次点击某功能会得到数据,但是如果多次反复点击想获取最新数据时页面不会有任何变化,因浏览器发现地址相同而拒绝发出请求;

\3. 但这种页面表现只出现在IE浏览器中,Chrome浏览器和Firefox浏览器都能够实现数据的获取和页面的刷新;

\4. 缓存问题演示:从后台获取随机数更新到页面

\5. 测试结果:ie浏览器存在缓存问题,其他浏览器正常

\6. 如何解决:

(1) 发送post请求

(2) 欺骗浏览器,请它以为我们正在发送不同的请求:

Ø xhr.open(‘get’,‘random?r=’ + Math.random()); //通过随机数

Ø xhr.open(‘get’,‘random?’ + (new Date()).getTime()); //通过时间戳

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值