前端面试题杂烩part1

web app

  1. 问题:手机端 click 事件会有大约 300ms 的延迟

    原因:手机端事件 touchstart --\> touchmove --> touchend or touchcancel --> click,因为在touch事件触发之后,浏览器要判断用户是否会做出双击屏幕的操作,所以会等待300ms来判断,再做出是否触发click事件的处理,所以就会有300ms的延迟
    解决方法:使用touch事件来代替click事件,如 zepto.js 的tap事件和fastClick,还有我自己也写了个移动端手势操作库mTouch,都有相应的事件可以代替click事件解决这个问题
  2. 问题:在部分机型下(如小米4、小米2s、中兴) body 设置的 font-size 是用 rem 单位的话,若其他元素没有设置font-size,该font-size值继承于body,则会很高概率出现字体异常变大的情况

    原因:估计是跟app的webview默认设置有关,body的font-size使用rem单位,就是相对于当前根节点的font-size来确定的,可能在某些webview的设置下,body用的是webview设置的默认字体大小,因为在我给html设置了一个px单位的默认font-size时,还是会出现字体异常变大的情况,具体webview的一些细节就没有再研究了
    解决方法:body设置一个px单位的默认font-size值,不用rem,或者给字体会异常变大的元素设定一个px单位的font-size值
  3. 问题:使用zepto的 tap 事件时会出现“点透”bug,比如:一个元素A绑定了tap事件,紧跟其后的元素B绑定了click事件,A触发tap事件时将自己remove掉,B就会自动“掉”到A的位置,接下来就是不正常的情况,因为这个时候B的click事件也触发了

    原因:因为tap事件是通过 touchstarttouchmovetouchend 这三个事件来模拟实现的,在手机端事件机制中,触发touch事件后会紧接着触发touch事件坐标元素的click事件,因为B元素在300ms内刚好“掉”回来A的位置,所以就触发了B的click事件,还有zepto的tap事件都是代理到body的,所以想通过e.preventDefault()阻止默认行为也是不可行的
    解决方法:(1)A元素换成click事件;(2)使用我写的库 mTouch 来给A绑定tap事件,然后在事件回调中通过e.preventDefault()来阻止默认行为,或者换用其他的支持tap事件的库
  4. 问题 iOS自动识别数字为手机号码,导致部分设置好的样式无效(字体颜色等)

    原因 iOS自动识别数字后会给数字加上 数字 标签,所以数字的部分样式继承了a标签的样式,导致部分样式无效
    解决方法:(1)meta 标签加上 阻止默认识别数字为电话;(2)设置样式的时候 css 选择器把a标签选上,如:
    123 // 原来样式 .number { color: #f00; } // 修改后样式 .number, .number a { color: #f00; }

