首页 > 技术文章 > 总结

mingjixiaohui 2016-05-23 23:30 原文

浏览器兼容问题:

  1. div中的图片间隙 ie6Bug 描述:在div中插入图片是,图片会将div下方撑大1像素

解决:将</div>与<img>写在一行上 

将</img>转为块元素 ,给<img>添加声明display:block

  1. 双倍浮动(双倍边距) ieBUG 描述:浏览器在解析浮动元素时,会错误的浮向边界加倍显示

解决:给浮动元素添加声明display:inline

  1. 百分比bug ie6Bug 解析百分比时,会按照四舍五入方式计算从而导致50% +50% 大于100%的情况。

解决:给右面的浮动元素添加声明:clear:right 清除右浮动

  1. 鼠标指针Bug描述:cursor属性值只有IE浏览器识别,其他浏览器不识别该声明

解决:如统一某元素鼠标指针形状为手型

 

W3c标准

万维网联盟 World Wide Web Consortium

网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。

 

Mvc/mvvm

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

 

MVVM是Model-View-ViewModel的简写

面向对象

面向对象(Object Oriented,OO)是软件开发方法一种编程思想

对象包括属性(Properties)和方法(Methods) 构造函数 prototype

什么是面向对象:不需要关注内部细节,只关注对象提供的功能。

面向对象变成的特点:

封装、

继承:从一个已有对象上,继承出新的对象、

多态:父类和子类有同样的方法,但是操作不一样

 

变量和属性、函数和方法的区别

Var a = 12;  //变量

Var arr = [1,2,3,4];

arr.a = 13; //属性

 

function a(){alert(1)}   //函数

arr.fn = function(){alert(2)}; //方法

arr.fn()

 

形成工厂模式的前奏因为需要每次创建对象很麻烦。

var obj1 = new Object();

obj1.name = ‘Json’;

obj1.showSex = function(){alert(this.name)}

 

var obj2 = new Object();

obj2.name = ‘leo’;

obj2.showName = function(){alert(this.name);}

 

缺点:多次创建对象麻烦 所以 封装起来 称为构造函数

工厂方式问题:1.没有new  2.每个对象都有一套自己的函数浪费资源。

Alert( p1.showName == p2.showName) 结果为false

function createPerson(name,sex){

         Var obj = new Object();

         this.name = name;

         this.sex = sex;

 

         obj.showName = function(){

                   alert(this.name);

}

Obj.showSex = function(){

         Alert(this.sex);

}

return obj;

}

Var P1 = createPerson(‘blue’,’男’);

Var p2 =createPerson(‘leo’,’女’);

 

P1.showName();

P1.showSex();

P2.showName();

P2.showSex();

 

alert(P1.showName == P2.showName) // false

 

原理:var a = function(){alert(1)};   实际上是 var a = new Function(“alert(‘abc’)”);

Var b = function(){alert(1)};               实际上是 var b = new Function(“alert(‘abc’)”);

 

解决工厂方式 没有new

Function createPerson(name,sex){

         //Var Obj = new Object();

 

         this.name = name;

         this.sex = sex;

 

         this.showName = function(){alert(this.name)}

         this.showSex = function(alert(this.sex));

 

         //return Obj;

}

Var p1 = new createPerson(‘leo’,”男”);

 

原理:

function show(){

         //Var this = new Object();

         Alert(this);

}

Show(); //window

New show(); //Object  相当于在function show方法中加入: var this = new Object();

 

Var arr1 = new Array(12,3,4,5);

Var arr2 = new Array(42,22,55,3);

 

Arr1.sum = function(){

         Var result = 0;

         Var I = 0;

         For( i = 0; i< this.length; i++){

                   Result +=this[i]l;

}

Return result;

}

Alert(arr1.sum());

Alert(arr2.sum())

问题:arr1对象有方法 arr2没有方法,怎么办;引出了prototype(原型)

 

Var arr1 = new Array(12,3,4,5);

Var arr2 = new Array(42,22,55,3);

 

Array.prototype.sum = function(){

         Var result = 0;

         Var I = 0;

         For( i = 0; i< this.length; i++){

                   Result +=this[i]l;

}

Return result;

}

Alert(arr1.sum());

Alert(arr2.sum())

 

利用原型给系统对象创建自定义方法,实现字符串前后无空格

String.prototype.trim = function(){

         Return this.replace(/^\s|\s$/g, ‘ ’)

}

Var str  = “   sdf  sdf    ”;

Alert(str.trim());

 

Prototype原型是为了解决工厂方式的资源浪费

