javascript 原生

引入JS

  • 引入外部js代码存放在assets包中,因为android打包 H5 对assets 不进行编译默认

  • 用户代理从上至下读 ,正常 js 放置最低端 ,css 放置前面

  • 如果想要js放前面需要添加属性defer : 下载完后,再执行js


<script type="text/javascript" src="./assets/js/index.js" defer="defer"></script>

<!--async 异步: 另起一个线程去打开js-->

<script type="text/javascript" src="./assets/js/index.js" async></script>

<!--标签 noscript: -->
<noscript>
	你的浏览器不支持js
</noscript>

状态 : 304 从js缓存中加载

数据类型

console.log("hello js")
var a = '100',
	b = '200'
console.log(typeof(a) ) //string
var d = parseInt(a) + parseInt(b);

console.log(d)
// undefined
var e
console.log(typeof(e))

var f = null
console.log(f) //null

// json 原生的JavaScript 对象object
var j = {
	"name" : "djl",
	"sex":1
}
console.log(typeof(j))

//boolean 类型
var bo = true
var po = false
console.log(typeof(po) ) //boolean
var num = 1 // 数字类型 十进制
console.log(Number.MIN_VALUE)
console.log(Number.MAX_VALUE)
//大数字 Infinity
var bigNum = 1.7976931348623157e+500
console.log(isFinite(bigNum)) // 判断是否在限制内	 , 也能判断是否是数字
console.log(bigNum) // 输出Infinity

var num8 = 0254 // 如果数字转换不了8进制,默认转换十进制
var num16 = 0xA // 十六进制
var f1 = 1.1 // 浮点类型
var e1 = 2e2 // 200
console.log(e1)
if(typeof(num) == "number"){
	console.log(typeof(num) )
}

//NaN
var n1 = 0
var n2 = "hello"
console.log(n1/n2)

console.log(Number("数字转换")) //NAN
console.log(Number(true)) //1
console.log(Number("1.99")) //1.99
console.log(parseInt("数字转换")) //NAN
console.log(parseInt("1.99")) //1
console.log(parseInt(true)) //NAN
console.log(parseFloat("1.99")) //1.99
var st = 1;
console.log(typeof(st.toString())) //string

//函数
var fun = function(a){
	console.log("a 函数被调用" + a)
}
fun(121) // 调用

语句

//语句:

var a = 2;
if(a<2){
	console.log("小于2")
}else if(a>2){
	console.log("大于2")
}else{
	console.log("等于2")
}
switch(a){
	case 1:
		console.log("等于1");
		break;
	case 2:
		console.log("等于2");
		break;
	case 3:
		console.log("等于3");
		break;
}

var blo = true;
while(blo){
	console.log("this is while")
	if(blo = true){
		blo = false;
	}
}
do{
	console.log("do..while")
}while(false)

//for.. in
var user={
	"name" : "djl",
	"age" :12
}
var arr = [1,2,3,4,5]
for(var u in user){
	// 得到json 的key  获取value
	console.log(u +":" +user[u])
}
for(var a in arr){
	// 得到数组的下表  获取数组的值
	console.log(a +":" +arr[a])
}

//with 语句 方便修改对象的属性
with(user){
	name="changename",
	age = 123
}
console.log(user.name + "--" + user.age)

//break 中断循环 continue 不往下执行单次循环
for(var i=0;i<10;i++){
	if(i==1){
		continue
	}
	console.log(i)
	if(i==3){
		break
	}
}
// label
var count_num = 1;
if(i < 10){
	label_a:
		for(var i=0;i<3;i++){
			if(a==2){
				continue label_a // 跳出去再循环一次
			}
			a++
			console.log(a);
		}
}
console.log(a);

函数

//普通函数
function f_fun_1(x,y){
	return x+y;
}
/*普通函数*/
var add = function(x,y){
	return x+y;
}

/*构造函数*/
var People = function(name,age,heigh){
	this.name = name;
	this.age = age;
	/*可以使用this  设置对象的属性*/
	switch(heigh){
		case 170 :
		 	this.BMH=[1,2,3]
		 	break
		default:
		 	this.BMH=[4,5,6]
	}
	this.say=function(str){
		console.log(this.name +" say:"+str)
	}

}
var p = new People("张三",33,170);
console.log(p.name+"-----"+p.age+"-----"+p.BMH);
p.say(666)

