JS-1

零碎

a 标签
// 正常情况下,href中放的是一个网址
<a href = "http://www.xxx.com"></a>

// 写一个 javascript: 的意思就是提示我这里面不是网址而是js,你需要把它执行了
<a href = "javascript: alert('a');"></a>

// 但是一般情况下并不会往这个 javascript:; 中放js代码,而是让它空着。原因有两个:
// 1 在 a 标签中放 js 代码不好,后面说
// 2 不用 # 号而写 javascript:; 是因为 # 号点完了之后会跳上去,而 javascript:;  不会
<a href = "javascript:;"></a>
style 和 className
  • 元素.style.属性 = xxx 是修改行间样式
  • 修改完行间样式之后再修改 className 是没有效果的

💡 一般情况下,通过js来修改样式的时候,需要统一,不然就都修改class样式,不然就都修改行间样式

在JS中想给一个按钮或者别的什么加事件的时候,至少有两种方法
  • 1
var oBtn = document.getElementById('btn1');

function 名字 (){
	...
}

oBtn.onclick = 名字;
  • 2 匿名函数
var oBtn = document.getElementById('btn1');

oBtn.onclick = function 名字 (){
	...
}

window.onload 当页面加载完成的时候发生

所以在< script>标签中运行js代码时,有时需要等html加载完成后再运行js代码,不然会报错的

这种时候就需要将js代码写在 window.onload 中了

window.onload = function(){
	var oBtn = document.getElementById('btn1');

	function 名字 (){
		...
	}
}
行为(JS)、结构(HTML)、样式(CSS)三者分离

这句话的意思通俗理解就是:

  • 别家行内样式
  • 别加行间的JS事件

通过html加进去的自定义属性,浏览器是不认的,会报错
但是通过js加进去的属性,是可以的

alert('abc' + 12 + 5 + 'ef');

// 'abc12' + 5 + 'ef'
// 'abd125' + 'ef'
// 'abd125ef'



alert('abc' + (12 + 5) + 'ef');

// 'abc' + 17 + 'ef'
// 'abc17' + 'ef'
// 'abc17ef'

innerHTML

设置标签中的html内容,可以直接是文字,也可以是带标签的内容如:< h1>xxx< /h1>,这样出来的效果就是h1的样式

JS

JS组成

  • ECMAScript 几乎没有兼容问题
  • DOM:document object model 有些操作不兼容
  • BOM:br obrowser object model 没有兼容问题(完全不兼容)

ECMAScript 解释器(翻译 )

0/1 <—> 翻译 <—> 能懂的语言

DOM:document object model (文档对象模型)

赋予js操作html的能力。其实在js里面,就是document,用来创建元素/改变元素/删除元素等

BOM:br obrowser object model(浏览器对象模型)

赋予操作浏览器本身的能力。其实在js里面,就是window。用来弹个窗口啊什么的

undefined类型:

  • 不然是真的没有定义
  • 不然是虽然定义了,但是没有给值(是空的)

NaN 和 NaN 不相等
要判断是不是NaN,可以用 isNaN(xxx);

变量作用域 & 闭包

变量作用域
  • 全局变量
  • 局部变量
闭包

通俗点说就是:子函数可以使用父函数的局部变量

function aaa() {   // 父函数
	var a = 12;
	function bbb (){   // 子函数
		alert(a);
	}
	
	bbb();
}

aaa();

这时的alert可以弹出来12。这就是闭包

命名规范
  • 类型前缀
  • 首字母大写

循环中

  • break 中断 执行到它之后,整个循环就都结束了

  • continue 继续 执行到它之后,跳过本次,执行后面的

  • 真:true/非零数字/非空字符串/非空对象

  • 假:false/数字零/空字符串/空对象/null/undefined

Json
  • 是什么
// var a = 1;
// var b = 2;
// var c = 3;

var Json = {a: 1, b: 2, c: 3};
Json.b++;    // 3
  • Json 和 数组
var Json = {a: 1, b: 2, c: 3};
var arr = [1, 2, 3];

alert(Json.a);    // 1

// 区别1:json下标是字符串,数组下标是数字
alert(Json[a]);    // 1
alert(arr[0]);    // 1

// 	区别2:用循环的方法不同
alert(Json.length);    // undefined    
alert(arr.length);    // 3


// json循环
// 第一种
for(var i = 0; i < arr.length; i++){
	alert('第' + i + '个元素为' + arr[i]);
}
// 第二种
for(var i in arr){
	alert('第' + i + '个元素为' + arr[i]);
}

// 数组循环
for(var i in Json){
	alert('第' + i + '个元素为' + Json[i]);
}

函数

可变参(不定参):arguments
  • 是一个数组
  • 存着所有的参数
function sum(){
	var result = 0;
	// 这块的这个arguments,就是外面调用sum时括号里面不定的所有参数,也就是一个数组
	for(var i = 0; i < arguments.length; i++){
		result += arguments[i];
	}
	return result;
}

alert( sum(2,4,6,8) );
CSS函数
// 这块的css函数的用法和jQuery中的css用法很像

css(oDiv, 'width');    // 获取样式
css(oDiv, 'width', '200px');    // 设置样式

// 可以通过 arguments[脚标] 的方式来获取或设置数据
function css () {
	if(arguments.length === 2){
		// 获取
		return arguments[0].style[arguments[1]];
	}else{
		// 设置
		return arguments[0].style[arguments[1] = arguments[2]];
	}
}

