前端手艺人 一个前端菜鸟的自嘲

Js杂六笔记

记录着我一路学习js以来, 遇到的js问题, 我踩过的坑, 记录下来, 防止重复踩坑....

180天180网页

  • name特性用以确保多个值中只有一个发送服务器 用于提交到服务器后的表单进行标识 只有带有name属性的值 服务器才能接收到
		`<input type='radio' value='red' name='color'>`
		`<input type='radio' value='red'>`
		
  • NodeList – 类数组对象,基于DOM结构动态执行查询的结果

  • insertBefore() 接受两个参数 要插入的节点和作为参照的节点

父节点.insertBefore(插入节点, 参照节点);

function insertAfter(newEl, targetEl) {
	var parentEl = targetEl.parentNode;
	if( parentEl.lastChild == targetEl) {
		parentEl.appendChild(newEl);
	} else {
		parentEl.insertBefore(newEl, targetEl.nextSibing);
	}
}

这里可以引入 parentNode(父节点), lastChild(最后一个子节点) nextSibing (同一个层级中的后面一个节点)previousSibing (兄弟层级中的前一个节点)

  • 复制节点是 clone函数 它可以带一个参数 > clone(true) – 深复制, 复制整个节点及其子节点树
    > clone(false) –浅复制 , 复制节点本身

  • 判断js代码中程序运行多久

     console.time(a);     console.timeEnd(a);		// a 为执行的数据
    
  • setPropertyValue() 设置某个CSS属性 getPropertyValue() 获取某个CSS属性 removePropertyValue() 移出某个CSS属性 item()返回指定位置的属性名 —只能设置当个css属性 最好还是来改变类

// 判断是否包含property属性 自动为CSS3属性添加浏览器前缀
// 函数中包含charAt()方法来获取指定字符串位置的字符   toUppercase() 是将其转换为大写
function isPropertySupport(property) {
	if(property in document.body.style) {
		return false;
	}
var prefixes = ['moz', 'webkit', 'o', 'ms'];
var prefProperty = property.charAt(0).toUppercase() + property.substr(1);
for(var i = 0;  len = prefixes; i < len; i++) {
	if( prefixes[i] + prefProperty) in document.body.style) {
		return true;
	}
	return false;
}
  • XML 严格区别大小写 HTML 不区分大小写 > property 属性 prototype 原型

Object.keys(对象) // 对象中包含的属性 可枚举

对象.hasOwnProperty(‘属性’); // 对象是否有自有属性

  • JS中 函数作为参数传值

  • 遍历children 比 遍历 childNodes更快, 因集合项更少, HTML中的空格都属于文本节点textNode

  • DOMContentLoaded事件 相对于 jQuery中的 $(document).ready(function() {} ); > ###当DOM树加载完毕之后触发脚本的执行###

  • js中的链式调用

 
setTimeout( function() {
	setTimeout(arguments.callee, interval);
}, interval);
  • 柯里化函数 编程
    > 一个相对于把函数分割几个模块来实行
var greent = function(a) {
	return function(b) {
		console.log(a, b);
	};
};
greent(a)(b) ;   // 借用闭包   把接收多个参数的函数, 返回一个接受单个参数的函数


+ JSON的转化   -- 没有变量的概念 , 对象中属性必须用""来表示
JSON为全局对象
 `JSON.stringify() ` JS对象 --> JSON字符串
 `JSON.parse()`   JSON字符串 --> JS对象

+ XMLHttpRequest()    AJAX 异步调用
    `var request = new XMLHttpRequest();`     
request对象中包括
	- 属性`readyState`(数据是否加载)  `responText`(响应体) `status`(状态码)    

	- 方法 `abort()` 取消异步请求   `open()` 启动一个请求以备发送  `send()`  `onload()`

+ JavaScript中原型链的最顶端为 `Object.prototype`

+ ##函数节流
function throttle(method, context) {
	clearTimeout(method.tId);
	method.tld = setTimeout(function() {
		method.call(context);	
	}, 1000);
}
+ DOM中 `getElementsByTagName`方法代入标签名称, 返回该节点里包含的所有该标签节点以及节点里面包含的子节点(eg: textNode文本节点)的数组 + **表单**中 用户改变字段之后 离开, 会触发`onblur`和`onchange`两种事件, 若没有改变字段内容的情况下离开, 只会触发`onblur`处理表单程序 > form表单中 想要了解用户按下了哪个键
var thiskey = evt.which;		// Firefox or safari
var thiskey = window.event.keycode 	  		// IE中 


+ JavaScript中 `return false;`  表示停止对用户单击的处理, 这样就不会加载href指向的页面了 


+ 滚动鼠标时 滚动到一定距离出有提示
function checking() {
	if(this.scrollHeight - this.scrollTop  === this.clientHeight) {
		console.log('谢谢阅读');
	} else {
		console.log('您还未读完');
	} 
+ 标签 break / continue 配合使用
top: 
for(var i = 0; i < 3; i++) {
	for(var j = 0; j < 3;  j++) {
		if(i === 1 && j === 1) {
			break top;   			// 会直接跳到两个循环之外, 如果没有,只能跳出当前循环
		      console.log('hello world');
		}
	}


+ 位操作符 
>   | 0   和  ~ 将浮点转出整型且效率比 pareInt,  Math.round 要快
var  foo = (12.4 / 4.13) | 0;			// 转为整型, 结果为3;
var foo = ~(12.4 / 4.13);				// 结果为3
!! window === true;					// 方便快速转化为boolern值


+ Math.round()  随机数   --- 随机产生颜色
Math.round(Math.random() * (n - m) + m );	    			// 生成[n, m]
color = 'rgb('  + random(0, 255) + ',' + random(0, 255) +','+ random(0, 255);
+ 数组去重
function unique(arr) {
	var n = arr[0];
	for(var i = 0, len = arr.length;  i < len; i++) {
		if(arr.indexOf(arr[i]) == -1) {
			n.push(arr[i]);
		}
	}
}