/*匿名函数*/
var add =(function(x,y){
	return x + y
})(1,2)
console.log(add)

对象

  • 对象的原型 proto
  • 函数的原型 prototype
  1. 原型:让程序往上追溯
  2. 函数中的this 指的是上一层的对象,
  3. 只有对象中使用this
//对象
var obj1 = {}
//var obj2 = new Object()
obj1.name='djl';
obj1.age = '123';

obj1["first name"] ='www'
console.log(obj1["first name"] +"--"+obj1.name)

// this使用
obj1.fullname = function(){
	return this["first name"] +"--"+this.name;
}
console.log(obj1.fullname())
// 删除对象属性
delete obj1.name

/*修改原型的方法*/
obj1.__proto__.toString= function(){
	return "对象无法转换"
}
console.log(obj1.toString())



//1 .工厂模式
function CreateFactory(name){
	var obj = new Object()
	obj.name = name
	return obj
}

var a = new CreateFactory("djl")
console.log(a.name)

//2 .构建函数
var cfactory = function(name){
	this.name = name
}
var b = new cfactory("djl");
console.log(b.name);

//3. 原型模式
function pfactory(name){
	pfactory.prototype.name = name
	pfactory.prototype.info = function(){
		console.log("prototype ------------")
	}
}
var c = new pfactory("adada");
console.log(c.name)
c.info()

//4. 不允许修改的属性
var a = {
	_name :"djl",
	age : 123
}
/*只针对一个属性的配置*/
Object.defineProperty(a,"name",{
	writeable:true,	 //是否可修改
	enumerable:false, //是否可列举
	configurable:false, //是否可删除
	//value:"tho", // 直接修改值 与 get 冲突
	get:function(){
		console.log("哎!被读取了")
		return "MR." + this._name
	},
	set:function(){
		console.log("哎!被修改了")
	}
})
var obj = {
	name :"djl",
	age : 123
}
/*针对所有属性的配置 , 方便后续日志记录*/
Object.defineProperties(obj,{
	name:{
		writeable:true,	 //是否可修改
		enumerable:false, //是否可列举
		configurable:false, //是否可删除
		//value:"tho", // 直接修改值 与 get 冲突
		get:function(){
			console.log("哎!被读取了")
			return "MR." + this._name
		},
		set:function(){
			console.log("哎!被修改了")
		}
	},
	age:{
		get:function(){
			console.log("年龄被读取了")
			return this.age
		},
		set:function(){
			console.log("年龄被修改了")
		}
	}
})
obj.age=123 //年龄被修改了

/*设置了enumerable 则不可用for 读取出*/
for (w in a){
	console.log(w)
}

console.log(a.name)

/*得到设置的描述*/
var info = Object.getOwnPropertyDescriptor(a,"_name");
console.log(info)

数组

/**数组**/

var arr = new Array()
arr[0]='ww'
arr[1] =0
console.log(arr.toString())
var arr2 = [1,2,3,4,{"name":123}]
console.log(arr2.toString())

/*数组的操作*/
arr2.pop(); //删除最后一个
console.log(arr2.toString())
arr2.push("last data")// 添加到最后一位
console.log(arr2.toString()) 
arr2.unshift("fisrt data") // 添加在第一位
console.log(arr2.toString()) 
arr2.shift() //删除第一位
console.log(arr2.toString())

//连接数组
arr = arr.concat(arr2)
console.log(arr.toString())

//splice 的用法 从第1 位开始删除到第3位 再在第一位处插入后面的内容
arr.splice(1,3,"删除了很多","插入的多个")
console.log(arr.toString())
//翻转
arr.reverse()
console.log(arr.toString())
//按字母排序
arr.sort()
console.log(arr.toString())

function paixu(a,b){
	return a - b
}
arr.sort(paixu)
console.log(arr.toString())

//join

var arr3 = ["列表1","列表2","列表3","列表4","列表5","列表6"]

var msg = arr3.join(" | ")

console.log(msg) //列表1 | 列表2 | 列表3 | 列表4 | 列表5 | 列表6

作用域


// 基本类型
// 引用类型
var a = 1
var b = a
b = 2
console.log(a , b)  // a =1  b =2