既然可以给系统添加prototype也可以给自己的类条件prototype

 

Function CreatePerson(name,sex){

         this.name = name;

         this.sex  = sex;

}

CreatePerson.prototype.showName = function(){

         alert(this.name)

}

CreatePerson.prototype;showSex = function(){

         alert(this.sex)

}

Var p1 = new CreatePerson(‘blue’,’男’)

Var p2 = new CreatePerson(‘leo’,’女’);

P1.showName();

P1.showSex();

P2.showName();

P2.showSex()

 

Alert(p1.showName == p2.showName ); //true

这样就每个对象就不会都有一套自己的方法了

 

对象添加方法 大于给prototype添加方法

Array.prototyp.a = 12;

Var arr = [1,2,3];

Alert(arr.a) //12

Arr.a = 5;

Alert(arr.a) //5

 

Delete arr.a;

 

Alert(arr.a) //12

 

点击事件和定时器中的this问题

function Bbb(){

         Var _this = thisl;

         This.b =12;

         Document.getElementByI(‘btn1’).onclick = function(){

                   _this.show();

}

}

Bbb.prototype.show = function(){

         Alert(this.b);

}

Window.onload = function(){

         New Bbb();

}

 

改造为面向对象的技巧:将变量改成对象的属性,将函数改为对象的方法,不允许有函数嵌套

 

继承

function Person(name,sex){

         This.name = name;

         This.sex = sex;

}

Person.prototype.showName = function(){

         Alert(this.name);

}

Person.prototype.showSex = function(){

         Alert(this.sex);

}

 

function Worker(name,sex,job){

//调用父级的构造函数 this指向new出来的Work对象

//构造函数伪装

         Person.call(this. Name , sex );   

         This.job = job;

}

//通过原型继承父级的方法 worker原型指向Perons引用,指向的是地址

//这样就是子类影响到父类 所以不适用

//Worker.prototype = Person.prototype;

//(重点)利用原型链来继承父级的方法(将上面改为下边就不影响父类了)

for(var i in Perosn.prototype){

         worker.Prototype[i] = Perosn.prototype[i];

}

 

 Worker.prototype.showJob = function(){

         Alert(this.job)

}

 

Var oP= new Person(“Join”,”男”);

Var oW = new Worker(‘blue’, ’男’ ,’打杂的’);

 

oP.showName();

oP.showSex()

 

oW.showName()

oW.showSet()l

oW.showJob()

 

alert(oP.showName == OW.showName) // true

 

 

//a1怎么会找到Aaa.prototype下的num呢?

function Aaa(){}

Aaa.prototype.num = 10;  //Aaa.prototype也是一个对象

 

var a1 = new Aaa();

alert(a1.num);          //a1怎么会找到Aaa.prototype下的num呢?

 

原型链:实例对象与原型之间的链接,叫做原型链。

__proto__(隐士链接)。

Object对象类型是原型链的最外层

 

hasOwnProperty:看是不是对象自身下面的属性

var arr = [];

arr.num = 10;

Array.prototype.num2 = 20;

 

alert(  arr.hasOwnProperty(“num”)  ) //true

alert(  arr.hasOwnProperty(“num2”)  )//false  Array.prototype也是一个对象所有数组对象都可以用

 

constructor:查看对象的构造函数

function Aaa(){}

var a1 = new Aaa();

alert( a1.constructor ); //Aaa函数

 

var arr = [];

alert( arr.constructor ); //Array函数

alert( arr.constructor == Array ); //true 可以做类型判断

原理:

function Aaa(){}

Aaa.prototype.constructor = Aaa;  //系统会自动生成这个

 

var a1 = new Aaa();

alert( a1.constructor );

 

 

instanceof 就是判断某对象是不是 某个类的实例   所有的类都是从Object上继承过来的

例子:

Var arr1 = [1,2,3];

Alert(arr1 instanceof Array);

 

toString():系统对象下面都是自带的,自己写的对象都是通过原型链object下面的

var arr = [];

alert( arr.toString == Object.prototype.toString ); //false

 

function Aaa(){}

var a1 = new Aaa();

alert( a1.toString == Object.prototype.toString ); //true

 

//利用toString做类型判断:

var arr = [];

alert(  Object.prototype.toString.call(arr) );   //[object Array]

 

//做16禁止转化

var num = 255;

alert(num.toString(16)); //ff

 

//转化成字符串

var arr = [“1”,”2”,”3”];

Array.prototype.toString = function(){

         return this.join(“+”);

}

alert( arr.toString() ); //1+2+3

 

 

三种方法做类型判断

 

 