一些有用技能点
  1. 通过设置css属性 -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 取消掉手机端webkit浏览器 点击按钮或超链接之类的 默认灰色背景色


  2. 设置css属性 -webkit-user-select:none; 控制用户不可选择文字


  3. 区域性 overflow: scroll | auto 滚动时使用原生效果:-webkit-overflow-scrolling: touch (ios8+,Android4.0+)


  4. 单行、多行溢出省略
    /* 单行省略 */ .ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }/* 多行省略 */ .ellipsis-2l { overflow : hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; /* 数值代表显示几行 */ -webkit-box-orient: vertical; }



  5. 垂直居中常用方法:
    /* css样式 *//* (1) 模仿单行文字居中的方式 */ .wrap { width: 200px; height: 80px; line-height: 80px; }.box { display: inline-block; vertical-align:middle; }/* (2) 已知宽高,通过position:absolute; */ .wrap { width: 200px; height: 200px; position: relative; }.box { width: 100px; height: 80px; position: absolute; left: 50%; top: 50%; margin: -50px 0 0 -40px; }/* (3) 未知宽高,通过css3属性 transfrom */ .wrap { width: 200px; height: 200px; position: relative; }.box { position: absolute; left: 50%; top: 50%; -webkit-transform: translateX(-50%) translateY(-50%); transform: translateX(-50%) translateY(-50%); }/* (4) 通过flex布局 *//* css样式 */.flexbox { display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; }/* 水平居中 */ .flexbox-center { -webkit-box-pack: center; -moz-box-pack: center; -ms-flex-pack: center; -webkit-justify-content: center; justify-content: center; }/* 垂直居中 */ .flexbox-middle { -webkit-box-align: center; -moz-box-align: center; -ms-flex-align: center; -webkit-align-items: center; align-items: center; }

  6. retina屏幕实现真正的1px边框
    /* css样式 */.box { width: 200px; heigth: 100px; box-sizing: border-box; border: 1px solid #aaa; }/* 去掉元素原有的边框 */ .retina-border { position: relative; border: none; }/* 通过设置伪元素放大到2倍的宽高,设置1px边框,再缩小1倍,以达到0.5px边框的效果*/ .retina-border:after { content: ''; display: block; width: 200%; height: 200%; position: absolute; left: 0; top: 0; box-sizing: border-box; border: 0px solid #aaa; -webkit-transform-origin: left top; transform-origin: left top; -webkit-transform: scale(.5); transform: scale(.5); }.rt-bd-all:after { border-width: 1px; }/* 如果只是想设置一条边框,可以这样改一下,以此类推 */
    /* css样式 */.tr-bd-b:after { border-bottom-width: 1px; }.tr-bd-t:after { border-top-width: 1px; }.tr-bd-l:after { border-left-width: 1px; }.tr-bd-r:after { border-right-width: 1px; }

  7. 关于水平、垂直、多列布局的多种实现参照:《利用HTML和CSS实现常见的布局》

目录
  1. 前言
  2. HTML 部分
  3. CSS 部分
  4. JavaScript 部分
  5. 其他问题
前言 本文总结了一些优质的前端面试题(多数源于网络),初学者阅后也要用心钻研其中的原理,重要知识需要系统学习,透彻学习,形成自己的知识链。万不可投机取巧,只求面试过关是错误的!
面试有几点需注意:(来源程劭非老师 github:@wintercn)
  1. 面试题目: 根据你的等级和职位变化,入门级到专家级:范围↑、深度↑、方向↑。
  2. 题目类型: 技术视野、项目细节、理论知识题,算法题,开放性题,案例题。
  3. 进行追问: 可以确保问到你开始不懂或面试官开始不懂为止,这样可以大大延展题目的区分度和深度,知道你的实际能力。因为这种关联知识是长时期的学习,绝对不是临时记得住的。
  4. 回答问题再棒,面试官(可能是你的直接领导面试),会考虑我要不要这个人做我的同事?所以态度很重要。(感觉更像是相亲)
  5. 资深的工程师能把absolute和relative弄混,这样的人不要也罢,因为团队需要的你这个人具有可以依靠的才能(靠谱)。
前端开发面试知识点大纲:
HTML&CSS: 对Web标准的理解、浏览器内核差异、兼容性、hack、CSS基本功:布局、盒子模型、选择器优先级及使用、HTML5、CSS3、移动端适应 JavaScript: 数据类型、面向对象、继承、闭包、插件、作用域、跨域、原型链、模块化、自定义事件、内存泄漏、事件机制、异步装载回调、模板引擎、Nodejs、JSON、ajax等。其他: HTTP、安全、正则、优化、重构、响应式、移动端、团队协作、可维护、SEO、UED、架构、职业生涯

作为一名前端工程师,无论工作年头长短都应该必须掌握的知识点:
1、DOM结构 —— 两个节点之间可能存在哪些关系以及如何在节点之间任意移动。2、DOM操作——如何添加、移除、移动、复制、创建和查找节点等。3、事件—— 如何使用事件,以及IE和标准DOM事件模型之间存在的差别。4、XMLHttpRequest —— 这是什么、怎样完整地执行一次GET请求、怎样检测错误。5、严格模式与混杂模式 —— 如何触发这两种模式,区分它们有何意义。6、盒模型 —— 外边距、内边距和边框之间的关系,及IE8以下版本的浏览器中的盒模型7、块级元素与行内元素 —— 怎么用CSS控制它们、以及如何合理的使用它们8、浮动元素——怎么使用它们、它们有什么问题以及怎么解决这些问题。9、HTML与XHTML——二者有什么区别,你觉得应该使用哪一个并说出理由。10、JSON—— 作用、用途、设计结构。

HTML
  • Doctype作用? 严格模式与混杂模式如何区分?它们有何意义?
    (1)、 声明位于文档中的最前面,处于标签之前。告知浏览器的解析器, 用什么文档类型 规范来解析这个文档。 (2)、严格模式的排版和 JS 运作模式是以该浏览器支持的最高标准运行。(3)、在混杂模式中,页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。(4)、DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。

  • 行内元素有哪些?块级元素有哪些? 空(void)元素有那些?
    (1)CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值, 比如div默认display属性值为“block”,成为“块级”元素; span默认display属性值为“inline”,是“行内”元素。(2)行内元素有:a b span img input select strong(强调的语气) 块级元素有:div ul ol li dl dt dd h1 h2 h3 h4…p(3)知名的空元素:
    前端面试题杂烩part1
    文章图片


    电子邮件处理提交表单




    在打开的子窗口刷新父窗口的代码里如何写?
    window.opener.location.reload()

    如何设定打开页面的大小


    在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动


    body
    {background-image:url(logo.gif); background-repeat:no-repeat; background-position:center }






    19. 检查一段字符串是否全由数字组成


    20. 获得一个窗口的大小
    document.body.clientWidth,document.body.clientHeight

    21. 怎么判断是否是字符
    if (/[^/x00-/xff]/g.test(s)) alert("含有汉字");
    else alert("全是字符");

    22.TEXTAREA自适应文字行数的多少


    23. 日期减去天数等于第二个日期


    24. 选择了哪一个Radio

    Style
    Barcode



    25.获得本页url的request.servervariables("")集合
    Response.Write ""
    for each ob in Request.ServerVariables
    Response.Write ""
    next
    Response.Write "
    Variablesvalue
    "&ob&""&Request.ServerVariables(ob)&"
    "

    26.
    本机ip
    服务器名
    服务器IP
    服务器端口
    服务器时间
    IIS版本
    脚本超时时间
    本文件路径
    服务器CPU数量
    服 务器解译引擎
    服务器操作系统

    27.ENTER键可以让光标移到下一个输入框


    28. 检测某个网站的链接速度:
    把如下代码加入区域中:


    29. 各种样式的光标
    auto :标准光标
    default :标准箭头
    hand :手形光标
    wait :等待光标
    text :I形光标
    vertical-text :水平I形光标
    no-drop :不可拖动光标
    not-allowed :无效光标
    help :?帮助光标
    all-scroll :三角方向标
    move :移动标
    crosshair :十字标
    e-resize
    n-resize
    nw-resize
    w-resize
    s-resize
    se-resize
    sw-resize
    上面的错误
    将彻底屏蔽鼠标右键

    这个是彻底的!但是在下觉得都是自欺欺人的东西






    彻底禁止右键快捷菜单的出现呢?其实只要将上述代码做如下修改即可。

    < Script Language=javascript>
    function Click(){
    alert('版权所有(C)2001 XXX工作室');
    window.event.returnvalue=https://www.it610.com/article/false;
    }
    document.oncontextmenu=Click;
    < /Script>

    这 样无论采取什么方式点击鼠标,都不会再出现快捷菜单了。不过值得注意的是,如果访问者直接在浏览器地址栏中键 入"javascript:alert(document.oncontextmenu='')",就可以解除对右键菜单的屏蔽。对这类访问者怎样防范 呢?其实,把地址栏隐藏掉就可以了,具体方法见本文介绍的"屏蔽窗口菜单栏查看方式"。



    屏蔽窗口菜单栏查看方式

    制作过网页的朋友都知道,对新打开窗口的各种属性可以进行控制,具体包括控制菜单栏、滚动条及地址栏是否可见等。如果把父窗口关闭,并将新打开窗口的菜单栏和地址栏隐藏,不就可以屏蔽窗口菜单栏查看方式了吗?实现代码如下:

    < Head>
    < Object id=closes type="application/x-oleobject"
    classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
    < Param name="Command" value="https://www.it610.com/article/Close">
    < /Object>
    < /Head>
    < Body>
    < Script Language=javascript>
    closes.Click()
    window.open("XXX.htm","","menubar=no,location=no,
    scrollbars=yes,resizable=yes")
    < /Script>
    < /Body>

    这 种方法的原理就是首先将自己网站的首页制作成index.htm形式,把首页设计成一个过渡页。然后将自己的真正主页制作成default.htm形式 (具体实现过程见本文所附源代码)。这样访问者无论如何也无法查看网页源代码了。这不仅仅保护了您的版权,也为进一步开发提供了保障。通过此方法,您可以 结合Cookie技术,真正做到限制用户浏览网页,从而避免主页资料被非法访问者访问。

    附:源代码清单
    index.htm
    < Head>
    < Object id=closes type="application/x-oleobject" classid="clsid:
    adb880a6-d8ff-11cf-9377-00aa003b7a11">
    < Param name="Command" value="https://www.it610.com/article/Close">
    < /Object>
    < /Head>
    < Body>
    < Script Language=javascript>
    closes.Click()
    window.open("defalut.htm","","menubar=no,location=no,
    scrollbars=yes,resizable=yes")
    < /Script>
    < /Body>
    default.htm
    < Html>
    < Head>
    < Script Language=javascript>
    function Click(){
    alert('版权所有(C)2001 XXX工作室');
    window.event.returnvalue=https://www.it610.com/article/false;
    }
    document.oncontextmenu=Click;
    < /Script>
    < /Head>
    < Body>
    ... ...
    < /Body>
    < /Html>

    来自:http://blog.csdn.net/21aspnet/article/details/166576




















    js 验证表单 js提交验证类http://www.cnblogs.com/zwl12549/archive/2008/01/07/1028701.html 附加:js验证radio是否选择





    1. 长度限制






    2. 只能是汉字


    3." 只能是英文




    4. 只能是数字




    5. 只能是英文字符和数字


    6. 验证油箱格式



    7. 屏蔽关键字(这里屏蔽***和****)






    8. 两次输入密码是否相同






    够了吧
    屏蔽右键 很酷
    oncontextmenu="return false" ondragstart="return false" onselectstart="return false"
    加在body中




    2.1表单项不能为空



    2.2比较两个表单项的值是否相同



    2.3表单项只能为数字和"_",用于电话/银行帐号验证上,可扩展到域名注册等




    2.4表单项输入数值/长度限定



    2.5中文/英文/数字/邮件地址合法性判断



    2.6限定表单项不能输入的字符






    去除数组中所有重复元素http://www.cnblogs.com/AndyCf/p/5207123.html //去除数组中重复元素
    var arr = [0,2,3,1,5,5,8,8,2,1,10,10,43,43];
    var json = {};
    for (var i = 0; i < arr.length; i++) {
    if (!json[arr[i]]) {
    json[arr[i]] = arr[i];
    }
    };
    输出结果:0,1,2,3,5,8,10,43
    //删除函数中指定的元素
    //这样就构造了这样一个函数,比如我有有一个数组:
    var emp = ['abs','dsf','sdf','fd']

    emp.remove('fd');

    前几天去面试了一家公司,整下改公司的面试题。
    1.新的 HTML5 文档类型和字符集是? HTML5 文档类型很简单:

    HTML5 使用 UTF-8 编码示例:

    2.HTML5 中如何嵌入音频? 当前,audio 元素支持三种音频格式:

    前端面试题杂烩part1
    文章图片

    前端面试题杂烩part1
    文章图片
    3.HTML5 中如何嵌入视频? 当前,video 元素支持三种视频格式:


    4.除了 audio 和 vidio,HTML5还有哪些媒体标签? 标签定义嵌入的内容,比如插件。

    标签允许您规定可替换的视频/音频文件供浏览器根据它对媒体类型或者编解码器的支持进行选择。

    播放带有字幕的视频:

    5.HTML5 存储类型有什么区别? HTML5 能够本地存储数据,在之前都是使用 cookies 使用的。HTML5 提供了下面两种本地存储方案:
    • localStorage - 没有时间限制的数据存储,数据永远不会过期,关闭浏览器也不会丢失
    • sessionStorage - 针对一个 session 的数据存储,同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。
    6.HTML5 canvas 元素有什么作用? 用于在网页上绘制图形,该元素标签强大之处在于可以直接在 HTML5 上进行图形操作
    前端面试题杂烩part1
    文章图片
    Document

    前端面试题杂烩part1
    文章图片
    效果:

    7.HTML5 有哪些新增的表单元素? 新的input类型:

    新的表单元素:

    8.HTML5 废弃了那些 HTML4 标签?
    9.HTML5 标准提供了哪些新的API? 1:canvas,不用多说,可以画出很多绚丽的图形,甚至可以直接做出伪3D游戏。
    2:媒体控制,也很好理解(直译就是回放功能,假如只用html5.0以下的标签写,以前的音乐播放是不可能实现滚动条的。)
    3:离线网页程序,可以把资源文件完全缓存在客户端,并且通过js的一些方法清空缓存
    4:文档编辑,应该是更好的支持对文档的编辑。
    5:拖动,可以将文件拖动到某些区域上传
    6:跨文档请求,websocket,一种更加高效的通讯方式
    7:历史管理,可以通过js管理和插入历史记录
    8:MIME头自定义
    9:客户端数据存储,localstoage sessionstoage
    10:地理位置共享
    11:本地数据库
    12:索引数据库
    10.HTML5 应用程序缓存和浏览器缓存有什么区别? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问。
    应用程序缓存为应用带来三个优势:
    离线浏览 - 用户可在应用离线时使用它们
    速度 - 已缓存资源加载得更快
    减少服务器负载 - 浏览器将只从服务器下载更新过或更改过的资源。
    实现借助于 manifest 文件

    11.doctype 作用?严格模式与混合模式如何区分?它们有何意义? 声明可告知浏览器文档使用哪种 HTML 或 XHTML 规范。
    在标准模式中,浏览器根据规范呈现页面;在混杂模式中,页面以一种比较宽松的向后兼容的方式显示
    前端面试题杂烩part1
    文章图片

    前端面试题杂烩part1
    文章图片
    12.行内元素有哪些?块级元素有哪些?空(void)元素有哪些? 块级元素:
    address - 地址
    blockquote - 块引用
    center - 举中对齐块
    dir - 目录列表
    div - 常用块级容易,也是css layout的主要标签
    dl - 定义列表
    fieldset - form控制组
    form - 交互表单
    h1 - 大标题
    h2 - 副标题
    h3 - 3级标题
    h4 - 4级标题
    h5 - 5级标题
    h6 - 6级标题
    hr - 水平分隔线
    isindex - input prompt
    menu - 菜单列表
    noframes - frames可选内容,(对于不支持frame的浏览器显示此区块内容
    noscript - 可选脚本内容(对于不支持script的浏览器显示此内容)
    ol - 排序表单
    p - 段落
    pre - 格式化文本
    table - 表格
    ul - 非排序列表

    行级元素:
    a - 锚点
    abbr - 缩写
    acronym - 首字
    b - 粗体(不推荐)
    bdo - bidi override
    big - 大字体
    br - 换行
    cite - 引用
    code - 计算机代码(在引用源码的时候需要)
    dfn - 定义字段
    em - 强调
    font - 字体设定(不推荐)
    i - 斜体
    img - 图片
    input - 输入框
    kbd - 定义键盘文本
    label - 表格标签
    q - 短引用
    s - 中划线(不推荐)
    samp - 定义范例计算机代码
    select - 项目选择
    small - 小字体文本
    span - 常用内联容器,定义文本内区块
    strike - 中划线
    strong - 粗体强调
    sub - 下标
    sup - 上标
    textarea - 多行文本输入框
    tt - 电传文本
    u - 下划线
    空元素,没有内容的 HTML 元素被称为空元素:


    - 定义换行
    - 分割线

    前端面试题杂烩part1
    文章图片
    window.οnlοad=function(){ document.getElementsByTagName('a')[0].οnclick=function(){ if (window.XMLHttpRequest){ var xmlhttp=new XMLHttpRequest(); }else{ var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } var method='GET'; var url=this.href; xmlhttp.open(method,url); xmlhttp.send(); xmlhttp.onreadystatechange=function(){ if(xmlhttp.readyState==4){ if(xmlhttp.status==200||xmlhttp.status==304){ var txt=xmlhttp.responseText; var json=eval('('+txt+')'); document.getElementById('name').innerHTML='姓名'+json.ruei.name; document.getElementById('age').innerHTML='年龄'+json.ruei.age; document.getElementById('job').innerHTML='工作'+json.ruei.job; } } } return false; } }

    前端面试题杂烩part1
    文章图片
    17.请实现,鼠标点击页面中的任意标签,alert 该标签的名称(注意兼容性) 前端面试题杂烩part1
    文章图片
    alert标签名
    div
    a b

    前端面试题杂烩part1
    文章图片
    18.请指出以下代码的性能问题,并进行优化。 前端面试题杂烩part1
    文章图片
    var info="淘家趣(www.taojiaqu.com)是一个关注潮流的资讯类购物网站。"; info+="提供新鲜好玩的家装资讯,电子科技,家趣产品。"; info+="精选的趣家商品,创意的家趣装修。"; info+="淘-趣家优品,享-生活乐趣。"; info=info.split(","); for(var i=0 in info){ alert(info[i]); };

    前端面试题杂烩part1
    文章图片
    更改后:
    var info="淘家趣(www.taojiaqu.com)是一个关注潮流的资讯类购物网站。提供新鲜好玩的家装资讯,电子科技,家趣产品。精选的趣家商品,创意的家趣装修。淘-趣家优品,享-生活乐趣。"; info=info.split(","); for(var i=0,max=info.length; i
    火狐测试后,平均时间块2-3毫秒,有可以改进的还望指出...
    19.请给出异步加载js方案,不少于两种。 默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很大的javascript,如果放在页头会导致加载很慢的话,是会严重影响用户体验的。
    1.defer(只支持IE)

    2.async规定一旦脚本可用,则会异步执行,只适用于外部脚本

    3.创建script,插入到DOM中,加载完毕后callBack
    前端面试题杂烩part1
    文章图片
    alert标签名

    前端面试题杂烩part1
    文章图片
    20。请写出jquery绑定事件的方法,不少于两种。 .bind()是直接绑定在元素上
    .live()则是通过冒泡的方式来绑定到元素上的。更适合列表类型的,绑定到document DOM节点上。和.bind()的优势是支持动态数据。(live由于性能原因已经被废弃)
    .delegate()则是更精确的小范围使用事件代理,性能优于.live()
    .on()则是最新的1.9版本整合了之前的三种方式的新事件绑定机制
    1.无论使用bind、on、delegate、click(function())都是重复绑定,即绑定的同类型事件被放到一个事件队列中,依次执行,后绑定的事件不会替换之前绑定的,对于on使用off,delegate用undelegate,bind及click使用unbind来解除绑定,例如unbind(type)传递为事件类型,如果不传type则解出所有事件绑定;需要注意的是元素本身自带的事件无法unbind(如button1)
    2.要绑定自定义事件,如'open',以上函数都可以使用,但激活需要使用trigger
    【前端面试题杂烩part1】3.建议使用on函数
    前端面试题杂烩part1
    文章图片
    $('.myClass').on({ click:function(eleDom){ ...do someting }, dbclick:function(eleDom){ ...do someting } })

    前端面试题杂烩part1
    文章图片


    知识有限,写的东西有不足或者错误信息还望各路大神指点指点,共勉进步。
    目前一直致力于 淘家趣(www.taojiaqu.com)开发和完善。开发完善中我会不定时分享我的心得和体会。。
    所谓成功,就是不停地经历失败,并且始终保持热情... MVC
    的优缺点有?
    答:
    优点:
    ⑴产品结构清晰

    ⑵易于维护

    ⑶满足用户的需求


    有利于软件工程化管理
    缺点:
    ⑴增加了系统结构的复杂性

    ⑵视图与控制器间的过于紧密的链接

    ⑶视图对模型数据的
    低效率访问



      推荐阅读