高级前端开发不可或缺的知识

单页应用现在很流行,特别是移动前端开发方面,用web页面做出来的应用,几乎可以达到java,C++等开发的用程序一样的效果。基于web天生就有跨平台的优势,使得前端开发也越来越受重视了。要想在移动端做出原生应用的效果,单页应用首当其冲,但是呢,单页应用有一个重要的知识点,那就是异步过程太明显,你想,大量的样式操作,事件邦定,都要在dom节点绘制完成之后才能进行。怎样确定我们在操作某个dom节点的时候,它已经在页面上存在了呢。以前呢,我们都是用定时器设一个时间来保证的。例如:

var element = document.createElement(‘svg‘);
    //大量的文档数据
   //.....
   document.body.appendChild(element);
setTimeout(function(){
  element.style.background = ‘‘;
 //其它对于element的操作

},1000);

这样做,通常都不会有问题,特别是在pc上,即便你的延时设的更小一点,也可能看不到问题,但是一旦在手机或平板上,就会发现,如果你设的延时比较小,那可能后面的节点操作会报undefined没有style属性之类的错误。如果设的比较大,就会发现,操作反应变得很迟顿了。有没有一种方式可以在节点绘制好了,就通知我们进行下一步的操作呢?当然是有的,在现代浏览器的一些高级版本上大多都实现了变动事件,再再高级一点的浏览版本,还实现了MutationObserver这个东东。于是呢,我们就可以解决上面的问题了。下面是我写的一个插件:

/**
 * 当监听的节点内容发生变化时,触发指定的回调
 * @param opts {
 *   container:父容器,dom对象或jQuery对象
 *   content  :要加入父容器的内容,字符串或jQuery对象
 *   position :内容插入父容器的位置,‘first‘ 表示在前加入,默认在末尾
 *   delay    :延时,默认0
 *   }
 * @version  1.02
 * @author [author] bjtqti
 * @return {[type]} [description]
 */

Xut.nextTick = new function() {
    var DOC = document,
        MutationObserver = window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;

    function nextTick(opts,callback) {
        var container  = opts.container,
            content    = opts.content,
            delay      = opts.delay||0,
            position   = opts.position,
            animatId   = ‘T‘+ (Math.random()*10000 << 1),
            tick       = DOC.createElement(‘input‘),
            observer   = null;

        if (!container || !content) {
            return;
        }

        //检查容器---$(container) 转为dom对象
        if(typeof container === ‘object‘ && container.selector !== undefined){
            container = container[0];
        }

        if(container.nodeType !== 1){
            console.log(‘container must be HTMLLIElement ‘);
            return;
        }

        //标记任务
        tick.setAttribute(‘value‘,animatId);

        //检查内容
        if(typeof content ===‘string‘){
            var temp = $(content);
            if(!temp[0]){
                //纯文本内容
                temp = DOC.createTextNode(content);
                temp = $(temp);
            }
            content = temp;
        }

       //组装内容到临时片段
        function _createFragment(){
            var frag = DOC.createDocumentFragment(),
                len = content.length;
            for(var i=0;i<len;i++){
                frag.appendChild(content[i]);
            }
            return frag;
        }

        //将内容加入父容器
        function _appendChild(){
            //拼接内容
            content = _createFragment();
            content.appendChild(tick);
            //判断插入的位置
            if(position === ‘first‘){
                container.insertBefore(content, container.firstChild);
            }else{
                container.appendChild(content);
            }
            //触发变动事件
            tick.setAttribute(‘value‘,animatId);
        }

        //完成任务后处理&Event
        function _finishTask(event) {
            if(event.target.value === animatId){
                container.removeEventListener(‘DOMNodeRemoved‘,_finishTask,false);
                callback();
            }
        }

        //完成任务后处理&Observer
        function _completeTask() {
            container.removeChild(tick);
            callback();
        }

        if(MutationObserver){
            observer = new MutationObserver(function(mutations) {
                mutations.forEach(function(record) {
                    if(record.oldValue === animatId){
                        _completeTask();
                        observer = null;
                    }
                });
            });

            //设置要监听的属性
            observer.observe(tick, {
                attributes: true,
                //childList: true,
                attributeOldValue :true,
                attributeFilter:["value"]//只监听value属性,提高性能
            });

            _appendChild();

        }else{

            //检测是否支持DOM变动事件
            if(DOC.implementation.hasFeature("MutationEvents","2.0")){
                container.addEventListener(‘DOMNodeRemoved‘,_finishTask,false);
                _appendChild();
                container.removeChild(tick);
            }else{
                //歉容Android2.xx处理
                _appendChild();
                setTimeout(function () {
                    _completeTask();
                }, delay);
            }
        }
    }

    return nextTick;
}

都是项目中实践过的功能。如果有用就直接拿走吧。关于这些高级事件的解释,在博客园已有前辈写的很详细了,有想法深入了解的,就要靠自己百度或谷歌了。

高级前端开发不可或缺的知识

时间: 2024-11-09 00:57:34

高级前端开发不可或缺的知识的相关文章

JS高级前端开发群加群说明

JS高级前端开发群加群说明 一.文章背景: 二. 高级群: 三. 加入方式: 四. 说明: 一.文章背景: 去年年初建了几个群,在不经意间火了,一直排在“前端开发”关键字搜索结果第一名.当然取得这样的成绩或这样一个结果也是情理之中,一方面来说,提倡的各种交流沟通方法大部分是正确有效或被大家认可的,另外一方面说,这么多人聚在一起,跟大伙的参与分享是分不开的,尤其是各群的管理,是我们的灵魂精神的支柱.另外在国内行业前进的道路上,尽自己的绵薄之力帮助他人,引领氛围,进而影响行业,也是略感欣慰.有时候精