Amd/cmd

  1. AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块
  2. CMD推崇就近依赖,只有在用到某个模块的时候再去require

 

数组去重

                   <script>

                  

                   // Array.prototype.unique1 = function()

                   // {

                   //     // console.log(this); //这里的this是数组中的值

                   //     var n = []; //一个新的临时数组

                   //     for(var i = 0; i < this.length; i++) //遍历当前数组

                   //     {

                   //              //如果当前数组的第i已经保存进了临时数组,那么跳过,

                   //              //否则把当前项push到临时数组里面

                   //              //n.indexOf(this[i]) 指定某个字符串的值在字符串中首次出现的位置

                   //              if (n.indexOf(this[i]) == -1)

                   //                       console.log('这是i的值:'+i); //这里遍历的是n这个数组

                   //              n.push(this[i]);

                   //     }

                   //     return n;

                   // }

 

                   Array.prototype.unique2 = function(){

                            // console.log(this);//表示arr整个数组 是arr对象

                            var n = {}, r = [];//n为hash表,r为临时数组

                            for(var i = 0 ; i < this.length; i++){

                                    

                                     if(!n[this[i]]){//如果hash表中没有当前项

                                               n[this[i]] = true;//存入hash表

                                               r.push(this[i]);//把当前数组的当前项push到临时数组里面

                                     }

                            }

                            return r;

                   }

 

                   for(var i = 0 ; i < arr.length;i++ ){

                            for(var j = i+1 ; j<arr.length; j++){

                                     if(arr[i] == arr[j]){

                                               arr.splice(j,1);

}

}

}

 

                   var arr = ['string',"array","function","string","string"];

                   arr.unique2();

 

         </script>

 

JSON去重

Array.prototype.quchong = function(){

         var tmp = {},a = this.slice();

         for(var i =j= 0 ; i< a.length;i++){

                   if(!tmp[a[i].id]){

                            tmp[a[i].id] = 1;

                            j++;

}else{

         this.splice(j,1)

}

}

}

var arr8  = [

{“id”:1},{“id”:1},{“id”:2},{“id”:3},{“id”:1}

]

arr8.quchong()

console.log(arr8)

 

 

 

 

session和Cookie区别?

HTML5 提供了两种在客户端存储数据的新方法:

  • localStorage - 没有时间限制的数据存储
  • sessionStorage - 针对一个 session 的数据存储

之前,这些都是由 cookie 完成的。但是 cookie 不适合大量数据的存储,因为它们由每个对服务器的请求来传递,这使得 cookie 速度很慢而且效率也不高。

  1. seesion保存在服务器,客户端不知道其中的信息,cookie保存在客户端,服务器能够知道其中的信息
  2. session中保存的是对象,cookie中保存的是字符串
  3. session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到,而cookie中如果设置了路径参数,那么同一个网站中不同路径下cookie互相是访问不到的。
  4. sessin默认需要借助cookie才能正常工作。如果客户端完全静止cookie,session,这种方法将失效,单可以url重写
  5. session在用户会话结束后就会关闭,但cookie因为保存在客户端,可以长期保存
  6. cookie是服务器向客户端写入的片段信息。cookie信息保存在服务器缓存区,不会再客户端显示。当你第一次登陆一个网站,服务器想你的机器写的片段信息,你可以在internet选项找到存放 cookie文件夹。如果不删除就一直在这个文件夹

移动端尺寸:

http://www.cnblogs.com/mingjixiaohui/p/5430947.html

 

1像素边框问题:

http://www.cnblogs.com/mingjixiaohui/p/5507482.html

 

高清图片适配

http://www.cnblogs.com/mingjixiaohui/p/5435349.html

 

javascript方法

indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置

ceil()方法 向上取整 :

concat()方法 向下取整

substring() 方法用于提取字符串中介于两个指定下标之间的字符。

 

splice方法用于插入、删除或替换数组的元素。

charAt方法可返回指定位置的字符。

substr()方法可在字符串中抽取从 start 下标开始的指定数目的字符。

slice() 方法可从已有的数组中返回选定的元素。

join()方法用于吧数组中的所有元素放入一个字符串

 

正则

正则表达式30分钟入门教程     http://deerchao.net/tutorials/regex/regex.htm

预编译

IE内核,火狐,谷歌内核,css为什么这样写区别?原理

Trident  Geako  webkit

工具Hbuilder深入了解其功能

Canvas 动画 插件 echars

Bootstrap分页 响应式

移动端事件touch事件库 Hummer.js 和百度的touch.js

 

推荐阅读