var a = {}
var b = a
a.name = "123"
console.log(a,b) // a == b


// 局部作用域中
function add_1(x){
	x++
	return x
}
var x = 1
var y = add_1(x)
console.log(x) // x=1

function changeObj(obj){
	obj.name = "wwwww"
}
var ob1 = {}
var ob2 = changeObj(ob1)
console.log(ob1) //{name: "wwwww"}

//全局作用域
var url;
function getUrl(){
	with(window){
		url = location.href;
	}
}
getUrl()

console.log(window.url)

//a ='alert("hello word")';
//eval(a)

Document

document.nodeType=9

var doc = document.getElementsByTagName("title")[0].innerHTML
console.log(doc)
document.getElementsByTagName("title")[0].innerHTML = "hello document"

/*新增节点*/
var ul = document.getElementById("ul");
var li = document.createElement("li")
li.setAttribute("id","newLi")
li.innerHTML="nihao"
//最后面插入
ul.appendChild(li)

/*插入到标签中某个位置之前:*/
document.body.insertBefore(ul,document.body.childNodes[3])
/*删除子节点*/
var newLi = document.getElementById("newLi");
ul.removeChild(newLi)

console.log(document.nodeType) // document.nodeType=9  标识一个dom对象
console.log("页面标题"+document.title)
console.log(document.URL ) //得到http://服务器名:端口号/
console.log(document.domain) //得到服务器名
console.log(document.referrer) //来源页面 哪个页面跳转过来的

console.log(document.anchors) //页面a 标签
console.log(document.forms) //页面所有的表单标签
console.log(document.images) //所有的图片
console.log(document.links) //页面a 标签


/*页面加载完毕后执行*/
window.onload = function(){
	//页面内容被替换,使用这种方式可以关闭页面
	document.write(new Date(),"<p>你好</p>")
}

Element

document.nodeType=1


var obj = document.getElementById("djldjl"); 
console.log(obj.nodeType)//1
console.log(obj.nodeName)//A
console.log(obj.tagName)//A

console.log(obj.id) //djldjl

console.log(obj.name) // 获取name 属性

console.log(obj.innerHTML)

/*自定义属性*/
obj.setAttribute("myattr","dwdwdw");
var attr = obj.getAttribute("myattr")
console.log(attr)

Text类型

document.nodeType=3

/*Text 类型 : 元素内的内容 ,不包括元素也没有子元素*/
var obj =  document.getElementById("ul"); 
console.log(obj.firstChild.nodeType)
console.log(obj.childNodes[0]) //text类型
console.log(obj.firstChild) //text类型
console.log(obj.lastChild) //text类型

var obj =  document.getElementById("p"); 
var child = obj.firstChild //得到文本类型
console.log(child)
console.log(child.nodeValue)
console.log(child.parentNode)

child.appendData("后面追加内容")
child.insertData(0,"前面追加")

child.deleteData(0,10) //删除文本字符串
child.replaceData(0,10,'[这里被替换了]')
child.splitText(5) //切分Text 对象
obj.normalize() // 合并obj 下的Text 对象

// 添加textNode 对象

var div  = document.createElement("div")
div.id ="tempInsert"
var textNode = document.createTextNode("hello word")
div.appendChild(textNode)
document.body.appendChild(div)
div.append("追加的内容")
textNode.nodeValue ="可以随时通过对象进行更改内容"

nodeType其他类型


/**
 * 1. 注释类型noteType = 8 Comment 类型
 */
var body = document.body
console.log(body.childNodes[3].nodeType)
var comment = document.createComment("comment 类型为 8")
body.appendChild(comment);

/**
 * 2. DocumentFragment 类型 暂存不显示 noteType 为11
 */
var fragment = document.createDocumentFragment();
var div = document.createElement("div");
var text=document.createTextNode("hello word")
div.appendChild(text)
fragment.appendChild(div)
body.appendChild(fragment)

视口数据


/*视口数据*/
//获取div的高 
/*
        body,div{
		margin: 0;
		padding: 0;
	}
	#big{
		height: 200px;
		width: 200px;
		padding: 66px;
		margin: 77px;
		border: 10px solid green;
		overflow: scroll;
	}
	#small{
		height: 500px;
		width: 500px;
		background-color: red;
	}

	<div id="big">
		<div id="small">
			
		</div>
	</div>
*/

