• 前端代码合集


    HTML5

    使用FileReader实现前端图片预览

    <input type="file"><br>

    <img src="" height="200" alt="Image preview area..." title="preview-img">

    var fileInput = document.querySelector('input[type=file]');

    var previewImg = document.querySelector('img');

    fileInput.addEventListener('change', function () {

       var file = this.files[0];

       var reader = new FileReader();

       reader.addEventListener('load', function () {

           previewImg.src = reader.result;

       }, false);

       reader.readAsDataURL(file);

    }, false);

    取到页面中所有的checkbox怎么做?(不使用第三方框架)

    var doc = document,

       domList = doc.getElementsByTagName('input'),

       checkBoxList = [],

       len = domList.length;

    while (len--) {

       if (domList[len].type === 'checkbox') {

           checkBoxList.push(domList[len]);

       }

    }

    JavaScript模版引擎小实例

    <div class="result"></div>

    <script type="template" id="template">

       <h2>

           <a href="{{href}}">

               {{title}}

           </a>

       </h2>

       <img src="{{imgSrc}}" width="300" height="100" alt="{{title}}"/>

    </script>

    数据

    var data = [

       {

           title: "",

           href: "",

           imgSrc: ""

       },

       ...

    ];

    方法一:

    var doc = document,

       template = doc.querySelector('#template').innerHTML,

       result = doc.querySelector('.result'),

       fragment = '';

    for (var i = 0, len = data.length; i < len; i++) {

       fragment += template

           .replace(/{{title}}/, data[i].title)

           .replace(/{{href}}/, data[i].href)

           .replace(/{{imgSrc}}/, data[i].imgSrc)

    }

    result.innerHTML = fragment;

    方法二:

    var doc = document,

       template = doc.querySelector('#template').innerHTML,

       result = doc.querySelector('.result'),

       attachTemplateToData;

    attachTemplateToData = function (template, data) {

       var i = 0,

           len = data.length,

           fragment = '';

       function replace(obj) {

           var t, key, reg;

           for (key in obj) {

               reg = new RegExp('{{' + key + '}}', 'ig');

               t = (t || template).replace(reg, obj[key]);

           }

           return t;

       }

       for (; i < len; i++) {

           fragment += replace(data[i]);

       }

       return fragment;

    };

    result.innerHTML = attachTemplateToData(template, data);

    JavaScript

    实现JS函数重载

    var people = {

       values: ["Dean Edwards", "Sam Stephenson", "Alex Russell", "Dean Tom"]

    };

    function addMethod(object, name, fn) {

       var old = object[name];

       object[name] = function () {

           if (fn.length === arguments.length) {

               return fn.apply(this, arguments);

           } else if (typeof old === 'function') {

               return old.apply(this, arguments);

           }

       }

    }

    addMethod(people, "find", function () {

       return this.values;

    });

    addMethod(people, "find", function (firstName) {

       var ret = [];

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

           if (this.values[i].indexOf(firstName) === 0) {

               ret.push(this.values[i]);

           }

       }

       return ret;

    });

    addMethod(people, "find", function (firstName, lastName) {

       var ret = [];

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

           if (this.values[i] === (firstName + ' ' + lastName)) {

               ret.push(this.values[i]);

           }

       }

       return ret;

    });

    console.log(people.find());

    console.log(people.find("Sam"));

    console.log(people.find("Dean Edwards"));

    JS跨浏览器绑定事件函数

    常规实现方法

    //跨浏览器添加事件

    function addHandler(target, eventType, handler) {

       //检测浏览器类型,并且重写addHandler方法

       if (target.addEventListener) {

           addHandler = function (target, eventType, handler) {

               target.addEventListener(eventType, handler, false);

           }

       } else { //IE

           addHandler = function (target, eventType, handler) {

               target.attachEvent("on" + eventType, handler);

           }

       }

       //调用新的函数

       addHandler(target, eventType, handler);

    }

    //跨浏览器移除事件

    function removeHandler(target, eventType, handler) {

       //检测浏览器类型,并且重写addHandler方法

       if (target.addEventListener) {

           removeHandler = function (target, eventType, handler) {

               target.removeEventListener(eventType, handler, false);

           }

       } else { //IE

           removeHandler = function (target, eventType, handler) {

               target.detachEvent("on", eventType, handler);

           }

       }

       target.detachEvent("on" + eventType, handler);

    }

    优化方法

    //绑定事件

    var addHandler = document.body.addEventListener ?

       function (target, eventType, handler) {//DOM2

           target.addEventListener(eventType, handler, false);

       } :

       function (target, eventType, handler) {//IE

           target.attachEvent("on" + eventType, handler);

       };

    //移除事件

    var removeHandler = document.body.removeEventListener ?

       function (target, eventType, handler) {

           target.removeEventListener(eventType, handler, false);

       } :

       function (target, eventType, handler) {

           target.detachEvent("on" + eventType, handler);

       };

    JS单体模式

    var shoppingCar = (function () {

       //这个是由购物车构造器所创建的实例

       var instance;

       //购物车的构造器函数 

       function Trolley() {

           this.date = new Date().getDate();//实例属性,当前日期

       }

       //原型属性,一个返回当前日期的方法

       Trolley.prototype.getDate = function () {

           return this.date;

       };

       //暴露出去的公共API

       return function () {

           //如果实例不存在,那么就调用Trolley构造器实例化一个

           if (!instance) {

               instance = new Trolley();

           }

           //将实例返回外部

           return instance;

       }

    }());

    var a = new shoppingCar();

    var b = new shoppingCar();

    console.log(a === b);//true

    使用prototype属性定义的对象方法

    var dom = function () {};

    dom.Show = function () {

       alert("Show Message");

    };

    dom.prototype.Display = function () {

       alert("Property Message");

    };

    dom.Display(); //error

    dom.Show(); //Show Message

    var d = new dom();

    d.Display(); //Property Message

    d.Show(); //error

    1、不使用prototype属性定义的对象方法,是静态方法,只能直接用类名进行调用!另外,此静态方法中无法使用this变量来调用对象其他的属性!

    2、使用prototype属性定义的对象方法,是非静态方法,只有在实例化后才能使用!其方法内部可以this来引用对象自身中的其他属性!

    闭包实现结果缓存

    var CachedSearchBox = (function () {

       var cache = {},

           table = [];

       return {

           attachSearchBox: function (dsid) {

               if (dsid in cache) { //如果结果在缓存中

                   return cache[dsid]; //直接返回缓存中的对象

               }

               var fsb = new uikit.webctrl.SearchBox(dsid);//新建

               cache[dsid] = fsb;//更新缓存

               if (count.length > 100) {

                   delete cache[shift()];

               }

               return fsb;

           },

           clearSearchBox: function (dsid) {

               if (dsid in cache) {

                   cache[dsid].clearSelection();

               }

           }

       }

    })();

    CachedSearchBox.attachSearchBox('input');

    我们开发中会碰到很多情况,设想我们有一个处理过程很耗时的函数对象,每次调用都会花费很长时间,

    那么我们就需要将计算出来的值存储起来,当调用这个函数的时候,首先在缓存中查找,如果找不到,则进行计算,然后更新缓存并返回值,如果找到了,直接返回查找到的值即可。闭包正是可以做到这一点,因为它不会释放外部的引用,从而函数内部的值可以得以保留。

    闭包实现封装

    var person = function () {

       var name = "Default";

       return {

           getName: function () {

               return name;

           },

           setName: function (newName) {

               name = newName;

           }

       }

    }();

    console.log(person.name);//undefined

    console.log(person.getName());//Default

    person.setName("GoodMan");

    console.log(person.getName());//GoodMan

    闭包实现类和继承

    function Person() {

       var name = "default";

       return {

           getName: function () {

               return name;

           },

           setName: function (newName) {

               name = newName;

           }

       }

    }

    var p = new Person();

    p.setName('Tom');

    console.log(p.getName());

    var Jack = function () {

    };

    Jack.prototype = new Person();//继承自Person

    Jack.prototype.Say = function () { //添加私有方法

       console.log("Hello,my name is Jack");

    };

    var j = new Jack();

    j.setName("Jack");//Tom

    j.Say();//Hello,my name is Jack

    console.log(j.getName());//Jack

    如何判断某变量是否为数组数据类型

    if (typeof Array.isArray === "undefined") {

       Array.isArray = function (arg) {

           return Object.prototype.toString.call(arg) === "[object Array]"

       };

    }

    Javascript继承-借用构造函数

    var Widget = function (name) {

       this.messages = [];

    };

    Widget.prototype.type = 'Widget';

    var SubWidget = function (name) {

       Widget.apply(this, Array.prototype.slice.call(arguments));

       this.name = name;

    };

    SubWidget.prototype = Widget.prototype;

    var sub1 = new SubWidget('foo');

    var sub2 = new SubWidget('bar');

    sub1.messages.push('foo');

    sub2.messages.push('bar');

    console.log(sub1.messages);//foo

    console.log(sub2.messages);//bar

    Javascript原型-封装

    var Dialog = (function () {

       function Dialog() {

       }

       Dialog.prototype = {

           init: function () {

               console.log("ok");

           }

       };

       return Dialog;

    }());

    var d = new Dialog();

    d.init();//ok

    通过闭包修正函数的上下文(浏览器不支持解决方案)

    if (!('bind' in Function.prototype)) {

       Function.prototype.bind = function () {

           var fn = this,

               context = arguments[0],

               args = Array.prototype.slice.call(arguments, 1);

           return function () {

               return fn.apply(context, args.concat(arguments));

           }

       }

    }

    优化JavaScript的构造函数(new关键字的使用)

    方法一:

    function User(name, age) {

       if (typeof Object.create === 'undefined') {

           Object.create = function (prototype) {

               function C() {

                   C.prototype = prototype;

                   return new C();

               }

           }

       }

       var self = this instanceof User ? this : Object.create(User.prototype);

       self.name = name;

       self.age = age;

       return self;

    }

    方法二:

    function Programmer(name, company, expertise) {

       if (!(this instanceof Programmer)) {

           return new Programmer(name, company, expertise);

       }

       this.name = name;

       this.company = company;

       this.expertise = expertise;

       this.writeCode = function () {

           console.log("Writing some public static thing..")

       }

    }

    柯里化

    var curry = function (fn) {

       var limit = fn.length;

       return function judgeCurry(...args) {

           return function (...args) {

               if (args.length >= limit) {

                   return fn.apply(null, args);

               } else {

                   return function (...args2) {

                       return judgeCurry.apply(null, args.concat(args2))

                   }

               }

           }

       }

    };

    var currySingle = fn => judgeCurry = (...args) => args.length >= fn.length ? fn.apply(null, args) : (...args2) => judgeCurry.apply(null, args.concat(args2));

    对象拷贝与赋值

    var obj = {

       name: 'xiaoming',

       age: 23

    };

    var newObj = obj;

    newObj.name = 'xiaohua';

    console.log(obj.name);//xiaohua

    console.log(newObj.name);//xiaohua

    我们将obj对象赋值给了newObj对象,从而改变newObjname属性,但是obj对象的name属性也被篡改,这是因为实际上newObj对象获得的只是一个内存地址,而不是真正的拷贝,所以obj对象被篡改。

    var obj = {

       name: 'xiaoming',

       age: 23

    };

    var newObj = Object.assign({}, obj, {color: 'blue'});

    newObj.name = 'xiaohua';

    console.log(obj.name);//xiaoming

    console.log(newObj.name);//xiaohua

    console.log(newObj.color);//blue

    利用Object.assign()方法进行对象的深拷贝可以避免源对象被篡改的可能。因为Object.assign()方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。

    var obj = {

       name: 'xiaoming',

       age: 23

    };

    var newObj = Object.create(obj);

    newObj.name = 'xiaohua';

    console.log(obj.name);//xiaoming

    console.log(newObj.name);//xiaohua

    我们也可以使用Object.create()方法进行对象的拷贝,Object.create()方法可以创建一个具有指定原型对象和属性的新对象。

    CSS

    居中

    #main {

        440px;

       margin: 0 auto;

       position: relative;

       text-align: center;

    }

    菜单栏下拉

    .menu > li {

       display: block;

       float: left;

       position: relative;

    }

    JQuery

    Q设置等高的列

    <div class="equalHeight" style="border: 1px solid">

       <p>First Line</p>

       <p>Second Line</p>

       <p>Third Line</p>

    </div>

    <div class="equalHeight" style="border: 1px solid">

       <p>Column Two</p>

    </div>

    $(function () {

       equalHeight(".equalHeight");

    });

    var maxHeight = 0;

    function equalHeight(col) {

       col = $(col);

       col.each(function () {

           if ($(this).height() > maxHeight) {

               maxHeight = $(this).height()

           }

       });

       col.height(maxHeight);

    }

  • 相关阅读:
    Windows Phone 7之初体验(三.开发问答(转发))
    Windows phone 7 之初体验(一.安装Windows phone 7 sdk)
    python 程序的性能分析优化(huffman编码程序性能分析的一个小结论)
    图的深度优先遍历,及常见的扩展算法
    递归回溯与迭代回溯算法框架,打印在n个数字中取k个数字的所有可能
    python 实现的范式huffman压缩,解压缩
    <读书笔记> Thinking in python (Python 设计模式) 3. Proxy and State模式
    二分查找极其变形算法
    <读书笔记> Thinking in python (Python 设计模式) 1. Singlton的c++与python的实现
    <转载>openmesh文档的非专业翻译by kidux(学习generative programming非常好的库)
  • 原文地址:https://www.cnblogs.com/lcc1995/p/7691069.html
Copyright © 2020-2023  润新知