// 但是 arguments[脚标] 这样的方式写起来看着很繁琐,所以这里可以换成参数

function css (obj, name, value) {
	if(arguments.length === 2){
		// 获取
		return obj.style[name]);
	}else{
		// 设置
		return obj.name = value;
	}
}
取非行间样式

就是取非行间样式(< style>< /style>标签里面的样式)

  • currentStyle(),但是这个方法只兼容IE

  • getComputedStyle(a, b),这个方法兼容Chrome、FF

    • 参数a:需要获取哪个物体的样式
    • 参数b :这个参数随便往里面写啥都行,比如说null/false/数字啊啥的,随便。 getComputedStyle(oDiv, null).width
  • 那怎样在所有浏览器下面都兼容呢??

    可以在外部封装一个函数,用来判断是浏览器是否含有这个属性

// IE
var oDiv = document.getElementById('div1');
alert( oDiv.currentStyle.width);

// Chrome、FF
getComputedStyle(oDiv, null).width



// 都兼容呢?
// 封装函数
function getStyle(obj, name){
	if(obj.currentStyle){
		// IE
		return obj.currentStyle[name]
	}else{
		// Chrome、FF
		return getComputedStyle(obj, false)[name];
	}
}

window.onload = function(){
	var oDiv = document.getElementById('div1');

	// ⚠️ 但是这块取的样式必须是单一样式(如:backgroundColor / borderWidth),而不能是复合样式(background / border)
	alert(getStyle(oDiv, 'width'));
}

数组

数组方法
1
  • push(a):从尾部添加
  • unshift(a):从头部添加
  • pop():从尾部弹出
  • shift():从头部弹出
2 splice

先删除,后插入

  • splice(开始,长度,元素)

删除

  • splice(开始,长度)

插入

  • splice(开始,0,元素)
var arr = [1, 2, 3, 4, 5, 6]
// 删除:splice(起点,长度)
arr.splice(2, 3)     // 1,2,6

// 插入:splice(起点,长度,元素)
// 从第2个开始,删除0个,插入a,b
arr.splice(2, 0, 'a', 'b');   // 1,2,a,b,3,4,5,6
// 从第2个开始,删除2个,插入a,b
arr.splice(2, 2, 'a', 'b');    // 1,2,a,b,5,6
3 排序、替换

排序

  • sort
var arr = ['float', 'width', 'alpha', 'zoom'];
arr.sort();   // alpha, float, width, zoom
var arr = [3,344,12,88,54,99,73];
arr.sort();
console.log(arr.sort());

可以看到上面的这个结果并不是按照数字从小到大的顺序排列的。是因为sort()排序只认字符。那如何帮助它认数字呢??

  var arr = [3, 344, 12, 88, 54, 99, 73];
  arr.sort(function (n1, n2) {
    if (n1 < n2) {
      // 这块并不一定是-1,只要是个负数就可以
      return -1;
    } else if (n1 > n2) {
      // 这块并不一定是1,只要是个正数就可以
      return 1;
    } else {
      return 0;
    }
  });
  console.log(arr);
  var arr = [3, 344, 12, 88, 54, 99, 73];
  arr.sort(function (n1, n2) {
  // 其实这块这样简写也可以,因为是负数/正数/0都是由n1和n2来决定的
	return n1 - n2;
  });
  console.log(arr);

转换类

  • (数组).concat(数组) 数组连接
  • join(分隔符) 用分隔符,组合数组元素,生成字符串
  • 字符串split

demo

  • concat
var a = [1, 2];
var b = [3, 4, 5];
a.concat(b);   // 1,2,3,4,5
  • join
var arr = [3, 4, 5];
arr.join('-');        //   3-4-5

定时器

  function show() {
    console.log('a');
  }

  var timer = null;
  var timer2 = null;

  // 每隔1000ms执行一次
  timer = setInterval(show, 1000);

  // 1000ms后执行show
  timer2 = setTimeout(show, 1000);

  // 关闭定时器
  clearInterval(timer);
  clearTimeout(timer2);

charAt():取字符串的某一位,是兼容的

元素视图属性

 * offsetWidth 水平方向 width + 左右padding + 左右border-width
 * offsetHeight 垂直方向 height + 上下padding + 上下border-width
 * 
 * clientWidth 水平方向 width + 左右padding
 * clientHeight 垂直方向 height + 上下padding
 * 
 * offsetTop 获取当前元素到 定位父节点 的top方向的距离
 * offsetLeft 获取当前元素到 定位父节点 的left方向的距离
 * 
 * scrollWidth 元素内容真实的宽度,内容不超出盒子高度时为盒子的clientWidth
 * scrollHeight 元素内容真实的高度,内容不超出盒子高度时为盒子的clientHeight

overflow: hidden

  • 溢出隐藏
    给一个元素中设置overflow:hidden,那么该元素的内容若超出了给定的宽度和高度属性,那么超出的部分将会被隐藏,不占位
  • 清除浮动
    一般而言,父级元素不设置高度时,高度由随内容增加自适应高度。当父级元素内部的子元素全部都设置浮动float之后,子元素会脱离标准流,不占位,父级元素检测不到子元素的高度,父级元素高度为0

因此,需要给父级加个overflow:hidden属性,这样父级的高度就随子级容器及子级内容的高度而自适应

  • 解决外边距塌陷
    父级元素内部有子元素,如果给子元素添加margin-top样式,那么父级元素也会跟着下来,造成外边距塌陷

因此,给父级元素添加overflow:hidden,就可以解决这个问题了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值