//获取body的话
var obj = document.body;
var obj =  document.getElementById("big"); 
var height = obj.offsetHeight; //352  视口200 + padding 66*2 + border 10*2
var width = obj.offsetWidth;   //352   	
var scrollHeight = obj.scrollHeight //632  实际内容物尺寸  500 + 66*2
var scrollWidth = obj.scrollWidth   //566  滚动条右侧是没有padding 500 + 66
var clientHeight = obj.clientHeight; //315 内容高度   200 + padding * 2 - scroll宽度 17px
var clientWidth = obj.clientWidth;  //315

var offsetLeft = obj.offsetLeft; //离左侧多远  77
var offsetTop = obj.offsetTop;	//离顶部多远  只有左上 77

 obj.scrollLeft = 30; //调整初始化的时候滚动条的位置
var scrollLeft = obj.scrollLeft; //滚动条滚动的X轴位置 0
var scrollTop = obj.scrollTop;  //滚动条滚动的Y轴位置 0

console.log("滚动条",scrollLeft +"\t"+ scrollTop)
//352 | 352 | 632 | 566 | 315 | 315
console.log([height,width,scrollHeight,scrollWidth,clientHeight,clientWidth,offsetLeft,offsetTop].join(" | "))

CSS操作

  • element.style.margin="100px 100px";
  • element.style.setProperty("margin","100px 100px")
  • element.setAttribute("style","重写样式")
  • element.style.cssText="重写样式"
//css 操作 
//setAttribute 操作
var body = document.body;
body.setAttribute("style","background-color:red")

// 对象属性操作
var bodyStyle = body.style
bodyStyle["background-color"] = "yellow"
bodyStyle.backgroundColor= "blue"

//css Text
bodyStyle.cssText="background-color:#ddd"

//setProperty 设置属性
bodyStyle.setProperty("background-color","#000")

//得到用户代理的属性
var box = document.getElementById("bg")
console.log(window.getComputedStyle(box).backgroundColor)
//获取伪元素
console.log(window.getComputedStyle(box,":hover").backgroundColor)

DOM事件

//dd2 是一个函数,移除的时候要声明这个函数
element.addEventListener("click",dd2,false)
element.removeEventListener("click",dd2,false)


mouseenter 鼠标移入  mouseleave 鼠标移除

function show(val) {
	console.log("hello word" + val)
}
//添加监听
var uid = document.getElementById("uid")

uid.addEventListener('click',function(){
	show('监听点击事件');
},false) // false 是否冒泡

//匿名函数的形式是不允许移除监听的,只有这样声明才可以移除 ,移除监听节省内存
//uid.addEventListener("click",show,false)	
//uid.removeEventListener('click',show)

uid.addEventListener("djl",function(event){
	console.log(event.value)
},false)

var event = document.createEvent("HTMLEvents") //原生的用户代理事件
event.initEvent("djl",true,true) 
uid.dispatchEvent(event) //调用事件 随时出发 


//1. 捕获阶段 window -> element
//2. 目标阶段 element-> target
//3. 冒泡阶段 element -> window
// p 在div 标签内
var div = document.getElementById("div")
var p = document.getElementById("p")
function callback(event){
	console.log(event.currentTarget.tagName)
	if(event.currentTarget.tagName.toLowerCase() == "p"){
		console.log("监听事件代理")
		event.stopPropagation() //取消继续向上传播 父传播结束
		event.stopImmediatePropagation() //取消其他相同绑定事件,不会执行callback2 同一事件传播结束
	}
}
function callback2(event){
	console.log(event.currentTarget.tagName)
	if(event.currentTarget.tagName.toLowerCase() == "p"){
		console.log("2-监听事件代理")
		event.stopPropagation() //取消继续向上传播
	}
}
div.addEventListener("click",callback,false);
p.addEventListener("click",callback,false);
p.addEventListener("click",callback2,false);

mouse事件

  • console.log(event.screenY) //整个屏幕
  • console.log(event.clientY) // 页面顶部
  • console.log(event.pageY) // 整个页面(包括滚轮滚动的)