学习中收集的一些有关网页UI设计、前端开发的相关知识网址分享,赶紧收藏走起。。。

http://iconfont.cn/ 强大的矢量图标库,妈妈再也不用担心我不会画图标了 http://pxtoem.com/ 像素单位px的转换为em,可以自豪的说小学数学是体育老师教的啦 http://qrohlf.com/trianglify/#gettingstarted 时下钻石风格代码完成,有木有高大上 http://www.sheji11.com/category/ruanjian 软件神器,设计师资源网,各种插件上这找 http://www.w3cplus.com/css3/ps

前端开发从低级到高级,能力的区别。(不论薪资,只论能力)

从事前端开发这个职业的人越来越多,在最近几年也非常火热,吸引了众多人才的加入,我是12年2月开始加入这个开发者行列. 目前,按照前端开发水平,分为3个阶段,“初级前端开发”.“中级前端开发”和“高级前端开发”. 初级前端开发:具备制作 “同步网页” 的能力.所谓的 “同步网页”,就是能按照设计,用html和css制作出网页来,并用javascript在网页中加上click.hover等事件,让用户可以点击.查看.例如:常见的企业网站就是我所说的 “同步网页”. 中级前端开发:具备制作 “异步网页

Web前端开发十日谈

一直想写这篇“十日谈”,聊聊我对Web前端开发的体会,顺便解答下周围不少人的困惑和迷惘.我不打算聊太多技术,我想,通过技术的历练,得到的反思应当更重要. 我一直认为自己是“初级”前端开发工程师,一方面我入道尚浅,只有短短几年,另一方面我自知对技术的钻研并不深入,可能是由于环境的原因,当然最重要的是,我幸运的参与到互联网崛起的浪潮之巅.时势造就了一批技能薄弱但备受追捧的“弄潮者”,这在很大程度上影响我们对“技术本质”的洞察力,多年来也一直未有成体系的“前端技术”布道佳作,以至于当下多数人对前端技术

淘宝前端工程师:国内WEB前端开发十日谈

转自:http://www.jianshu.com/p/8cf2df3fdbf2 一直想写这篇“十日谈”,聊聊我对Web前端开发的体会,顺便解答下周围不少人的困惑和迷惘.我不打算聊太多技术,我想,通过技术的历练,得到的反思应当更重要. 我一直认为自己是“初级”前端开发工程师,一方面我入道尚浅,只有短短几年,另一方面我自知对技术的钻研并不深入,可能是由于环境的原因,当然最重要的是,我幸运的参与到互联网崛起的浪潮之巅.时势造就了一批技能薄弱但备受追捧的“弄潮者”,这在很大程度上影响我们对“技术本质”

Web前端开发工程师养成计划【转载】

Web前端开发工程师养成计划(入门篇) 最原始的忠告:这个世界上有想法的人很多,但是有想法又能实现它的人太少! 首先要感谢伟大的Web2.0概念.产品概念.用户体验概念.jQuery插件,是它们在中国日渐成熟才解放了一直以来姥姥不疼舅舅不爱的前端开发工程师们. 有没有发现从09年下半年到现在全中国的互联网公司都在招聘前端开发工程师?如果你注意到了,那么恭喜你,你已经拥有那么一点点预测互联网职场动向的能力. 可能令你感到遗憾的是你从没从事过前端开发工作,不过没关系,只要你肯努力,一切都是可以学会的

前端开发十日谈

原文链接: http://www.chengxuyuans.com/web_technology/43733.html http://kb.cnblogs.com/page/159704/ 一直想写这篇"十日谈",聊聊我对Web前端开发的体会,顺便解答下周围不少人的困惑和迷惘.我不打算聊太多技术,我想,通过技术的历练,得到的反思应当更重要. 我一直认为自己是"初级"前端开发工程师,一方面我入道尚浅,只有短短几年,另一方面我自知对技术的钻研并不深入,可能是由于环境的原

@拔赤:前端开发十日谈

一直想写这篇“十日谈”,聊聊我对Web前端开发的体会,顺便解答下周围不少人的困惑和迷惘.我不打算聊太多技术,我想,通过技术的历练,得到的反思应当更重要. 我一直认为自己是“初级”前端开发工程师,一方面我入道尚浅,只有短短几年,另一方面我自知对技术的钻研并不深入,可能是由于环境的原因,当然最重 要的是,我幸运的参与到互联网崛起的浪潮之巅.时势造就了一批技能薄弱但备受追捧的“弄潮者”,这在很大程度上影响我们对“技术本质”的洞察力,多年来也 一直未有成体系的“前端技术”布道佳作,以至于当下多数人对前端

成为一名专业的前端开发人员,需要学习什么?

你有没有看过你非常喜欢的网站,是否研究过它的布局方式,有没有想过我自己能不能也能实现一个,甚至比你看的网站更好! 所有这些可见的站点界面和特效都是通过前端开发构建的(有时也称为"前端Web开发").前端开发人员是一些最受欢迎的角色,目前各大知名互联网公司的前端开发人员的工资水平甚至超过了后端开发人员 那前端开发需要学什么呢?本篇将分解前端开发人员使用和需要的所有技能,先从前端开发的定义开始. 什么是前端开发? 虽然网页设计是网站的外观,但前端开发是将该设计的页面通过代码的形式在网络上进