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

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]);
		}
	}
}
阅读全文

angular学习笔记

Angular

最近刚刚入门angular1.x, 总结了一些我学习过程中的对angular的认知和理解. 对于angular来说, 双向绑定数据的功能能实现反应在DOM,免去了我们操作DOM的步骤, angular还来对于SPA(单页面应用)是也有很大的应用场景,它可以使等我们只需要加载一个index.html主页面, 后面的应用可以通过路由,aiax分布加载, 这也是很大的优点, 但是angular1.x也是有很多的缺点, 2.0已经发布, 小白还是先搞懂1.x吧.....

$scope-作用域 $rootScope-根作用域(用来设置路由)

ng-app 作用域标记

指令标记了AngularJs脚本的作用域,在<html>中添加ng-app属性说明了整个html都是Angular脚本作用域。 开发者也可以局部使用ng-app指令, 比如 <div ng-app> , 则说明Angular只能在div中作用。

ng-repeat 遍历属性

Angular中遍历属性 用在一个数组上

  • ng-controller 控制器属性

    定义了控制器

    ng-init 初始化数据

    	<div ng-app ng-init="quantity=1; cost=5">
    		<p>总价:  </p>
    	</div>
    	

    ng-click 定义元素响应行为

    eg:

    	<div ng-controller="controller">
    		<p>, AngularJs.</p>
    		<button ng-click="test1()">test1</button>
    	</div>
    	<script>
    		function controller($scope) {
    			$scope.greeting = {
    				text: "hello world"
    			};
    			$scope.test1 = function() {
    				console.log("test one");
    			};
    		}
    	</script>
    	

    路由 模块 依赖注入

    指令 (需要加强ng中指令的理解)

    指令基本用法 tranclude属性 其中restrict属性包括四个属性: A(attribute属性) E(element元素) M(comment 注释) C(class 类) 其中link方法中的attr属性可以提取到自定义元素的属性

    	HTML:
    	<div ng-app="MyModule" ng-controller="MyCtrl">
    		<loader howToLoad="loadData()">loading...</loader>
    	</div>
    	Js:
    	var myModule = angular.module('MyModule', []);
    	myModule.controller('MyCtrl', ['$scope', function($scope) {
    		$scope.loadData = function() {
    			console.log('hello world');
    		};
    	}]);
    	myController.directive("loader", function() {
    		return {
    			restrict: "AE",
    			template: , 	 // 可以用来替换指令中的模板
    
    			/**
    			* @scope 作用域 
    			* @element 当前指令替换的元素
    			* @attr  表示元素里面的属性
    			*/  
    			link: function(scope, element, attr) {
    				element.bind("mouseenter", function() {
    					// 注意事项 attr调用方法 里面的属性应该要小写
    
    					// 	可以在不同的控制器中调用同一个方法
    
    					scope.$apply(attr.howtoload);
    				});
    			}
    		};
    	};
    	

    独立指令

    directive里面可以提交一个scope: {}, 独立指令 就和别的指令不相联系

    	HTML: 
    		<hello></hello>
    		<hello></hello>
    		<hello></hello>
    		<hello></hello>
    	JS: 
    		myModule.directive("hello", function() {
    			return {
    				restrict: 'AE',
    				scope: {},			/* 独立指令 */
    				template: '<div><input type="text" ng-model="userName" />  </div>',
    				replace: true
    			};
    		});
    	

    ng-model 双向数据绑定

    指令把输入域的值绑定到应用程序变量中去 – 双向绑定

    	<div> 
    		<input type="text" ng-model="name">
    		<p> , world. </p>
    	</div>
    	

    获取当前的URL地址

    需要一个函数 $location.absUrl() 来获取地址

    	myCtrl.controller("myCtrl", function($scope, $location) {
    		$scope.myUrl = $location.absUrl();
    	});
    	

    $timeout(计时函数) $http(向服务器请求信息)

    $timeout用法

    	myCtrl.controller("myCtrl", function($scope, $timeout) {
    		$timeout(function() {
    			.....
    		}, 2000);
    	});
    	

    $http用法

    	myCtrl.controller("myCtrl", function($scope, $http) {
    		$http.get("welcome.html").then(function(response) {
    			$scope.myWelcome = response.data;
    		});
    	});
    	

    过滤器

    基本包括 currency 格式化数字为货币格式 filter 从数组选项中选择一个子集
    lowercase 格式化字符串为小写 orderBy 根据某个表达式排列数组 uppercase 格式化字符串为大写 number 显示小数后面的几位 limitTo 可以显示限制出现的数字或者字符串 位数 don’t bb, show your code

    	<p>搜索: <input type="text" ng-model="test"></p>
    	<ul>
    		<li ng-reapeat="book in books | filter: test | orderBy: 'author'">
    			 &nbsp; &nbsp; &nbsp; 
    		</li>
    	</ul>
    	
    	<script>
    		bookStoreCtrls.controller('BookListCtrl', function($scope) {
    			$scope.books = [
    				{title: '111',  author: '222'},
    				{title: '333',  author: '444'}
    			];
    		});
    	</scipt>
    	

    number 显示小数后面的几位

    	Limit to: <input type="number" step="1" ng-model="">
    	output numbers: 
    	

    注入依赖 XHR

    依赖注入服务可以使用web应用构建

    	function functionName($scope, $http) {
    		$http.get('name.json').success(function(data) {
    			$scope.phones = data;
    		});
    	

    ng-show 动态展示显示与隐藏

    	// 只有当show为true时,才会显示出包含的标签
    
    	<ul ng-show="show">
    		<li ng-click="a()">11</li>
    		<li ng-click="b()">22</li>
    		<li ng-click="c()">33</li>
    	</ul>
    	

    ng-class 可以动态绑定css样式

    原理就是同判断表达式中true,false来实现动态绑定css

    	 // 初始化error warning 为false 来不隐藏该元素    只有变为true才会显示出来
    
    	<div ng-class='{error: isError, warning: isWarning}'>
    			
    	</div>
    	function($scope) {
    		$scope.isError = false;
    		$scope.isWarning = false;
    		$scope.showError = function() {
    			$scope.messageText = "你不知道的事";
    			$scope.isError = true;
    			$scope.isWarning = false;
    		};
    		$scope.showWarning = function() {
    			$scope.messageText = '3.8 妇女节快乐';
    			$scope.isError = false;
    			$scope.isWarning = true;
    		};
    	}
    	

    ui-router

    由于angular本身仅支持在路由转换,而ui-router 根据URL状态或者说是’机器状态’来组织和控制界面UI的渲染

    ### 基本写法就是: 1. index.html中声明一个ui-view 例如<div ui-view> 然后在设置另外一个页面来配置导航栏信息,来说明各个页面的路由转向。 2. 然后可以创建一个nav.html,里面需要创建一个ul导航栏,例如<a ui-sref='html页面相对位置,可以不接.html后缀名'> 然后在该页面里面再嵌套一个<div ui-view> ui-sref可以动态指向页面

    ….(未完待续) ….(坐等踩坑angular2)

    阅读全文

    Js杂六笔记

    记录着我一路学习js以来, 遇到的js问题, 我踩过的坑, 记录下来, 防止重复踩坑.... </div + typeof []; // "object" + typeof null; // "object" 由于历史原因 兼容以前代码 + undefined, null, false, 0, NaN, " " // 会自动转化为布尔值 false + var a = 1 AND a = 1 的区别 > a = 1 相对于声明了全局变量, 可用delete a删除属性。 相对于给 window["a"] = 1 , 给window对象添加了a属性 + js中的+运算符比较特殊 当 + 的一边有字符串的时候 会进行字符串的连接 ` "5" + 11 // "511" "5" - 11 // -6 + 防止空字符串 0 这些参数 传入函数时, 都会默认没有传入
    // 参数a可以识别出 0 或者 空字符串 这些参数
    function f(a) {
    	(a !== undefined && a !== null) ? (a = a) : (a = 1); 
    	// dosomething
    	return a;
    } 
    
    + instanceof 1. instanceof 首先检查右边是不是构造函数 如果是 就进行下一步 2. 若左边的原型链上有某个__proto__ 和右边的构造函数的prototype属性相等,就返回true var a = [], b = {}; a instanceof Array; // false b instanceof Array; // true + js中参数有两个方式 一种是传值传递(只是值的拷贝) 一种是传地址传递 var p = 2; function f(p) { // 传入的参数只是值的拷贝 p = 3; // 函数内部改变的值无法改变外部的值 } p; // 2 + try-catch 语句中需要注意的问题 var count = 0; function countUp() { try { return count; } finally { // 不管是否有返回值 一定会执行finally中的语句 count++; } } countUp(); count; // 1 + 在js的引擎中 {} // 会被解析为一个代码块 ({}) // 这样才会被解析为一个对象 圆括号运算符的运用 (表达式) // 求值 函数() 调用函数 + 对象中 toString 和 valueOf 的区别 var o = new Object(); o.valueOf = function() { return {}; }; o.toString = function() { return "22"; }; o + 1; // "221" 上面发生的原因是对象是首先调用valueOf方法,如果其返回的不是基本原始类型,就会继续调用toString方法 但是如果两个方法返回都不是基本类型,系统会报错。 也会出现人为没有定义valueOf和toString方法 比如 var o = new Object(); o + 1; // "[object object]"+1 系统会返回该元素的类型 + 构造函数中 如果构造函数的return语句返回的是对象,则返; 如果不是,则返回构造后的上下文对象 var Car = function() { this.name = "BMW"; return 1000; }; Car(); // 1000 typeof Car(); // "number" typeof new Car(); // "object" + js对象中 Object.create() 接受一个原型对象作为参数, 返回一个新对象,后者继承前者的属性 if(typeof Object.create !== "function") { Object.create = function(obj) { Function F() {}; F.prototype = obj; return new F(); // 返回F的实例 }; }
    阅读全文

    css float浮动深入详解

    浮动的原始意义只是用来让文字环绕图片

    浮动的 “包裹性”

    不管浮动的破坏性,浮动就是一个带有方位的display: inline-block;属性

    <a href="" class="btn1"><cite>inline-block方法</cite></a>
    .btn1 { display: inline-block; background: red; color: #000; }
    .btn1 cite { display: block; line-height: 26px;}
    
    < a href="" class="btn1"><cite>flont方法</cite></a>
    .btn { float: left;  background: red; color: #000; }
    .btn1 cite { display: block; line-height: 26px; }
    

    以上这两种方法是等价的

    浮动的 “破坏性”

    有两个CSS模型产生的,

    • 一个是box盒状模型,对应CSS为”height+padding+margin”,

    • 另外一个是line box模型,对应样式为”line-height”。
    • 前者的height属性分为明显的height值和隐藏的height值,所谓隐藏的height值是指图片的高度,一旦载入一张图片,其内在的height值就会起作用,即使您看不到”height”这个词。
    • 而后者针对于文字等这类inline boxes的元素(图片也属于inline boxes,但其height比line-height作用更凶猛,故其inline boxes高度等于其自身高度,对line-height无反应),inline boxes的高度直接受line-height控制(改变line-height文字拉开或重叠就是这个原因),而真正的高度表现则是由每行众多的inline boxes组成的line boxes(等于内部最高的inline box的高度),而这些line boxes的高度垂直堆叠形成了containing box的高度,也就是我们见到的div或是p标签之类的高度了。所以,对于line box模型的元素而言,没有inline boxes,就没有高度了,而浮动却恰恰做了这么龌龊的事情,其直接将元素的inline boxes也破坏了,于是这些元素也就没有了高度。

    具体的资料 请点击下面的链接

    css-float浮动的深入研究、详解及拓展一

    css-float浮动的深入研究、详解及拓展二

    阅读全文

    css 小技巧

    • font-family: -apple-system; 默认使用ui字体

    • 设置html中文字不可选, 鼠标右键没有复制

    	
    // 需要浏览器前缀  不支持IE8,9
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
    
    • 更改html中当文字被选中时的样式 — 比如下面代码表示 当文字被选中时, 红字绿底
    ::-moz-selection {
    	background: green;
    	color: red;
    }
    ::selection {
    	background: green;
    	color: red;
    }
    
    • 更改浏览器默认样式 appearance : none | button | icon ;

       div {							// 需要浏览器前缀  
           appearance: button;			// 会将div描绘出button基本样式
       }
      
    • pointer-events : none; 取消鼠标的点击事件, 无法点击 > <a href="" title=""> </a> 中 键盘的Tab键会通过focus触发, 解决方案 在css上设置pointer-events: none; 属性, 然后移出a标签中的href属性(removeAttribute)

    • input标签中设置datalist联想信息

        <label>
            <input type="text">
            <datalist>
                <option value="11">
                <option value="22">
                <option value="33">
            <datalist>
        </label>
      
    • 当img图片过小 无法撑开整个容器的高度的时候 可以使用一个内联块级元素来撑开这个高度

        <img src="">
        <i class="vline"></i>
        .vline {
            display: inline-block;
            height: 100%;
            width: 0;
            vertical-align: middle;
        } 就可以解决这个问题
      
    • form.elements

      全局对象 包含表单中所有元素的数组 form 对象

    对象属性

    1. action 设置返回表单的action属性
    2. length 返回表单中的元素数目
    3. method 返回或者设置 数据发送到服务器的http方法
    4. name 返回或设置 表单名称
    5. elements[] 包含表单中的所有元素的数组

    方法

    1. reset() 把表单的所有输入元素重置为默认值
    2. submit() 提交表单

    ———–华丽丽的分割线———-

    • 一些css经验之谈
    .test-checkbox:checked ~ .test-label     // 选择全部后面的同级节点元素
    .test-checkbox:checked + .test-label 	  // 选择相邻的后面的兄弟节点
    :first-child  匹配的是某父元素的第一个子元素,可以说是结构上的第一个子元素
    :first-of-type 	匹配的是该类型上的第一个元素
    * { cursor: none !improtant; } 			 // 鼠标样式消失
    position: relative;    top: 50%;   transform:  translateY(-50%);           // 垂直居中
    
    阅读全文