//click 之前有两个事件发生 mousedown  和 mouseup 
//mousemove 鼠标移动事件
//mouseover mouseout  会产生事件冒泡
//mouseleave mouseenter  一次性事件
//添加监听
var uid = document.getElementById("uid")

uid.addEventListener('click',function(event){
	show('监听点击事件');
	
	console.log("点击事件的对象",event.target)
	console.log("连续点击次数",event.detail)
	console.log("点击类型",event.type)
	event.target.value = parseInt(event.target.value) + event.detail;

},false) // false 是否冒泡
div.addEventListener("mousemove",function(event){
	console.log("x轴"+event.clientX ,"y轴"+event.clientY)
},false)
div.addEventListener("mousedown",function(event){
	console.log("鼠标按下:",event.type);
	
},false)
div.addEventListener("mouseup",function(event){
	console.log("鼠标松开",event.type);

},false)

div.addEventListener("mouseleave",function(event){
	console.log("鼠标移出",event.type);

},false)
div.addEventListener("mouseenter",function(event){
	console.log("鼠标移入",event.type);
},false)
//右键的行为
div.addEventListener("contextmenu",function(event){
	console.log("鼠标移入",event.type);
	event.returnValue=false; //禁止右键

},false)

//鼠标滚轮的支持
div.addEventListener("mousewheel",function(event){
	console.log("鼠标上下滚动,滚轮距离顶部的距离",event.offsetY);
},false)

//鼠标点击的时候键盘事件监测,H5游戏中使用居多
function showkey(event){
	console.log("ALT 按键是否点击" + event.altKey)
	console.log("CTRL 按键是否点击" + event.ctrlKey)
	console.log("SHIFT 按键是否点击" + event.shiftKey)
	console.log("META 按键是否点击" + event.metaKey)
}
var div = document.getElementById("div")
//移动端手势库 Touch.js
//手机端点击事件
div.addEventListener("touchstart",function(event){
	console.log("点击的时候产生的事件",event.type);
},false)
//手机端点击后移动事件
div.addEventListener("touchmove",function(event){
	console.log("手机端点击后移动事件",event.type);
},false)
//手机端点击结束事件
div.addEventListener("touchend",function(event){
	console.log("手机端点击结束事件",event.type);
	},false)
		

keyboard 事件


//键盘事件
var age = document.getElementById("age")
//按住
age.addEventListener("keypress",function(event){
	console.log(event.type)
	console.log(event.target.value)
},false)
//按下
age.addEventListener("keydown",function(event){
	console.log(event.type)
	console.log(event.target.value)
},false)
//松开
age.addEventListener("keyup",function(event){
	// console.log(event.type)
	// console.log(event.target.value)
	// showKey(event)
	console.log("输出按键对应的键值"+event.keyCode)	
	//数字校验
	var reg = /^\+?[1-9][0-9]*$/;

	var ageValue = event.target.value;
	if(reg.test(ageValue)){
		document.getElementById("age-alert").innerHTML =""
	}else{
		document.getElementById("age-alert").innerHTML ="error : is number"
		event.target.value = ageValue.substring(0,ageValue.length -1);
	}
	//回车事件
	if(event.keyCode == 13){
		

		document.getElementById("name").focus()
	}
},false)

//点击的时候是否按住按键
function showKey(event){
	console.log("ALT KEY 按住" + event.altkey)
}

进度事件


//进度事件
window.onload = function(){

}
//等同于
window.addEventListener("load",function(){

}.false)
//图片加载事件
var img = document.getElementById("img")
img.src = "whttp://img.17sucai.com/upload/701856/2018-05-15/5e60ed43e782ebc4408e51d32f80c735.png?x-oss-process=style/big"
img.addEventListener("load",function(event){
	console.log("图片加载事件"+ event.target.nodeType)
},false)
img.addEventListener("error",function(event){
	console.log("图片加载错误事件")
	event.target.src="https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1539092862&di=ebdecc66f1928f06bdb4feafcf62c318&src=http://pic.58pic.com/58pic/17/47/06/15i58PIC8V7_1024.jpg"
	event.target.style.cssText="width:100%";
	event.target.setAttribute("alt","888")
},false)

//loadstart  loadend  只针对video
var video = document.getElementById("video")
video.addEventListener("loadstart",function(event){
	console.log(event.type)
},false)
video.addEventListener("loadend",function(event){
	console.log(event.type)
},false)

拖拽事件


<img src="./assets/images/dd.png" style="max-width: 300px;" draggable = "true" id="img">
<div style="background-color: yellow;height: 1800px;width: 800px;float: right;" id="div">
</div>
<script type="text/javascript">
	var img = document.getElementById("img")
	var x= 0,y=0;
	img.addEventListener("drag",function(event){
		console.log("实时拖拽" + event.type)
	},false)
	img.addEventListener("dragstart",function(event){
		console.log("开始拽动" + event.type)
		event.target.style.opacity=0.5
		event.target.style.border="1px solid red"
		//图片距离屏幕的高度
		console.log(img.offsetLeft )
		console.log(img.offsetTop )
		
		/**
		 screenX:鼠标位置相对于用户屏幕水平偏移量,而screenY也就是垂直方向的,此时的参照点也就是原点是屏幕的左上角
		 clientX:跟screenX相比就是将参照点改成了浏览器内容区域的左上角,该参照点会随之滚动条的移动而移动。
		 pageX:参照点也是浏览器内容区域的左上角,但它不会随着滚动条而变动
		 */
		//鼠标离屏幕的距离
		console.log(event.pageX )
		console.log(event.pageY )
		console.log(event.clientX )
		console.log(event.clientY )
		x = event.pageX  - img.offsetLeft
		y = event.pageY  - img.offsetTop 
	},false)
	img.addEventListener("dragend",function(event){
		console.log("结束拽动" + event.type)
		event.target.style.opacity=1
		event.target.style.border="none"
		event.target.style.position="absolute"
		//鼠标离屏幕的距离
		console.log(event.pageX )
		console.log(event.pageY )
		console.log(event.clientX )
		console.log(event.clientY )

		event.target.style.left = event.pageX -x +"px" 
		event.target.style.top = event.pageY  -y + "px"

	},false)
	//区域被动拽入和拽出事件
	var div =document.getElementById("div")
	div.addEventListener("dragenter",function(event){
		event.target.style.backgroundColor="red"
	},false)
	div.addEventListener("dragleave",function(event){
		event.target.style.backgroundColor="yellow"
	},false)
	div.addEventListener("dragover",function(event){
		event.target.style.backgroundColor="green"
	},false)
</script>

CSS动画

  1. 通过@keyframes 来定义关键帧动画 伪类 : from to 百分比{样式} css 中通过animation 来引用

/*关键帧动画*/
@keyframes donghua{
	from{
		background-color: red
	}
	to{
		background-color: yellow
	}
}
@keyframes donghua2{
	0% {background-color: red;left: 0px;}
	25% {background-color: yellow;left: 50px;}
	50% {background-color: blue ;left: 100px;}
	75% {background-color: black ;left: 150px;}
	100% {background-color: pink;left: 200px;}
}
/*css animation 动画计算方法*/
#box{
	/*引用那个动画,效果持续时间*/
	animation: donghua2 5s;

	animation-delay: 0s;/*页面2s后执行动画*/

	animation-iteration-count: 2;/*执行几遍*/

	animation-direction: alternate;/*第二遍逆序,依赖animation-iteration-count*/

	animation-play-state: running;/*paused 暂停 : js控制的属性*/

	animation-fill-mode: backwards;/*默认normal   forwards保存最后一帧   backwards 回到默认的时候*/

	animation-timing-function: cubic-bezier(.17,.67,.57,.81);/*贝赛尔曲线:ease 从慢到快 linear 速度相同  cubic-bezier函数 参考: http://cubic-bezier.com/#1,0,0,.98*/

	width: 100px;
	height: 100px;
	position: absolute;
	background-color: #00000047;
}

  1. transition 动作动画: 通过js 来控制transition中定义的属性并且用定时器还原 或者使用伪类来修改transition中定义的属性

<style type="text/css">
#box2{
	width: 100px;
	height: 100px;
	top:200px;
	position: absolute;
	background-color: brown;
	left: 10px;
	/*参数 : 1.触发的属性  2.效果的时间 3.贝赛尔曲线 4. 几秒后开始 */
	/*transition: width 2s cubic-bezier(.17,.67,.57,.81) 1s;*/
	/*多属性*/
	transition: width,height 2s,1s cubic-bezier(.17,.67,.57,.81) 1s;
}
/*transition 动画激发通过定义伪类 必须是在transition 中定义的属性:缺点无法控制还原*/
#box2:hover{
	width:300px;
	height: 300px;
}
</style>



<script type="text/javascript">
	/*js 触发 改变transition 中定义的属性*/
	var box2 = document.getElementById("box2");
	box2.onclick=function(event){
		box2.style.width = "300px"
		box2.style.height = "300px"
		box2.style.backgroundColor = "yellow"
		//还原
		setTimeout(function(){
			box2.style.width = "100px"
			box2.style.height = "100px"
			box2.style.backgroundColor = "brown"
		},3000)
	}
	/*transition 触发的事件*/
	box2.addEventListener("transitionend",function(event){
		console.log("动画完成触发的事件",event.type)
		console.log("动画完成的时间",event.elapsedTime)
		console.log("对哪个属性进行动画",event.propertyName)
	},false)
</script>

弹出框


<h3>弹窗</h3>
<button type="button" onclick="newwindow.document.write('<p>hello world</p>')">空白弹窗添加文字</button>
<button type="button" onclick="newwindow.moveTo(200,200)">移动到某位置</button>
<button type="button" onclick="newwindow.moveBy(50,50)">每点击一次移动距离</button>
<button type="button" onclick="newwindow.resizeTo(500,500)">更换尺寸</button>
<script type="text/javascript">
	//弹窗 1.地址  2.名称(有名字重复只会存在一个) 3.大小
	var newwindow = window.open("","newWindow","width=200,height=200")
</script>

<h3 class="class_a">系统对话框</h3>
<button type="button" onclick="alert('hello')">alter</button>
<button type="button" onclick=" if(confirm('确定?')){console.log('ok')}">confirm</button>
<!-- prompt 提示框一些浏览器不支持 -->
<script type="text/javascript">
	/*通过class属性定义js事件*/
	var class_a = document.getElementsByClassName("class_a")
	if(class_a.length > 0){
		for(i in class_a){
			if(class_a[i].nodeType == 1){
				//element 节点
				class_a[i].addEventListener('click',function(event){
					console.log("这个class_a属性的标签点击了,文本节点:",event.target.childNodes[0])

				},false)
			}
		}
	}

</script>

location

console.log("href :" + location.href)
console.log("protocol: "+ location.protocol)
console.log("hostname :" + location.hostname)
console.log("port :" + location.port)
console.log("hostname + port :" + location.host)
console.log("search :" + location.search)
console.log("hash :" + location.hash)
console.log(getQueryString("aa"))
console.log(getHashString("aa"))
function getQueryString(searchKey){
	var urlSerach = location.search
	if(urlSerach.length > 0){
		if(typeof(queryJson) === "undefined"){
			var queryJson = {}
			var arr = urlSerach.substring(1,urlSerach.length).split("&") //去掉?
			for(i in arr){
				var n = arr[i].indexOf("=")
				var key = arr[i].substring(0,n)
				var value = arr[i].substring(n+1,arr[i].length)
				queryJson[key]=value
			}
			console.log(queryJson)
		}
		if(queryJson[searchKey] != "undefined"){
			return queryJson[searchKey]
		}
	}
	return undefined
}

function getHashString(searchKey){
	var urlHash = location.hash
	if(urlHash.length>0){
		if(typeof(queryJson) === "undefined"){
			var queryJson = {}
			var arr = urlHash.substring(1,urlHash.length).split("&") //去掉#
			for(i in arr){
				var n = arr[i].indexOf("=")
				var key = arr[i].substring(0,n)
				var val = arr[i].substring(n+1,arr[i].length)
				queryJson[key] = val
			}
		}
		if(queryJson[searchKey] != "undefined"){
			return queryJson[searchKey] 
		}
	} 
	return undefined
}

导出CSV

<a id="d">导出csv</a>
<script type="text/javascript">
	var stu=[
		{"name":"djl","age":12,"sex":"男"},
		{"name":"djl2","age":22,"sex":"男2"}
			]

	var th = ""
	for(var i in stu[0]){
		th = th + "," + i
	}
 	var thead = th.substring(1,th.length)+ "\n";

 	
 	var tbody=""
 	for(var i in stu){
 		var td = ""
		for(var s in stu[i]){
			td = td +"," + stu[i][s]
		}
		tbody = tbody + td.substring(1,td.length) + "\n"
	}
	console.log(thead+tbody)
	/**
	 * name,age,sex
		djl,12,男
		djl2,22,男2
	 */
	var bom = '\uFEFF' //文件头,中文乱码解决
	var csvString = bom + thead+tbody
	var a = document.getElementById("d")
	//任何文件都可以转化为 data:http类型,数据 开头的http content-type 数据  图片是使用base64编码	
	a.href="data:text/csv," + csvString
	a.target ="_blank"
	a.download = "output.csv"
</script>

ajax

  • 同源策略 和 跨域 :浏览器限制 两个不同的域名 或者 两个不同的端口号 或者 不同的协议
  • 解决办法: jsonp 服务器设置CORS nginx 反向代理
var xhr = new XMLHttpRequest()
//true  收取返回信息  同源测录, 同一个域名下访问
xhr.open("GET","http://localhost:3000/1.xml",true)

//timeout 超时
xhr.timeout = 3000

xhr.addEventListener("timeout",function(){
	this.abort()//中断发送
},false)

//声明返回类型
//xhr.responseType = "json"
xhr.onreadystatechange=function(){
	//xhr.readyState 状态值 :0 初始化  1 启动  2 发送  3.接受 4.完成
	//xhr.status http的访问头  200 成功 400	
	if(xhr.readyState == 4 && xhr.status == 200){
		//默认读取text 文件
		//console.log(xhr.responseText)
		//配置responseType 直接转化json格式
		//console.log(xhr.response)
		//读取XML文件
		console.log(xhr.responseXML)
		document.body.appendChild(xhr.responseXML.firstChild)
	} 
}
//进度相关事件
xhr.addEventListener("progress",function(event){
	if(event.lengthComputable){ //是否开始有数据
		console.log(event)
		console.log("下载多少",event.loaded,event.total)
	}
},false)
xhr.send() 

数据存储

//cookie  得到的cookie信息 
console.log(document.cookie)
// 前端存储localStorage 的对象永久存储 同域名下  , 服务端存储的sessionStorage 服务器关闭则清空临时存储
console.log(window.localStorage,window.sessionStorage)
window.localStorage.setItem("name","djl")
window.sessionStorage.setItem("age","6666")
console.log(window.localStorage.getItem("name"))
window.localStorage.removeItem("name")
window.localStorage.clear()
//web sql T-sql语言	关系型数据库(停滞不前了) 一些登录日志中,HTML5的小游戏中

if(window.openDatabase){
	console.log("浏览器支持关系型数据")
}
//创建数据库 库名 , 版本号 ,别名 ,库的大小 
var db = window.openDatabase("temp","1.0","TEMP DB",2*1024*1024)
db.transaction(function(context){
	context.executeSql("DROP TABLE USERS")
})
//创建表 context 上下文
db.transaction(function(context){
	context.executeSql("CREATE TABLE USERS(UID,PASSWD)")
})
db.transaction(function(context){
	context.executeSql("INSERT INTO USERS(UID,PASSWD)VALUES('DJL','123')")
	context.executeSql("INSERT INTO USERS(UID,PASSWD)VALUES('DJL','123')")
	context.executeSql("INSERT INTO USERS(UID,PASSWD)VALUES('DJL','123')")
})
//查询 executeSql  参数1 sql语句 参数2 返回的格式  参数3 成功后的回调 参数4 失败后的回调
db.transaction(function(context){
	context.executeSql("SELECT * FROM USERS",[],function(context,results){
		console.log(results.rows[0])
	},function(context,results){
		console.log("error")
	})
})

// indexedDB 文本型数据库 mongoDB

URI编码

//URI编码输出
var urlText = "http://www.baidu.com/s?wd=中国好"
console.log(encodeURI(urlText))
//所有进行转码
console.log(encodeURIComponent(urlText))
//转成URL转码
var uriTxt = "%E4%B8%AD%E5%9B%BD%E5%A5%BD";
console.log(decodeURI(uriTxt))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值