Android面试题View篇

Android面试题View篇,由本人整理汇总,后续将推出系列篇,如果喜欢请持续关注和推荐。

Activity生命周期?

onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()

Activity的启动过程(不要回答生命周期)

app启动的过程有两种情况,*种是从桌面launcher上点击相应的应用图标,第二种是在activity中通过调用startActivity来启动一个新的activity。 我们创建一个新的项目,默认的根activity都是MainActivity,而所有的activity都是保存在堆栈中的,我们启动一个新的activity就会放在上一个activity上面,而我们从桌面点击应用图标的时候,由于launcher本身也是一个应用,当我们点击图标的时候,系统就会调用startActivitySately(),一般情况下,我们所启动的activity的相关信息都会保存在intent中,比如action,category等等。我们在安装这个应用的时候,系统也会启动一个PackaManagerService的管理服务,这个管理服务会对AndroidManifest.xml文件进行解析,从而得到应用程序中的相关信息,比如service,activity,Broadcast等等,然后获得相关组件的信息。当我们点击应用图标的时候,就会调用startActivitySately()方法,而这个方法内部则是调用startActivty(),而startActivity()方法*终还是会调用startActivityForResult()这个方法。而在startActivityForResult()这个方法。因为startActivityForResult()方法是有返回结果的,所以系统就直接给一个-1,就表示不需要结果返回了。而startActivityForResult()这个方法实际是通过Instrumentation类中的execStartActivity()方法来启动activity,Instrumentation这个类主要作用就是监控程序和系统之间的交互。而在这个execStartActivity()方法中会获取ActivityManagerService的代理对象,通过这个代理对象进行启动activity。启动会就会调用一个checkStartActivityResult()方法,如果说没有在配置清单中配置有这个组件,就会在这个方法中抛出异常了。当然*后是调用的是Application.scheduleLaunchActivity()进行启动activity,而这个方法中通过获取得到一个ActivityClientRecord对象,而这个ActivityClientRecord通过handler来进行消息的发送,系统内部会将每一个activity组件使用ActivityClientRecord对象来进行描述,而ActivityClientRecord对象中保存有一个LoaderApk对象,通过这个对象调用handleLaunchActivity来启动activity组件,而页面的生命周期方法也就是在这个方法中进行调用。

Activity的启动模式

standard:默认标准模式,每启动一个都会创建一个实例,

singleTop:栈顶复用,如果在栈顶就调用onNewIntent复用,从onResume()开始

singleTask:栈内复用,本栈内只要用该类型Activity就会将其顶部的activity出栈

singleInstance:单例模式,除了3中特性,系统会单独给该Activity创建一个栈,

Activity缓存方法

1.配置改变导致Activity被杀死,横屏变竖屏:在onStop之前会调用onSaveInstanceState()保存数据在重建Activity之后,会在onStart()之后调用onRestoreInstanceState(),并把保存下来的Bundle传给onCreate()和它会默认重建Activity当前的视图,我们可以在onCreate()中,回复自己的数据。

2.内存不足杀掉Activity,优先级分别是:前台可见,可见非前台,后台。

Service的生命周期,两种启动方法,有什么区别

context.startService() ->onCreate()- >onStart()->Service running–>(如果调用context.stopService() )->onDestroy() ->Service shut down

1.如果Service还没有运行,则调用onCreate()然后调用onStart();

2.如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。

3.调用stopService的时候直接onDestroy,

4.如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。

context.bindService()->onCreate()->onBind()->Service running–>onUnbind() -> onDestroy() ->Service stop

1.onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。

2.这个时候会把调用者和Service绑定在一起,Context退出了,Service就会调用onUnbind->onDestroy相应退出。

3.所以调用bindService的生命周期为:onCreate –> onBind(只一次,不可多次绑定) –> onUnbind –> onDestory。

静态的Broadcast 和动态的有什么区别

1.动态的比静态的安全

2.静态在app启动的时候就初始化了 动态使用代码初始化

3.静态需要配置 动态不需要

4.生存期,静态广播的生存期可以比动态广播的长很多

5.优先级动态广播的优先级比静态广播高

6.静态不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于想开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。

7.动态叫非常驻型广播,收到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。*后需要解绑,否会会内存泄露。

8.广播是分为有序广播和无序广播。

Android的布局方式有哪些?

LinearLayout,RelativeLayout,TableLayout,FrameLayout,AbsoluteLayout,GridLayout

在创建fragment时如何传递初始化参数?

Fragment初始化一定要提供默认构造函数。不能用构造函数传递参数!不要写带参数的构造函数。在Fragment里添加获取Fragment的newInstance函数,以后获取Fragment就使用这个函数,不要使用构造函数新建Fragment!使用setArgument和getArgument传递参数

设备横竖屏切换的时候,接下来会发生什么?

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

Android启动Service的两种方式是什么? 它们的适用情况是什么?

如果后台服务开始后基本可以独立运行的话,可以用startService。音乐播放器就可以这样用。它们会一直运行直到你调用 stopSelf或者stopService。你可以通过发送Intent或者接收Intent来与正在运行的后台服务通信,但大部分时间,你只是启动服务并让它独立运行。如果你需要与后台服务通过一个持续的连接来比较频繁地通信,建议使用bind()。比如你需要定位服务不停地把更新后的地理位置传给UI。Binder比Intent开发起来复杂一些,但如果真的需要,你也只能使用它。

startService:生命周期与调用者不同。启动后若调用者未调用stopService而直接退出,Service仍会运行

bindService:生命周期与调用者绑定,调用者一旦退出,Service就会调用unBind->onDestroy

谈谈你对Android中Context的理解?

Context是一个抽象基类。在翻译为上下文,也可以理解为环境,是提供一些程序的运行环境基础信息。Context下有两个子类,ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类。而ContextWrapper又有三个直接的子类, ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一个带主题的封装类,而它有一个直接子类就是Activity,所以Activity和Service以及Application的Context是不一样的,只有Activity需要主题,Service不需要主题。Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的,因此在*大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。

getApplicationContext()和getApplication()方法得到的对象都是同一个application对象,只是对象的类型不一样。 Context数量 = Activity数量 + Service数量 + 1 (1为Application)

理解Activity,View,Window三者关系

这个问题真的很不好回答。所以这里先来个算是比较恰当的比喻来形容下它们的关系吧。Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图)LayoutInflater像剪刀,Xml配置像窗花图纸。 1:Activity构造的时候会初始化一个Window,准确的说是PhoneWindow。 2:这个PhoneWindow有一个“ViewRoot”,这个“ViewRoot”是一个View或者说ViewGroup,是*初始的根视图。 3:“ViewRoot”通过addView方法来一个个的添加View。比如TextView,Button等 4:这些View的事件监听,是由WindowManagerService来接受消息,并且回调Activity函数。比如onClickListener,onKeyDown等。

Service的onCreate回调在UI线程中吗?

Service生命周期的各个回调和其他的应用组件一样,是跑在主线程中,会影响到你的UI操作或者阻塞主线程中的其他事情。

View的绘制流程

自定义控件: 1、组合控件。这种自定义控件不需要我们自己绘制,而是使用原生控件组合成的新控件。如标题栏。 2、继承原有的控件。这种自定义控件在原生控件提供的方法外,可以自己添加一些方法。如制作圆角,圆形图片。 3、完全自定义控件:这个View上所展现的内容全部都是我们自己绘制出来的。比如说制作水波纹进度条。

View的绘制流程:OnMeasure()——>OnLayout()——>OnDraw()

*步:OnMeasure():测量视图大小。从顶层父View到子View递归调用measure方法,measure方法又回调OnMeasure。

第二步:OnLayout():确定View位置,进行页面布局。从顶层父View向子View的递归调用view.layout方法的过程,即父View根据上一步measure子View所得到的布局大小和布局参数,将子View放在合适的位置上。

第三步:OnDraw():绘制视图。ViewRoot创建一个Canvas对象,然后调用OnDraw()。六个步骤:①、绘制视图的背景;②、保存画布的图层(Layer);③、绘制View的内容;④、绘制View子视图,如果没有就不用; ⑤、还原图层(Layer);⑥、绘制滚动条。

View,ViewGroup事件分发

Touch事件分发中只有两个主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个相关事件。View包含dispatchTouchEvent、onTouchEvent两个相关事件。其中ViewGroup又继承于View。

ViewGroup和View组成了一个树状结构,根节点为Activity内部包含的一个ViwGroup。

触摸事件由Action_Down、Action_Move、Aciton_UP组成,其中一次完整的触摸事件中,Down和Up都只有一个,Move有若干个,可以为0个。

当Acitivty接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup的遍历可以看成是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent结果返回true。

当某个子View返回true时,会中止Down事件的分发,同时在ViewGroup中记录该子View。接下去的Move和Up事件将由该子View直接进行处理。由于子View是保存在ViewGroup中的,多层ViewGroup的节点结构时,上级ViewGroup保存的会是真实处理事件的View所在的ViewGroup对象:如ViewGroup0-ViewGroup1-TextView的结构中,TextView返回了true,它将被保存在ViewGroup1中,而ViewGroup1也会返回true,被保存在ViewGroup0中。当Move和UP事件来时,会先从ViewGroup0传递至ViewGroup1,再由ViewGroup1传递至TextView。

当ViewGroup中所有子View都不捕获Down事件时,将触发ViewGroup自身的onTouch事件。触发的方式是调用super.dispatchTouchEvent函数,即父类View的dispatchTouchEvent方法。在所有子View都不处理的情况下,触发Acitivity的onTouchEvent方法。

onInterceptTouchEvent有两个作用:1.拦截Down事件的分发。2.中止Up和Move事件向目标View传递,使得目标View所在的ViewGroup捕获Up和Move事件。

Android中touch事件的传递机制是怎样的?

1.Touch事件传递的相关API有dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent

2.Touch事件相关的类有View、ViewGroup、Activity

3.Touch事件会被封装成MotionEvent对象,该对象封装了手势按下、移动、松开等动作

4.Touch事件通常从Activity#dispatchTouchEvent发出,只要没有被消费,会一直往下传递,到*底层的View

5.如果Touch事件传递到的每个View都不消费事件,那么Touch事件会反向向上传递,*终交由Activity#onTouchEvent处理

6.onInterceptTouchEvent为ViewGroup特有,可以拦截事件

7.Down事件到来时,如果一个View没有消费该事件,那么后续的MOVE/UP事件都不会再给它

Fragment与Fragment、Activity通信的方式

直接在一个Fragment中调用另外一个Fragment中的方法

使用接口回调

使用广播

Fragment直接调用Activity中的public方法

在创建fragment时如何传递初始化参数?

Fragment初始化一定要提供默认构造函数。不能用构造函数传递参数!不要写带参数的构造函数。在Fragment里添加获取Fragment的newInstance函数,以后获取Fragment就使用这个函数,不要使用构造函数新建Fragment!使用setArgument和getArgument传递参数

如何规避oom?

使用更加轻量的数据结构

避免在Android里面使用Enum

减小Bitmap对象的内存占用

使用更小的图片

复用系统自带的资源

注意在ListView/GridView等出现大量重复子组件的图里面对ConvertView的复用

Bitmap对象的复用

避免在onDraw方法里面执行对象的创建

避免对象的内存泄露(重点)

考虑使用Application Context而不是Activity Context

注意WebView的泄漏(重点)

资源文件需要选择合适的文件夹进行存放

谨慎使用static对象(重点)

特别留意单例对象中不合理的持有

珍惜Services资源

谨慎使用“抽象”编程

谨慎使用依赖注入框架

.谨慎使用多进程

Handler的使用(重点)

强软弱虚引用的应用(重点)

主线程操作UI,子线程操作数据(必填)

Android 中如何捕获未捕获的异常

自 定 义 一 个 Application , 比 如 叫 MyApplication 继 承 Application 实 现 UncaughtExceptionHandler。 覆写 UncaughtExceptionHandler 的 onCreate 和 uncaughtException 方法。

保存Activity状态

onSaveInstanceState(Bundle)会在activity转入后台状态之前被调用,也就是onStop()方法之前,onPause方法之后被调用;

数据存储有哪些方式?

1.sharedpreferences 2.file 3.Sqlite 4.ContentProvide 5.网络存储

如何将一个Activity设置成窗口的样式?

*种方法,在styles.xml文件中,可以新建如下的类似Dialog的style。

<style name=”Theme.FloatActivity” parent=”android:style/Theme.Dialog”> </style>。
第二种方法,在AndroidManifest.xml中在需要显示为窗口的Activity中添加如下属性: android:theme=“@style/Theme.FloatActivity”。 也可以直接添加对应需要展示为Dialog style的Activity的android:theme属性为android:theme=“@android:style/Theme.Dialog”。

ScrollView是否可以和ListView混合使用?如何可以,说明混合使用的方式,如果不行,说明原因。

可以,计算整个ListView的高度,填充数据后重新设置ListView高度,重写onMeasure和onInterceptTouchEvent方法

解决ScrollView嵌套ListView和GridView冲突的方法

重写ListView的onMeasure方法,来自定义高度: 解决ScrollView嵌套ListView和GridView冲突的方法 重写ListView的onMeasure方法,来自定义高度:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
通过Intent传递一些二进制数据的方法有哪些? 使用Serializable接口实现序列化,这是Java常用的方法。 实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见的。

Serializable 和 Parcelable 的区别

在使用内存的时候,Parcelable 类比 Serializable 性能高,所以推荐使用 Parcelable 类。

Serializable 在序列化的时候会产生大量的临时变量,从而引起频繁的 GC。

Parcelable 不能使用在要将数据存储在磁盘上的情况。尽管 Serializable 效率低点,但在这 种情况下,还是建议你用 Serializable 。

Bitmap的处理

1.当使用ImageView的时候,可能图片的像素大于ImageView,此时就可以通过BitmapFactory.Option来对图片进行压缩,inSampleSize表示缩小2^(inSampleSize-1)倍。

2.BitMap的缓存:

1.同步加载只创建一个线程然后按照顺序进行图片加载

2.异步加载使用线程池,让存在的加载任务都处于不同线程

3.为了不开启过多的异步任务,只在列表静止的时候开启图片加载

1.使用LruCache进行内存缓存。

2.使用DiskLruCache进行硬盘缓存。

3.实现一个ImageLoader的流程:同步异步加载、图片压缩、内存硬盘缓存、网络拉取

过度绘制、卡顿优化:

1.过度绘制:

1.移除Window默认的Background:getWidow.setBackgroundDrawable(null);

2.移除XML布局文件中非必需的Background

3.减少布局嵌套(扁平化的一个体现,减少View数的深度,也就减少了View树的遍历时间,渲染的时候,前后期的工作,总是按View树结点来)

4.在引入布局文件里面,*外层可以用merge替代LinearLayout,RelativeLayout,这样把子UI元素直接衔接在include位置

5.工具:HierarchyViewer 查看视图层级

2.卡顿优化:16ms数据更新

view绘制机制和加载过程,请详细说整个流程

1.ViewRootImpl会调用performTraversals(),其内部会调用performMeasure()、performLayout、performDraw()。

2.performMeasure()会调用*外层的ViewGroup的measure()–>onMeasure(),ViewGroup的onMeasure()是抽象方法,但其提供了measureChildren(),这之中会遍历子View然后循环调用measureChild()这之中会用getChildMeasureSpec()+父View的MeasureSpec+子View的LayoutParam一起获取本View的MeasureSpec,然后调用子View的measure()到View的onMeasure()–>setMeasureDimension(getDefaultSize(),getDefaultSize()),getDefaultSize()默认返回measureSpec的测量数值,所以继承View进行自定义的wrap_content需要重写。

3.performLayout()会调用*外层的ViewGroup的layout(l,t,r,b),本View在其中使用setFrame()设置本View的四个顶点位置。在onLayout(抽象方法)中确定子View的位置,如LinearLayout会遍历子View,循环调用setChildFrame()–>子View.layout()。

4.performDraw()会调用*外层ViewGroup的draw():其中会先后调用background.draw()(绘制背景)、onDraw()(绘制自己)、dispatchDraw()(绘制子View)、onDrawScrollBars()(绘制装饰)。

5.MeasureSpec由2位SpecMode(UNSPECIFIED、EXACTLY(对应精确值和match_parent)、AT_MOST(对应warp_content))和30位SpecSize组成一个int,DecorView的MeasureSpec由窗口大小和其LayoutParams决定,其他View由父View的MeasureSpec和本View的LayoutParams决定。ViewGroup中有getChildMeasureSpec()来获取子View的MeasureSpec。

6.三种方式获取measure()后的宽高:

1.Activity#onWindowFocusChange()中调用获取

2.view.post(Runnable)将获取的代码投递到消息队列的尾部。

3.ViewTreeObservable.

Bitmap图像模式有哪几种,给出一张1080 * 1920的,ARGB 8888格式的占用内存是多大

Bitmap.Config ARGB_4444:每个像素占四位,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位

Bitmap.Config ARGB_8888:每个像素占四位,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位

Bitmap.Config RGB_565:每个像素占四位,即R=5,G=6,B=5,没有透明度,那么一个像素点占5+6+5=16位

Bitmap.Config ALPHA_8:每个像素占四位,只有透明度,没有颜色。

ARGB:指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue。 ARGB 8888一个像素占用4个字节,一个字节8位,1080 * 1920 * 4 * 8

图片优化

对图片本身进行操作。尽量不要使用setImageBitmap、setImageResource、BitmapFactory.decodeResource来设置一张大图,因为这些方法在完成decode后, *终都是通过java层的createBitmap来完成的,需要消耗更多内存.

图片进行缩放的比例,SDK中建议其值是2的指数值,值越大会导致图片不清晰。

不用的图片记得调用图片的recycle()方法

Android UI适配

字体使用sp,使用dp,多使用match_parent,wrap_content,weight 图片资源,不同图片的的分辨率,放在相应的文件夹下可使用百分比代替。

Android中的几种动画

帧动画:Drawable Animation,指通过指定每一帧的图片和播放时间,有序的进行播放而形成动画效果,比如想听的律动条。

补间动画:View Animation(Tween Animation),指通过指定View的初始状态、变化时间、方式,通过一系列的算法去进行图形变换,从而形成动画效果,主要有Alpha、Scale、Translate、Rotate四种效果。注意:只是在视图层实现了动画效果,并没有真正改变View的属性,比如滑动列表,改变标题栏的透明度。

属性动画:Property Animation,在Android3.0的时候才支持,通过不断的改变View的属性,不断的重绘而形成动画效果。相比于视图动画,View的属性是真正改变了。比如view的旋转,放大,缩小。

HybridApp WebView和JS交互

Android与JS通过WebView互相调用方法,实际上是: Android去调用JS的代码

通过WebView的loadUrl(),使用该方法比较简洁,方便。但是效率比较低,获取返回值比较困难。

通过WebView的evaluateJavascript(),该方法效率高,但是4.4以上的版本才支持,4.4以下版本不支持。所以建议两者混合使用。 JS去调用Android的代码

通过WebView的addJavascriptInterface()进行对象映射 ,该方法使用简单,仅将Android对象和JS对象映射即可,但是存在比较大的漏洞。

漏洞产生原因是:当JS拿到Android这个对象后,就可以调用这个Android对象中所有的方法,包括系统类(java.lang.Runtime 类),从而进行任意代码执行。 解决方式: (1)Google 在Android 4.2 版本中规定对被调用的函数以 @JavascriptInterface进行注解从而避免漏洞攻击。 (2)在Android 4.2版本之前采用拦截prompt()进行漏洞修复。

本文完~

【前端面试题】关于性能优化的面试题(附答案)

%title插图%num

随着前端项目不断扩大,浏览器渲染的压力变得越来越重。配置好一点的计算机可以顺利地展现页面;配置低一些的计算机渲染页面的性能就不那么可观了。

性能优化部分的面试题主要考察应试者对网站性能优化的了解。如何做好性能优化,哪些操作会引起性能优化的问题,性能优化指标是什么等,都值得应试者关注。

因为性能优化变得越来越重要,所以很多企业专门建立团队去做性能优化。

1、谈谈你对重构的理解。

网站重构是指在不改变外部行为的前提下,简化结构、添加可读性,且在网站前端保持一致的行为。也就是说,在不改变UI的情况下,对网站进行优化,在扩展的同时保持一致的UI。

对于传统的网站来说,重构通常包括以下方面。

  • 把表格( table)布局改为DV+CSS。
  • 使网站前端兼容现代浏览器。
  • 对移动平台进行优化。
  • 针对搜索引擎进行优化。

深层次的网站重构应该考虑以下方面。

  • 减少代码间的耦合
  • 让代码保持弹性。
  • 严格按规范编写代码。
  • 设计可扩展的API。
  • 代替旧的框架、语言(如VB)
  • 增强用户体验。
  • 对速度进行优化。
  • 压缩 JavaScript、CSS、 image等前端资源(通常由服务器来解决)。
  • 优化程序的性能(如数据读写)。
  • 采用CDN来加速资源加载。
  • 优化 JavaScript DOM。
  • 缓存HTTP服务器的文件。

2、如果一个页面上有大量的图片(大型电商网站),网页加载很慢,可以用哪些方法优化这些图片的加载,从而提升用户体验?

对于图片懒加载,可以为页面添加一个滚动条事件,判断图片是否在可视区域内或者即将进入可视区域,优先加载。

如果为幻灯片、相册文件等,可以使用图片预加载技术,对于当前展示图片的前一张图片和后一张图片优先下载。

如果图片为CSS图片,可以使用 CSS Sprite、SVG sprite、 Icon font、Base64等技术。

如果图片过大,可以使用特殊编码的图片,加载时会先加载一张压缩得特别小的缩略图,以提高用户体验。

如果图片展示区域小于图片的真实大小,则应在服务器端根据业务需要先行进行图片压缩,图片压缩后,图片大小与展示的就一致了。

3、谈谈性能优化问题。

可以在以下层面优化性能。

  • 缓存利用:缓存Ajax,使用CDN、外部 JavaScript和CSS文件缓存,添加 Expires头,在服务器端配置Etag,减少DNS查找等。
  • 请求数量:合并样式和脚本,使用CSS图片精灵,初始首屏之外的图片资源按需加载,静态资源延迟加载。
  • 请求带宽:压缩文件,开启GZIP 。
  • CSS代码:避免使用CSS表达式、高级选择器、通配选择器。
  • JavaScript代码:用散列表来优化查找,少用全局变量,用 innerHTML代替DOM操作,减少DOM操作次数,优化 JavaScript性能,用 setTimeout避免页面失去响应,缓存DOM节点查找的结果,避免使用with(with会创建自己的作用域,增加作用域链的长度),多个变量声明合并。
  • HTML代码:避免图片和 iFrame等src属性为空。src属性为空,会重新加载当前页面,影响速度和效率,尽量避免在HTML标签中写 Style属性

4、移动端性能如何优化?

优化方式如下。

  • 尽量使用CSS3动画,开启硬件加速。
  • 适当使用 touch事件代替 click事件。
  • 避免使用CSS3渐变阴影效果。
  • 可以用 transform:translateZ(0)来开启硬件加速。
  • 不滥用 Float, Float在渲染时计算量比较大,尽量少使用。
  • 不滥用Web字体,Web字体需要下载、解析、重绘当前页面,尽量少使用。
  • 合理使用requestAnimation Frame动画代替 setTimeout。
  • 合理使用CSS中的属性(CSS3 transitions、CSS3 3D transforms、 Opacity、 Canvas、 WebGL、Video)触发GPU渲染。过度使用会使手机耗电量増加。

5、如何对网站的文件进行优化?

可以进行文件合并、文件压缩使文件*小化;可以使用CDN托管文件,让用户更快速地访问;可以使用多个域名来缓存静态文件。

6、请说出几种缩短页面加载时间的方法。

具体方法如下。

(1)优化图片

(2)选择图像存储格式(比如,GIF提供的颜色较少,可用在一些对颜色要求不高的地方)

(3)优化CSS(压缩、合并CSS)

(4)在网址后加斜杠

(5)为图片标明高度和宽度(如果浏览器没有找到这两个参数,它需要一边下载图片一边计算大小。如果图片很多,浏览器需要不断地调整页面。这不但影响速度,而且影响浏览体验。当浏览器知道高度和宽度参数后,即使图片暂时无法显示,页面上也会腾出图片的空位,然后继续加载后面的内容,从而优化加载时间,提升浏览体验)。

7、哪些方法可以提升网站前端性能?

精灵图合并,减少HTTP请求;压缩HTML、CSS、JavaScript文件;使用CDN托管静态文件;使用 localstorage缓存和 mainfest应用缓存。

8、你知道哪些优化性能的方法?

具体方法如下。

(1)减少HTTP请求次数,控制CSS Sprite、JavaScript与CSS源码、图片的大小,使用网页Gzip、CDN托管、data缓存、图片服务器

(2)通过前端模板 JavaScript和数据,减少由于HTML标签导致的带宽浪费,在前端用变量保存Ajax请求结果,每次操作本地变量时,不用请求,减少请求次数。

(3)用 innerhTML代替DOM操作,减少DOM操作次数,优化 JavaScript性能。

(4)当需要设置的样式很多时,设置 className而不是直接操作 Style。

(5)少用全局变量,缓存DOM节点查找的结果,减少I/O读取操作

(6)避免使用CSS表达式,它又称动态属性,

(7)预加载图片,将样式表放在顶部,将脚本放在底部,加上时间戳。

(8)避免在页面的主体布局中使用表,表要在其中的内容完全下载之后才会显示出来,显示的速度比DIV+CSS布局慢。

9、列举你知道的Web性能优化方法。

具体优化方法如下。

(1)压缩源码和图片( JavaScript采用混淆压缩,CSS进行普通压缩,JPG图片根据具体质量压缩为50%~70%,把PNG图片从24色压缩成8色以去掉一些PNG格式信息等)。

(2)选择合适的图片格式(颜色数多用JPG格式,而很少使用PNG格式,如果能通过服务器端判断浏览器支持WebP就用WebP或SVG格式)。

(3)合并静态资源(减少HTTP请求)

(4)把多个CSS合并为一个CSS,把图片组合成雪碧图。

(5)开启服务器端的Gzip压缩(对文本资源非常有效)。

(6)使用CDN(对公开库共享缓存)。

(7)延长静态资源缓存时间。

(8)把CSS放在页面头部把 JavaScript代码放在页面底部(这样避免阻塞页面渲染而使页面出现长时间的空白)

10、平时你是如何对代码进行性能优化的?

利用性能分析工具监测性能,包括静态 Analyze工具和运行时的 Profile工具(在Xcode工具栏中依次单击 Product→ Profile项可以启动)。

比如测试程序的运行时间,当单击 Time Profiler项时,应用程序开始运行,这就能获取到运行整个应用程序所消耗时间的分布和百分比。为了保证数据分析在同一使用场景下的真实性,一定要使用真机,因为此时模拟器在Mac上运行,而Mac上的CPU往往比iOS设备要快。

11、针对CSS,如何优化性能?

具体优化方法如下。

(1)正确使用 display属性, display属性会影响页面的渲染,因此要注意以下几方面。

display:inline后不应该再使用 width、 height、 margin、 padding和float 。

display:inline- block后不应该再使用 float。

display:block后不应该再使用 vertical-align。

display:table-*后不应该再使用 margin或者float。

(2)不滥用 float。

(3)不声明过多的font-size。

(4)当值为0时不需要单位。

(5)标准化各种浏览器前缀,并注意以下几方面。

  • 浏览器无前缀应放在*后。
  • CSS动画只用( -webkit-无前缀)两种即可。
  • 其他前缀包括 -webkit-、-moz-、-ms-、无前缀( Opera浏览器改用 blink内核,所以-0-被淘汰)

(6)避免让选择符看起来像是正则表达式。高级选择器不容易读懂,执行时间也长。

(7)尽量使用id、 class选择器设置样式(避免使用 style属性设置行内样式)

(8)尽量使用CSS3动画。

(9)减少重绘和回流。

12、针对HTML,如何优化性能?

具体方法如下。

(1)对于资源加载,按需加载和异步加载

(2)首次加载的资源不超过1024KB,即越小越好。

(3)压缩HTML、CSS、 JavaScript文件。

(4)减少DOM节点。

(5)避免空src(空src在部分浏览器中会导致无效请求)。

(6)避免30*、40*、50*请求错误

(7)添加 Favicon.ico,如果没有设置图标ico,则默认的图标会导致发送一个404或者500请求。

13、针对 JavaScript,如何优化性能?

具体方法如下。

(1)缓存DOM的选择和计算。

(2)尽量使用事件委托模式,避免批量绑定事件。

(3)使用 touchstart、 touchend代替 click。

(4)合理使用 requestAnimationFrame动画代替 setTimeOut。

(5)适当使用 canvas动画。

(6)尽量避免在高频事件(如 TouchMove、 Scroll事件)中修改视图,这会导致多次渲染。

14、如何优化服务器端?

具体方法如下。

(1)启用Gzip压缩。

(2)延长资源缓存时间,合理设置资源的过期时间,对于一些长期不更新的静态资源过期时间设置得长一些。

(3)减少 cookie头信息的大小,头信息越大,资源传输速度越慢。

(4)图片或者CSS、 JavaScript文件均可使用CDN来加速。

15、如何优化服务器端的接口?

具体方法如下。

(1)接口合并:如果一个页面需要请求两部分以上的数据接口,则建议合并成一个以减少HTTP请求数。

(2)减少数据量:去掉接口返回的数据中不需要的数据。

(3)缓存数据:首次加载请求后,缓存数据;对于非首次请求,优先使用上次请求的数据,这样可以提升非首次请求的响应速度。

16、如何优化脚本的执行?

脚本处理不当会阻塞页面加载、渲染,因此在使用时需注意。

(1)把CSS写在页面头部,把 JavaScript程序写在页面尾部或异步操作中。

(2)避免图片和 iFrame等的空src,空src会重新加载当前页面,影响速度和效率。

(3)尽量避免重设图片大小。重设图片大小是指在页面、CSS、 JavaScript文件等中多次重置图片大小,多次重设图片大小会引发图片的多次重绘,影响性能

(4)图片尽量避免使用 DataURL。DataURL图片没有使用图片的压缩算法,文件会变大,并且要在解码后再渲染,加载慢,耗时长。

17、如何优化渲染?

具体方法如下。

通过HTML设置 Viewport元标签, Viewport可以加速页面的渲染,如以下代码所示。

<meta name="viewport" content="width=device=width,initial-scale=1">

(2)减少DOM节点数量,DOM节点太多会影响页面的渲染,应尽量减少DOM节点数量。

(3)尽量使用CSS3动画,合理使用 requestAnimationFrame动画代替 setTimeout,适当使用 canvas动画(5个元素以内使用CSS动画,5个元素以上使用 canvas动画(iOS 8中可使用 webGL))。

(4)对于高频事件优化 Touchmove, Scroll事件可导致多次渲染。

使用 requestAnimationFrame监听帧变化,以便在正确的时间进行渲染,增加响应变化的时间间隔,减少重绘次数。

使用节流模式(基于操作节流,或者基于时间节流),减少触发次数。

(5)提升GPU的速度,用CSS中的属性(CSS3 transitions、CSS3 3D transforms、 Opacity、 Canvas、 WebGL、Video)来触发GPU渲染.

18、如何设置DNS缓存?

在浏览器地址栏中输入URL以后,浏览器首先要查询域名( hostname)对应服务器的IP地址,一般需要耗费20~120ms的时间。

DNS查询完成之前,浏览器无法识别服务器IP,因此不下载任何数据。基于性能考虑,ISP运营商、局域网路由、操作系统、客户端(浏览器)均会有相应的DNS缓存机制。

(1)正IE缓存30min,可以通过注册表中 DnsCacheTimeout项设置。

(2) Firefox混存1 min,通过 network.dnsCacheExpiration配置。

(3)在 Chrome中通过依次单击“设置”→“选项”→“高级选项”,并勾选“用预提取DNS提高网页载入速度”选项来配置缓存时间。

19、什么时候会出现资源访问失败?

开发过程中,发现很多开发者没有设置图标,而服务器端根目录也没有存放默认的 Favicon.ico,从而导致请求404出现。通常在App的 webview里打开 Favicon.ico,不会加载这个 Favicon.ico,但是很多页面能够分享。

如果用户在浏览器中打开 Favicon. ico,就会调取失败,一般尽量保证该图标默认存在,文件尽可能小,并设置一个较长的缓存过期时间。另外,应及时清理缓存过期导致岀现请求失败的资源。

20、jQuery性能优化如何做?

优化方法如下。

(1)使用*新版本的 jQuery类库。

JQuery类库每一个新的版本都会对上一个版本进行Bug修复和一些优化,同时也会包含一些创新,所以建议使用*新版本的 jQuery类库提高性能。不过需要注意的是,在更换版本之后,不要忘记测试代码,毕竟有时候不是完全向后兼容的。

(2)使用合适的选择器。

jQuery提供非常丰富的选择器,选择器是开发人员*常使用的功能,但是使用不同选择器也会带来性能问题。建议使用简凖选择器,如i选择器、类选择器,不要将i选择器嵌套等。

(3)以数组方式使用 jQuery对象。

使用 jQuery选择器获取的结果是一个 jQuery对象。然而, jQuery类库会让你感觉正在使用一个定义了索引和长度的数组。在性能方面,建议使用简单的for或者 while循环来处理,而不是$. each(),这样能使代码更快。

(4)每一个 JavaScript事件(例如 click、 mouseover等)都会冒泡到父级节点。当需要给多个元素绑定相同的回调函数时,建议使用事件委托模式。

(5)使用join( )来拼接字符串。

使用 join( )拼接长字符串,而不要使用“+”拼接字符串,这有助于性能优化,特别是处理长字符串的时候。

(6)合理利用HTML5中的data属性。

HTML5中的data属性有助于插入数据,特别是前、后端的数据交换;jQuery的 data( )方法能够有效地利用HTML5的属性来自动获取数据。

21、哪些方法能提升移动端CSS3动画体验?

(1)尽可能多地利用硬件能力,如使用3D变形来开启GPU加速,例如以下代码。

  1. -webkit-transform: translate 3d(0, 0, 0);
  2. -moz-transform : translate3d(0,0, 0);
  3. -ms-transform : translate 3d(0,0,0);
  4. transform: translate3d(0,0,0);

一个元素通过 translate3d右移500X的动画流畅度会明显优于使用left属性实现的动画移动,原因是CSS动画属性会触发整个页面重排、重绘、重组。paint通常是*耗性能的,尽可能避免使用触发 paint的CSS动画属性。

如果动画执行过程中有闪烁(通常发生在动画开始的时候),可以通过如下方式处理。

  1. -webkit-backface-visibility:hidden;
  2. -moz-backface-visibility:hidden;
  3. -ms-backface-visibility:hidden ;
  4. backface-visibility:hidden;
  5. -webkit-perspective:1000;
  6. -moz-perspective:1000;
  7. -ms-perspective:1000;
  8. perspective:1000;

(2)尽可能少使用box- shadows和 gradients,它们往往严重影响页面的性能,尤其是在一个元素中同时都使用时。

(3)尽可能让动画元素脱离文档流,以减少重排,如以下代码所示。

  1. position:fixed
  2. position:absolute;

本文完〜

Android 打开本地pdf文件

Android 中打开pdf文件也是一种很常见的场景,但是上网找了好多资料,有用WebView加载的,但是要用*才能搞,*后发现一个库挺不错的,再次分享给大家
android-pdfview。下面主要说一下该库的使用方法。

1. 该库的下载地址
https://github.com/JoanZapata/android-pdfview

2. android-pdfview的简单介绍
PDFView是这个库中*核心的类,用于加载pdf文件,PDFView是的实现是继承于SurfaceView来实现的。主要用到了建造者模式来设置相关的属性。

fromFile(file) //设置pdf文件地址
fromAsset(assetFileName) //设置pdf文件地址
defaultPage(1) //设置默认显示第1页
onPageChange(this) //设置翻页监听
onLoad(this) //设置加载监听
onDraw(this) //绘图监听
showMinimap(false) //pdf放大的时候,是否在屏幕的右上角生成小地图
swipeVertical( false ) //pdf文档翻页是否是垂直翻页,默认是左右滑动翻页
enableSwipe(true) //是否允许翻页,默认是允许翻页
pages() //把2 , 3 , 4 , 5 过滤掉
load();
3. 在项目的build.gradle添加这个依赖
compile ‘com.joanzapata.pdfview:android-pdfview:1.0.4@aar’

4.写一个布局文件
<?xml version=”1.0″ encoding=”utf-8″?>
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:id=”@+id/activity_main”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
tools:context=”com.lidong.pdf.androidpdf.MainActivity”>

<com.joanzapata.pdfview.PDFView
android:id=”@+id/pdfView”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
/>
</RelativeLayout>

5.Activity的实现
package com.lidong.pdf.androidpdf;

import android.graphics.Canvas;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ViewTreeObserver;
import android.widget.Toast;

import com.joanzapata.pdfview.PDFView;
import com.joanzapata.pdfview.listener.OnDrawListener;
import com.joanzapata.pdfview.listener.OnLoadCompleteListener;
import com.joanzapata.pdfview.listener.OnPageChangeListener;

import java.io.File;

public class MainActivity extends AppCompatActivity implements OnPageChangeListener
,OnLoadCompleteListener, OnDrawListener {
private PDFView pdfView ;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

pdfView = (PDFView) findViewById( R.id.pdfView );

//从assets目录读取pdf
displayFromAssets(“0010000022464002F__李东.pdf”);

//从文件中读取pdf
// displayFromFile( new File( “fileName”));

}

private void displayFromAssets(String assetFileName ) {
pdfView.fromAsset(assetFileName) //设置pdf文件地址
.defaultPage(1) //设置默认显示第1页
.onPageChange(this) //设置翻页监听
.onLoad(this) //设置加载监听
.onDraw(this) //绘图监听
.showMinimap(false) //pdf放大的时候,是否在屏幕的右上角生成小地图
.swipeVertical( false ) //pdf文档翻页是否是垂直翻页,默认是左右滑动翻页
.enableSwipe(true) //是否允许翻页,默认是允许翻页
// .pages() //把 5 过滤掉
.load();
}

private void displayFromFile( File file ) {
pdfView.fromFile(file) //设置pdf文件地址
.defaultPage(6) //设置默认显示第1页
.onPageChange(this) //设置翻页监听
.onLoad(this) //设置加载监听
.onDraw(this) //绘图监听
.showMinimap(false) //pdf放大的时候,是否在屏幕的右上角生成小地图
.swipeVertical( false ) //pdf文档翻页是否是垂直翻页,默认是左右滑动翻页
.enableSwipe(true) //是否允许翻页,默认是允许翻
// .pages( 2 ,5 ) //把2 5 过滤掉
.load();
}

/**
* 翻页回调
* @param page
* @param pageCount
*/
@Override
public void onPageChanged(int page, int pageCount) {
Toast.makeText( MainActivity.this , “page= ” + page +
” pageCount= ” + pageCount , Toast.LENGTH_SHORT).show();
}

/**
* 加载完成回调
* @param nbPages 总共的页数
*/
@Override
public void loadComplete(int nbPages) {
Toast.makeText( MainActivity.this , “加载完成” + nbPages , Toast.LENGTH_SHORT).show();
}

@Override
public void onLayerDrawn(Canvas canvas, float pageWidth, float pageHeight, int displayedPage) {
// Toast.makeText( MainActivity.this , “pageWidth= ” + pageWidth + ”
// pageHeight= ” + pageHeight + ” displayedPage=” + displayedPage , Toast.LENGTH_SHORT).show();
}
}

效果实现:

%title插图%num

%title插图%num
今天主要是简单使用一下,后面准备将该库进行拓展,是打开网络的pdf文件的功能。

Android生成pdf文件之PdfDocument及踩过的坑

有时候项目中可能会遇到这样的需求,如何将android中界面显示的内容生成pdf,这里讲述的是使用android原生的PdfDocument,并没有使用框架,其一是使用起来非常的简单,但是也会也到一些坑,下面将一一道来。

首先,先来说下这个类的使用,使用非常的简单,直接参考官方文档或是在源码中都能查看到简单的实例,这里就先看下源码中介绍的简单使用:

* // create a new document
* PdfDocument document = new PdfDocument();
*
* // crate a page description
* PageInfo pageInfo = new PageInfo.Builder(new Rect(0, 0, 100, 100), 1).create();
*
* // start a page
* Page page = document.startPage(pageInfo);
*
* // draw something on the page
* View content = getContentView();
* content.draw(page.getCanvas());
*
* // finish the page
* document.finishPage(page);
* . . .
* // add more pages
* . . .
* // write the document content
* document.writeTo(getOutputStream());
*
* // close the document
* document.close();
这是android源码中的介绍(API 27),但是在构建PageInfo的时候却没有上面Builder()这样的构造方法,而是:

PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(pageWidth,pageHeight,pageNumber).create();
这里说下Builder()中这几个参数的作用:

pageWidth:pdf页面的宽度(文档介绍:The page width in PostScript );

pageHeight:pdf页面的高度(文档介绍:The page height in PostScript );

pageNumber:pdf页面的页数,在实际使用过程,发现这个参数并没起到什么作用;

说到这,再来看下我在实际应用中的使用:

private void pdfModel(){
PdfDocument document = new PdfDocument();
// ll_model是一个LinearLayout
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(ll_model.getWidth(),ll_model.getHeight(),1).create();
PdfDocument.Page page = document.startPage(pageInfo);
ll_model.draw(page.getCanvas());
document.finishPage(page);
File file = new File(getPdfFilePath(pdfName));
FileOutputStream outputStream = new FileOutputStream(file);
try {
document.writeTo(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
document.close();
}
这里就是将一个LinearLayout中的内容生成了pdf,如果LinearLayout中内容很长,可以使用ScrollView在包裹一下。这里生成的pdf只是一页,当文字内容在三百行以内时(根据自己生成的内容而定),生成的pdf显示是没什么问题的,但是内容在多一些时,你就会发现,pdf依旧可以生成,但是查看的时候,pdf中的内容却显示不出来了。

遇到这问题的时候,当时就在想是不是生成一页的pdf高度太高了导致的,所以这时就在想是不是可以分页,但当时我的一个TextView显示的内容可能就有上千行,所以还涉及对这一个view的内容生成的pdf进行分页,结合代码发现,将view中的内容生成pdf文件,实际是会将view中的内容先绘制在PageInfo中的一块画布上(canvas),所以就想着可不可以对这块画布做些处理,跟着这个思路走,就有了对TextView中内容进行分页的做法:

private void pdfInterviewContent(PdfDocument document){
// 一页pdf的高度
int onePageHeight = tv_content.getLineHeight()*30;
// TextView中总共有多少行
int lineCount = tv_content.getLineCount();
// 计算这个TextView需要分成多少页
int pdfCount = lineCount % 30 == 0 ? lineCount/30 : lineCount/30+1;
for (int i = 0; i < pdfCount; i++) {
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(tv_content.getWidth(),onePageHeight+120,1)
.setContentRect(new Rect(0,60,tv_content.getWidth(),onePageHeight+60))
.create();
PdfDocument.Page page = document.startPage(pageInfo);
Canvas canvas = page.getCanvas();
canvas.translate(0,-onePageHeight*i);
tv_content.draw(canvas);
document.finishPage(page);
}
File file = new File(getPdfFilePath(pdfName));
FileOutputStream outputStream = new FileOutputStream(file);
try {
document.writeTo(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
document.close();
}
这里在说下构建PageInfo中多的setContentRect()这个方法,这个方法去掉也是不影响生产pdf的,这个方法影响的是生成pdf的显示效果,比如这里的60就是说每一页生成的pdf距离这一页的顶部和底部各是60,如果这里把这个方法去电,那么生成的pdf内容将是顶着页面的顶部和底部的。在构建完PageInfo后,就可以拿到画布(canvas)了,为了生成对应位置的内容,这里就需要对画布进行一个平移操作了,这个平移操作就看你是怎么去划分了,这里是将一个页面的高度作为基本的平移单位。

至此,生成pdf以及分页就全都ok了,不过这里还有一个问题没怎么弄明白,就是生成一页文字的pdf的大小差不多是7M多,但我生成30页文字的pdf也就多了1M左右,目前还不明白这其中原因。

对于PdfDocument的学习,建议多看看源码及注释,代码量不大,加注释也就四百来行。

 

Android使用iText生成pdf文件并读取pdf内容

一、何为iText
iText是著名的开放源码的站点sourceforge的一个项目,可用来生成Pdf文件和读取Pdf文件内容.

我将iTextpdf的Jar包放在http://download.csdn.net/detail/xuwenneng/9669969 ,点击可前往下载.
二、使用iText生成Pdf文件
1.将jar包放到自己的项目中,然后进行项目的编辑

2.生成Pdf文件的代码:

Document doc = new Document();//创建一个document对象
FileOutputStream fos;
try {
fos = new FileOutputStream(new File(pdf_address)); //pdf_address为Pdf文件保存到sd卡的路径
PdfWriter.getInstance(doc, fos);
doc.open();
doc.setPageCount(1);
doc.add(new Paragraph(result, setChineseFont())); //result为保存的字符串 ,setChineseFont()为pdf字体
// 一定要记得关闭document对象
doc.close();
fos.flush();
fos.close();
handler.sendEmptyMessage(PDF_SAVE_RESULT);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

/**
* 设置PDF字体(较为耗时)
*/
public Font setChineseFont() {
BaseFont bf = null;
Font fontChinese = null;
try {
// STSong-Light : Adobe的字体
// UniGB-UCS2-H : pdf 字体
bf = BaseFont.createFont(“STSong-Light”, “UniGB-UCS2-H”,
BaseFont.NOT_EMBEDDED);
fontChinese = new Font(bf, 12, Font.NORMAL);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return fontChinese;
}

三、读取Pdf文件内容
/**
* 读取Pdf文件的内容
* @param path :文件地址
*/
public void readPdfContent(String path){
try {
PdfReader pr = new PdfReader(path);
int page = pr.getNumberOfPages();
String content = “”;
for(int i = 1 ;i<page+1;i++){
content += PdfTextExtractor.getTextFromPage(pr, i); //遍历页码,读取Pdf文件内容
}
} catch (IOException e) {
e.printStackTrace();
}
}

 

在Android中利用iText生成PDF

iText 是java和C#中的一个处理PDF的开源类库,国外的大牛已经把它移植到Android上了,但是直接拿来用还是需要花费一点功夫,下面就用一个简单的demo来测试一下。

iText项目地址:https://code.google.com/p/droidtext/

首先用过svn把代码check下来。

在Android中利用iText生成PDF

 

得到三个文件夹,droidText是一个android的库工程,droidTextTest是测试工程。

 

在eclipse中导入droidText项目。这是个library project,后面创建的项目需要引用到。

 

然后创建一个Android工程-iTextTest

在工程中引用droidText:

Project->properties->Android->LIbrary:ADD

在Android中利用iText生成PDF

 

链接好之后就像上图。

主界面就一个Button,按下之后就开始生产PDF。

  1. package com.example.itexttest;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.File;
  4. import java.io.PrintStream;
  5. import java.lang.reflect.Method;
  6. import android.os.Bundle;
  7. import android.os.Environment;
  8. import android.app.Activity;
  9. import android.view.Menu;
  10. import android.view.View;
  11. import android.widget.Button;
  12. import android.widget.Toast;
  13. public class ITextActivity extends Activity {
  14. private Button mButton;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_itext);
  19. mButton = (Button)findViewById(R.id.button1);
  20. mButton.setOnClickListener(new OnClickListenerImpl());
  21. }
  22. private class OnClickListenerImpl implements View.OnClickListener
  23. {
  24. @Override
  25. public void onClick(View arg0) {
  26. // TODO Auto-generated method stub
  27. //Toast.makeText(getApplicationContext(), “Run”, Toast.LENGTH_SHORT).show();
  28. // Create droidtext directory for storing results
  29. File file = new File(
  30. android.os.Environment.getExternalStorageDirectory()
  31. + File.separator + “iTextTest”);
  32. if (!file.exists()) {
  33. file.mkdir();
  34. }
  35. System.out.println(“Click!”);
  36. Thread t = new Thread() {
  37. public void run() {
  38. int success = 0;
  39. int count = 1;
  40. String className = “com.example.itexttest.HelloWprld”;
  41. String result = null;
  42. try {
  43. // Set output streams to bytearray streams so we can
  44. // display the output of examples
  45. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  46. PrintStream errorStream = new PrintStream(bos, true);
  47. System.setErr(errorStream);
  48. ByteArrayOutputStream bos2 = new ByteArrayOutputStream();
  49. PrintStream outStream = new PrintStream(bos2, true);
  50. System.setOut(outStream);
  51. // Find the main method
  52. Class<!–?–> c = Class.forName(className);
  53. Method main = c.getDeclaredMethod(“main”,String[].class);
  54. System.out.println(“GetMain”+main.getName());
  55. // Emulate CLI parameters if necessary
  56. String[] params = null;
  57. if (className
  58. .equals(“com.lowagie.examples.objects.tables.pdfptable.FragmentTable”)) {
  59. params = new String[] { “3” };
  60. } else if (className
  61. .equals(“com.lowagie.examples.objects.images.tiff.OddEven”)) {
  62. params = new String[] { “odd.tif”, “even.tif”,
  63. “odd_even.tiff” };
  64. } else if (className
  65. .equals(“com.lowagie.examples.objects.images.tiff.Tiff2Pdf”)) {
  66. params = new String[] { “tif_12.tif” };
  67. } else if (className
  68. .equals(“com.lowagie.examples.objects.images.DvdCover”)) {
  69. params = new String[] { “dvdcover.pdf”, “Title”,
  70. “0xff0000”, “hitchcock.png” };
  71. } else if (className
  72. .equals(“com.lowagie.examples.forms.ListFields”)) {
  73. params = new String[] {};
  74. } else if (className
  75. .equals(“com.lowagie.examples.general.read.Info”)) {
  76. params = new String[] { “RomeoJuliet.pdf” };
  77. } else if (className
  78. .equals(“com.lowagie.examples.objects.anchors.OpenApplication”)) {
  79. params = new String[] { “” };
  80. }
  81. main.invoke(null, (Object) params);
  82. // Parse results
  83. String string = new String(bos.toByteArray());
  84. String string2 = new String(bos2.toByteArray());
  85. if (string.length() > 0) {
  86. result = “Failed: “ + string;
  87. } else if (string2.contains(“Exception”)) {
  88. result = “Failed: “ + string2;
  89. } else if (“Images.pdf” != null) {
  90. File pdf = new File(
  91. Environment.getExternalStorageDirectory()
  92. + File.separator + “iTextTest”
  93. + File.separator
  94. + “Images.pdf”);
  95. System.out.println(“Create Pdf@”);
  96. if (!pdf.exists()) {
  97. result = “Failed: Resulting pdf didn’t get created”;
  98. } else if (pdf.length() <= 0) {
  99. result = “Failed: Resulting pdf is empty”;
  100. } else {
  101. success++;
  102. result = “Successful”;
  103. }
  104. } else {
  105. success++;
  106. result = “Successful”;
  107. }
  108. } catch (Exception e) {
  109. result = “Failed with exception: “
  110. + e.getClass().getName() + “: “
  111. + e.getMessage();
  112. System.out.println(result);
  113. }
  114. if (result.startsWith(“Failed”)) {
  115. System.out.println(“Failed!”);
  116. } else {
  117. System.out.println(“Success!”);
  118. }
  119. System.out.println(result);
  120. }
  121. };
  122. t.start();
  123. }
  124. }
  125. }

OnClick里面的代码有点小复杂,要用的的话直接粘就可以了,注意修改相应的变量名,classname对应对就是操作itext生产pdf的类。

 

在包里面再创建两个测试类:

HelloWorld.java

  1. package com.example.itexttest;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import com.lowagie.text.Document;
  5. import com.lowagie.text.DocumentException;
  6. import com.lowagie.text.Paragraph;
  7. import com.lowagie.text.pdf.PdfWriter;
  8. /**
  9. * Generates a simple ‘Hello World’ PDF file.
  10. *
  11. * @author blowagie
  12. */
  13. public class HelloWorld {
  14. /**
  15. * Generates a PDF file with the text ‘Hello World’
  16. *
  17. * @param args
  18. * no arguments needed here
  19. */
  20. public static void main(String[] args) {
  21. System.out.println(“Hello World”);
  22. // step 1: creation of a document-object
  23. Document document = new Document();
  24. try {
  25. // step 2:
  26. // we create a writer that listens to the document
  27. // and directs a PDF-stream to a file
  28. PdfWriter.getInstance(document, new FileOutputStream(android.os.Environment.getExternalStorageDirectory() + java.io.File.separator + “iTextTest” + java.io.File.separator + “HelloWorld.pdf”));
  29. // step 3: we open the document
  30. document.open();
  31. // step 4: we add a paragraph to the document
  32. document.add(new Paragraph(“Hello World”));
  33. } catch (DocumentException de) {
  34. System.err.println(de.getMessage());
  35. } catch (IOException ioe) {
  36. System.err.println(ioe.getMessage());
  37. }
  38. // step 5: we close the document
  39. document.close();
  40. }
  41. }

生产Pdf如下:在Android中利用iText生成PDF

Rotating.java(创建图片,并旋转)

注意再sdcard的根目录里面放一张图片,改名jxk_run.png。

  1. /*
  2. * $Id: Rotating.java 3373 2008-05-12 16:21:24Z xlv $
  3. *
  4. * This code is part of the ‘iText Tutorial’.
  5. * You can find the complete tutorial at the following address:
  6. * http://itextdocs.lowagie.com/tutorial/
  7. *
  8. * This code is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. *
  12. * itext-questions@lists.sourceforge.net
  13. */
  14. package com.example.itexttest;
  15. import java.io.ByteArrayOutputStream;
  16. import java.io.FileOutputStream;
  17. import java.io.IOException;
  18. import com.example.itexttest.R;
  19. import com.example.itexttest.ITextActivity;
  20. import android.graphics.Bitmap;
  21. import android.graphics.BitmapFactory;
  22. import com.lowagie.text.Document;
  23. import com.lowagie.text.DocumentException;
  24. import com.lowagie.text.Image;
  25. import com.lowagie.text.Paragraph;
  26. import com.lowagie.text.pdf.PdfWriter;
  27. /**
  28. * Rotating images.
  29. */
  30. public class Rotating {
  31. /**
  32. * Rotating images.
  33. *
  34. * @param args
  35. * No arguments needed
  36. */
  37. public static void main(String[] args) {
  38. System.out.println(“Rotating an Image”);
  39. // step 1: creation of a document-object
  40. Document document = new Document();
  41. try {
  42. // step 2:
  43. // we create a writer that listens to the document
  44. // and directs a PDF-stream to a file
  45. PdfWriter.getInstance(document, new FileOutputStream(android.os.Environment.getExternalStorageDirectory() + java.io.File.separator + “iTextTest” + java.io.File.separator + “rotating.pdf”));
  46. // step 3: we open the document
  47. document.open();
  48. // step 4: we add content
  49. //Can’t use filename => use byte[] instead
  50. // Image jpg4 = Image.getInstance(“otsoe.jpg”);
  51. ByteArrayOutputStream stream = new ByteArrayOutputStream();
  52. //Bitmap bitmap = BitmapFactory.decodeResource(ITextActivity.getActivity().getResources(), R.drawable.otsoe);
  53. Bitmap bitmap = BitmapFactory.decodeFile(“/mnt/sdcard/jxk_run.png”);
  54. bitmap.compress(Bitmap.CompressFormat.JPEG /* FileType */,100 /* Ratio */, stream);
  55. Image jpg = Image.getInstance(stream.toByteArray());
  56. jpg.setAlignment(Image.MIDDLE);
  57. jpg.setRotation((float) Math.PI / 6);
  58. document.add(new Paragraph(“rotate 30 degrees”));
  59. document.add(jpg);
  60. document.newPage();
  61. jpg.setRotation((float) Math.PI / 4);
  62. document.add(new Paragraph(“rotate 45 degrees”));
  63. document.add(jpg);
  64. document.newPage();
  65. jpg.setRotation((float) Math.PI / 2);
  66. document.add(new Paragraph(“rotate pi/2 radians”));
  67. document.add(jpg);
  68. document.newPage();
  69. jpg.setRotation((float) (Math.PI * 0.75));
  70. document.add(new Paragraph(“rotate 135 degrees”));
  71. document.add(jpg);
  72. document.newPage();
  73. jpg.setRotation((float) Math.PI);
  74. document.add(new Paragraph(“rotate pi radians”));
  75. document.add(jpg);
  76. document.newPage();
  77. jpg.setRotation((float) (2.0 * Math.PI));
  78. document.add(new Paragraph(“rotate 2 x pi radians”));
  79. document.add(jpg);
  80. } catch (DocumentException de) {
  81. System.err.println(de.getMessage());
  82. } catch (IOException ioe) {
  83. System.err.println(ioe.getMessage());
  84. }
  85. // step 5: we close the document
  86. document.close();
  87. }
  88. }

生产PDF如下:在Android中利用iText生成PDF

Android PDF开发:android-pdfview

Android PDF开发:android-pdfview

Android平台自身没有直接可以阅读和处理pdf的方案,在github上面有一个第三方开源的pdf开发SDK,其主页地址是:

https://github.com/JoanZapata/android-pdfview

android-pdfview使用比较简单,关键的地方是PDFView,将PDFView作为像Android的ImageView或者TextView一样写进xml布局文件:
<FrameLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:layout_width=”match_parent”
android:layout_height=”match_parent” >

<com.joanzapata.pdfview.PDFView
android:id=”@+id/pdfView”
android:layout_width=”match_parent”
android:layout_height=”match_parent” />
</FrameLayout>

然后在Java上层代码直接加载pdf文件资源装载进去即可:
package zhangphil.pdfview;

import com.joanzapata.pdfview.PDFView;
import com.joanzapata.pdfview.listener.OnPageChangeListener;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

PDFView pdfView = (PDFView) findViewById(R.id.pdfView);

// 在我这个测试例子中,事先准备一个叫做sample.pdf的pdf大文件放到assets目录下。
// 从assets文件目录下读取名为 sample.pdf的文件,缺省把该pdf定位到*页。
pdfView.fromAsset(“sample.pdf”).defaultPage(1).onPageChange(new OnPageChangeListener() {

@Override
public void onPageChanged(int page, int pageCount) {
// 当用户在翻页时候将回调。
Toast.makeText(getApplicationContext(), page + ” / ” + pageCount, Toast.LENGTH_SHORT).show();
}
}).load();
}
}

我把该第三方开源库整理成Eclipse下可用的lib,上传到github上,地址链接:
https://github.com/zhangphil/android-pdfview-lib-for-eclipse
使用时候,下载该lib,导入到eclipse作为lib,然后在项目中直接引用即可。

常见JavaScript基础面试题上(附答案)

JavaScript一直都是前端面试的重头戏,也是*核心的部分。JavaScript也是囊括知识点*多的部分,从BOM到DOM,从 ECMAScript编程到简单算法的实现等,都是 JavaScript部分面试题主要考察的内容。
当然,这里的重中之重当属事件和DOM操作,这也是 JavaScript的核心部分。在 ECMAScript中,小到运算符,大到函数的闭包、作用域,以及原型链等都是应试者必须掌握的技术知识。
今天我们为大家准备了一些常见的JavaScript基础面试题,一共有200多道题,因为内容比较多,我们拆分为上下两篇,今天这篇里一共有100道面试题。

1、JavaScript有哪些垃圾回收机制?

有以下垃圾回收机制。

标记清除( mark and sweep)

这是 JavaScript*常见的垃圾回收方式。当变量进入执行环境的时候,比如在函数中声明一个变量,垃圾回收器将其标记为“进入环境”。当变量离开环境的时候(函数执行结束),将其标记为“离开环境”。

垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量,以及被环境中变量所引用的变量(闭包)的标记。在完成这些之后仍然存在的标记就是要删除的变量。

引用计数( reference counting)

在低版本的E中经常会发生内存泄漏,很多时候就是因为它采用引用计数的方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数。

当声明了一个变量并将个引用类型赋值给该变量的时候,这个值的引用次数就加1.如果该变量的值变成了另外一个,则这个值的引用次数减1.当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问。

因此,可以将它占用的空间回收,这样垃圾回收器会在运行的时候清理引用次数为0的值占用的空间在正中虽然 JavaScript对象通过标记清除的方式进行垃圾回收,但是BOM与DOM对象是用引用计数的方式回收垃圾的。

也就是说,只要涉及BOM和DOM,就会出现循环引用问题

2、列举几种类型的DOM节点

有以下几类DOM节点。

整个文档是一个文档( Document)节点。

每个HTML标签是一个元素( Element)节点。

每一个HTML属性是一个属性( Attribute)节点。

包含在HTML元素中的文本是文本(Text)节点。

3、谈谈 script标签中 defer和 async属性的区别。

区别如下。

(1) defer属性规定是否延迟执行脚本,直到页面加载为止, async属性规定脚本一旦可用,就异步执行。

(2) defer并行加载 JavaScript文件,会按照页面上 script标签的顺序执行, async并行加载 JavaScript文件,下载完成立即执行,不会按照页面上 script标签的顺序执行。

4、说说你对闭包的理解。

使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染;缺点是闭包会常驻内存,增加内存使用量,使用不当很容易造成内存泄漏。在JavaScript中,函数即闭包,只有函数才会产生作用域闭包有3个特性

(1)函数嵌套函数。

(2)在函数内部可以引用外部的参数和变量

(3)参数和变量不会以垃圾回收机制回收

5、解释一下 unshift0方法。

该方法在数组启动时起作用,与 push()不同。它将参数成员添加到数组的顶部下面给出一段示例代。

var name=["john"] name. unshift("charlie");name.unshift("joseph""Jane"); console. log(name);

输出如下所示。

[" joseph ", Jane "," charlie "," john "]

6、encodeR0和 decodeR0的作用是什么?

encodeURI()用于将URL转换为十六进制编码。而 decodeURI()用于将编码的URL转换回正常URL。

7、为什么不建议在 JavaScript中使用 innerHTML?

通过 innerHTML修改内容,每次都会刷新,因此很慢。在 innerHTML中没有验证的机会,因此更容易在文档中插入错误代码,使网页不稳定。

8、如何在不支持 JavaScript的旧浏览器中隐藏 JavaScript代码?

在< script>标签之后的代码中添加“<!–”,不带引号。

在< /script>标签之前添加“//–>”,代码中没有引号。

旧浏览器现在将 JavaScript代码视为一个长的HTML注释,而支持 JavaScript的浏览器则将”<!-“和”//–>”作为一行注释。

9、在DOM操作中怎样创建、添加、移除、替换、插入和查找节点?

具体方法如下。

(1)通过以下代码创建新节点。

createDocument Fragment ()//创建一个D0M片段createElement ()//创建一个具体的元素createTextNode ()//创建一个文本节点

(2)通过以下代码添加、移除、替换、插入节点

appendchild()removechild()eplacechild ()insertBefore ()//并没有 insertAfter()(3)通过以下代码查找节点。getElementsByTagName ()//通过标签名称查找节点getElementsByName ()//通过元素的name属性的值查找节点(IE容错能力较强,会得到一个数//组,其中包括id等于name值的节点)getElementById(//通过元素Id查找节点,具有唯一性

10、如何实现浏览器内多个标签页之间的通信?

调用 localstorge、 cookie等数据存储通信方式

11、null和 undefined的区别是什么?

null是一个表示“无”的对象,转为数值时为0;undefined是一个表示“无”的原始值,转为数值时为NaN。

当声明的变量还未初始化时,变量的默认值为 undefined 。

null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。

undefined表示“缺少值”,即此处应该有一个值,但是还没有定义,典型用法是如下。

(1)如果变量声明了,但没有赋值,它就等于 undefined

(2)当调用函数时,如果没有提供应该提供的参数,该参数就等于 undefined。

(3)如果对象没有赋值,该属性的值为 undefined。

(4)当函数没有返回值时,默认返回 undefined。

null表示“没有对象”,即此处不应该有值,典型用法是如下。

(1)作为函数的参数,表示该函数的参数不是对象。

(2)作为对象原型链的终点。

12、new操作符的作用是什么?

作用如下:

(1)创建一个空对象。

(2)由this变量引用该对象

(3)该对象继承该函数的原型(更改原型链的指向)

(4)把属性和方法加入到this引用的对象中。

(5)新创建的对象由this引用,*后隐式地返回this,过程如下:

var obj ={};obj._ _ proto_ _ Base .prototype; Base .call(obj);

13、JavaScript延迟加载的方式有哪些?

包括 defer和 async、动态创建DOM(创建 script,插入DOM中,加载完毕后回调、按需异步载入 JavaScript。

14、call()和apply()的区别和作用是什么?

作用都是在函数执行的时候,动态改变函数的运行环境(执行上下文)。

call和 apply的*个参数都是改变运行环境的对象。

区别如下。

call从第二个参数开始,每一个参数会依次传递给调用函数;apply的第二个参数是数组,数组的每一个成员会依次传递给调用函数。

func, call(funcl, varl, var2, var3)

对应的 apply写法为:

func. apply (funcl, [varl, var2, var3])

15、哪些操作会造成内存泄漏?

内存泄漏指不再拥有或需要任何对象(数据)之后,它们仍然存在于内存中。

提示:垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为0(没有其他对象引用过该对象),或对该对象的唯一引用是循环的,那么该对象占用的内存立即被回收。

如果 setTimeout的*个参数使用字符串而非函数,会引发内存泄漏闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)等会造内存泄漏。

16、列举E与 firefox的不同之处。

不同之处如下

(1)IE支持 currentStyle;Firefox使用 get ComputStyle。

(2)IE使用 inner Text;Firefox使用 textContent。

(3)在透明度滤镜方面,正使用 filter:alpha( opacity=num);Firefox使用-moz- opacity :num

(4)在事件方面,IE使用 attachEvent:Firefox使用 add Event Listener

(5)对于鼠标位置:IE使用 event. clientX;Firefox使用 event. pageX。

(6)IE使用 event. srcElement;Firefox使用 event. target

(7)要消除list的原点,IE中仅须使 margin:0即可达到*终效果;Firefox中需要设置margin:0、 padding:0和 list-style:none

(8)CSS圆角:IE7以下不支持圆角。

17、讲解一下 JavaScript对象的几种创建方式。

有以下创建方式:

(1) Object构造函数式。

(2)对象字面量式。

(3)工厂模式。

(4)安全工厂模式。

(5)构造函数模式。

(6)原型模式。

(7)混合构造函数和原型模式。

(8)动态原型模式。

(9)寄生构造函数模式。

(10)稳妥构造函数模式。

18、如何实现异步编程?

具体方法如下:

方法1,通过回调函数。优点是简单、容易理解和部署;缺点是不利于代码的阅读和维护,各个部分之间高度耦合( Coupling),流程混乱,而且每个任务只能指定一个回调函数。

方法2,通过事件监听,可以绑定多个事件,每个事件可以指定多个回调函数,而且可以“去耦合”( Decoupling),有利于实现模块化;缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。

方法3,采用发布/订阅方式。性质与“事件监听”类似,但是明显优于后者。

方法4,通过 Promise对象实现, Promise对象是 Commonjs工作组提出的一种规范,旨在为异步编程提供统一接口。它的思想是,每一个异步任务返回一个 Promise对象,该对象有一个then方法,允许指定回调函数。

19、请解释一下 JavaScript的同源策略。

同源策略是客户端脚本(尤其是 JavaScript)的重要安全度量标准。它*早出自Netscape Navigator2.0,目的是防止某个文档或脚本从多个不同源装载。

这里的同源策略指的是协议、域名、端口相同。同源策略是一种安全协议。指一段脚本只能读取来自同一来源的窗口和文档的属性。

20、为什么要有同源限制?

我们举例说明。比如一个黑客,他利用 Iframe把真正的银行登录页面嵌到他的页面上,当你使用真实的用户名、密码登录时,他的页面就可以通过 Javascript读取到你表单上 Input中的内容,这样黑客就会轻松得到你的用户名和密码。

21、在 JavaScript中,为什么说函数是*类对象?

*类函数即 JavaScript中的函数。这通常意味着这些函数可以作为参数传递给其他函数,作为其他函数的值返回,分配给变量,也可以存储在数据结构中。

22、什么是事件?E与 Firefox的事件机制有什么区别?如何阻止冒泡?

事件是在网页中的某个操作(有的操作对应多个事件)例如,当单击一个按钮时,就会产生一个事件,它可以被 JavaScript侦测到,在事件处理机制上,正E支持事件冒泡;Firefox同时支持两种事件模型,也就是捕获型事件和冒泡型事件。

阻止方法是 ev.stop Propagation.注意旧版E中的方法 ev. cancelBubble=true.

23、函数声明与函数表达式的区别?

在 JavaScript中,在向执行环境中加载数据时,解析器对函数声明和函数表达式并非是一视同仁的。解析器会首先读取函数声明,并使它在执行任何代码之前可用(可以访问)。至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正解析和执行它。

24、如何删除一个 cookie?

为了删除 cookie,要修改 expires,代码如下。

document. cookie =’user=icketang;expires =’+ new Date(0)

25、编写一个方法,求一个字符串的长度(单位是字节)

假设一个英文字符占用一字节,一个中文字符占用两字节:

function GetBytes(str){ var len=str .length; var bytes= len forvar i-0:i<len1++){if (str. charcodeAt (i)>255) bytes++;}return bytes;}alert( GetBytes("hello 有课前端网!"));

26、对于元素, attribute和 property的区别是什么?

attribute是DOM元素在文档中作为HTML标签拥有的属性;property就是DOM元素在 JavaScript中作为对象拥有的属性。

对于HTML的标准属性来说, attribute和 property是同步的,会自动更新,但是对于自定义的属性来说,它们是不同步的。

27、解释延迟脚本在 JavaScript中的作用。

默认情况下,在页面加载期间,HTML代码的解析将暂停,直到脚本停止执行。

这意味着,如果服务器速度较慢或者脚本特别“沉重”,则会导致网页延迟。在使用Deferred时,脚本会延迟执行,直到HTML解析器运行。这缩短了网页的加载时间,并且它们的显示速度更快。

28、什么是闭包( closure)?

为了说明闭包,创建一个闭包。

function hello(){//函数执行完毕,变量仍然存在var num= 100;var showResult= function(){ alert (num);} num++;return showResult ;}var showResult= he1lo();showResult()//执行结果:弹出101

执行 hello()后, hello()闭包内部的变量会存在,而闭包内部函数的内部变量不会存在,使得 JavaScript的垃圾回收机制不会收回hello()占用的资源,因为hell()中内部函数的执行需要依赖 hello()中的变量。

29、如何判断一个对象是否属于某个类?

使用 instanceof关键字,判断一个对象是否是类的实例化对象;使用 constructor属性,判断一个对象是否是类的构造函数。

30、JavaScript中如何使用事件处理程序?

事件是由用户与页面的交互(例如单击链接或填写表单)导致的操作。需要个事件处理程序来保证所有事件的正确执行。事件处理程序是对象的额外属性。此属性包括事件的名称和事件发生时采取的操作。

31、在 JavaScript中有一个函数,执行直接对象查找时,它始终不会查找原型,这个函数是什么?

hasOwnProperty。

32、在 JavaScript中如何使用DOM?

DOM代表文档对象模型,并且负责文档中各种对象的相互交互。DOM是开发网页所必需的,其中包括诸如段落、链接等对象。可以操作这些对象,如添加或删除等。为此,DOM还需要向网页添加额外的功能。

33、documen.wrte和 innerHTML的区别是什么?

document.wite重绘整个页面;innerHTML可以重绘页面的一部分。

34、在 JavaScript中读取文件的方法是什么?

可以通过如下方式读取服务器中的文件内容。

function readAjaxEile(url) {//创建xhr var xhr =new XMLHttpRequest();/监听状态xhr. onreadystatechange=function(){//监听状态值是4if(xhr. readystate == 4 && xhr. status = = =200){console. log(xhr. responseText)}//打开请求xhr.open('GET', url, true)//发送数据xhr, send(null)}

可以通过如下方式读取本地计算机中的内容。

function readInputFile(id) { var file= document. getElementById(id). files[0];//实例化 FileReader var reader=new FileReader();//读取文件reader. readAsText (file)//监听返回reader, onload= function (data) { console. log (data, this .result)}}

35、如何分配对象属性?

将属性分配给对象的方式与赋值给变量的方式相同。例如,表单对象的操作值以下列方式分配给” submit”:document.form. action=” submit'”

36、请说几条书写 JavaScript语句的基本规范。

基本规范如下:

(1)不要在同一行声明多个变量。

(2)应使用==/!==来比较true/ false或者数值。

(3)使用对象字面量替代 new Array这种形式。

(4)不要使用全局函数。

(5) switch语句必须带有 default分支。

(6)函数不应该有时有返回值,有时没有返回值。

(7)for循环必须使用大括号括起来。

(8)if语句必须使用大括号括起来。

9)for-in循环中的变量应该使用war关键字明确限定的作用域,从而避免作用域污染。

37、eva的功能是什么?

它的功能是把对应的字符串解析成 Javascript代码并运行应该避免使用eval,它会造成程序不安全,非常影响性能(执行两次,一次解析成JavaScript语句,一次执行)

38、[“1,”2,”3”].map( parselnt)的执行结果是多少?

[1,NaN,NaN],因为 parseInt需要两个参数(val, radix),其中 radix表示解析时用的基数(进制);map传递了3个参数(item, index,aray),对应的radix不合法导致解析失败。

39、谈谈你对this对象的理解。

this是 JavaScript的一个关键字,随着函数使用场合的不同,this的值会发生变化。但是有一个总原则,即this指的是调用函数的那个对象一般情况下,this是全局对象 Global,可以作为方法调用

40、Web- garden和web-farm有什么不同?

web-garden和 web-farm都是网络托管系统。唯一的区别是 web-garden是在单个服务器中包含许多处理器的设置,而web-farm是使用多个服务器的较大设置。

41、说一下 document. write0的用法。

document. write()方法可以用在两个地方,页面载入过程中用实时脚本创建页面内容,以及用延时脚本创建本窗口或新窗口的内容document. write只能重绘整个页面, innerHTML可以重绘页面的一部分。

42、在 JavaScript中什么是类(伪)数组?如何将类(伪)数组转化为标准数组?

典型的类(伪)数组是函数的 argument参数,在调用 getElements By TagName和 document .childNodes方法时,它们返回的 NodeList对象都属于伪数组。可以使用Array .prototype. slice. call( fake Array)将数组转化为真正的Aray对象。

43、JavaScript中callee和 caller的作用是什么?

caller返回一个关于函数的引用,该函数调用了当前函数;callee返回正在执行的函数,也就是指定的 function对象的正文。

44、讲一下手写数组快速排序的步骤。

“快速排序”的思想很简单,整个排序过程只需要3步

(1)在数据集之中,选择一个元素作为“基准”( pivot)。

(2)将所有小于“基准”的元素,都移到“基准”的左边;将所有大于“基准”的元素,都移到“基准”的右边。

(3)对“基准”左边和右边的两个子集,不断重复第(1)步和第(2)步,直到所有子集只剩下一个元素为止。

45、如何统计字符串“ aaaabbbccccddfgh”中字母的个数或统计*多的字母数?

具体代码如下

var str =aaaabbbecccddfgh"; function dealstr(str){ var obj={};for (var i= 0;i< str length:i++){var v=str.charAt (i);if (obj[v] && obj [v].value === v){++obj[v]. count } else { obj[v] ={count:1, va⊥ue:v}}} return obj ;}var obj= dealstr(str);for (key in obj){ console. log (obj[key] .value +'=' obj[ key].count)}

46、写一个 function,清除字符串前后的空格(兼容所有浏览器)。

具体代码如下

function trim(str){if (str && typeof str === "string"){ return str.replace(/^\s+1\s+$/g,"");//去除前后空白符。

47、列出不同浏览器中关于 JavaScript兼容性的两个常见问题。

(1)事件绑定兼容性问题。

IE8以下的浏览器不支持用 add Event Listener来绑定事件,使用 attachement可以解决这个问题

(2) stopPropagation兼容性问题

IE8以下的浏览器不支持用 e .stopPropagation()来阻止事件传播,使用 e .return Value =false可以解决这个问题。

48、闭包的优缺点是什么?

优点是不产生全局变量,实现属性私有化缺点是闭包中的数据会常驻内存,在不用的时候需要删除,否则会导致内存溢出(内存泄漏)。

49、用 JavaScript实现一个数组合并的方法(要求去重)。

代码如下。

var arrl =['a']; var arr2 =['b', 'c'];var arr3=['c', ['d'], 'e', undefined, null];var concat =( function() {//去重合并arr1和arr2var _concat =function (arrl, arr2)for (var i =0, len= arr2.length;i< len;i++){~ arrl. indexOf (arr2[i])|| arrl. push(arr2[i])}}//返回数组去重合并方法return function(){ var result =[];for (var i=0, len= arguments .length;i< len:i++){ _concat (result, arguments [i])return result}})()

执行concat(arrl,ar2,ar3)后,会返回[‘a’,null, undefined,’e’,[‘d],’c’,’b’]。

50、说明正则表达式给所有string对象添加去除首尾空白符的方法(trim方法)。

代码如下。

prototype. trim= function(){return this .replace(/^\s+I\s+$/g," );};

51、说明用 JavaScript实现一个提取电话号码的方法。

代码如下

var str="12345678901 021-12345678 有课前端网 0418-1234567  13112345678"; var reg=/(1\d{0})|(0\d{2,3}\-\d{7,8})/g;alert(str.match(reg);

测试“12345678901 021-12345678有课前端网0418-1234567 13112345678”,得到的结果应该是:[12345678901,021-12345678,0418-1234567,13112345678]

52、JavaScript中常用的逻辑运算符有哪些?

“and”(&&)运算符、“or”(‖)运算符和”not”(!)运算符,它们可以在 JavaScript中使用。

53、什么是事件代理(事件委托)?

事件代理( Event Delegation),又称为事件委托,是 JavaScript中绑定事件的常用技巧。顾名思义,“事件代理”就是把原本需要绑定的事件委托给父元素,让父元素负責事件监听。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是可以提高性能。

54、什么是 JavaScript?

JavaScript是客户端和服务器端的脚本语言,可以插入HTML页面中,并且是目前较热门的Web开发语言,同时, JavaScript也是面向对象的编程语言。

55、列举Java和 JavaScript的不同之处。

Java是一门十分完整、成熟的编程语言。相比之下, JavaScript是一个可以被引入HTML页面的编程语言。这两种语言并不完全相互依赖,而是针对不同的意图而设计的。Java是一种面向对象编程(OOP)或结构化编程语言,类似的语言有C++;而 JavaScript是客户端脚本语言,它称为非结构化编程。

56、JavaScript和ASP脚本相比,哪个更快?

JavaScript更快。JavaScript是一种客户端语言,因此它不需要Web服务器的协助就可以执行;ASP是服务器端语言,因此它总是比 JavaScript慢,值得注意的是, JavaScript现在也可用于服务器端语言( Node. js)

57、什么是负无穷大?

Infinity代表了超出 JavaScript处理范围的数值。也就是说, JavaScript无法处理的数值都是 Infinity.实践证明, JavaScript所能处理的*大值( Number. MAX VALUE)是17976931348623157e+308,超过该数则为正无穷大;而*小值( Number. MIN VALUE)

是5e-324,小于该数则为0.所以负无穷大代表的是小于- Number MAX VALUE的数字, JavaScript中对应静态变量 Number NEGATIVE INFINITY

58、如何将 JavaScript代码分解成几行?

M:在字符串语句中可以通过在*行末尾使用反斜杠“\”来完成,例如, document. write(”This is \a program”)。

如果不是在字符串语句中更改为新行,那么 JavaScript会忽略行中的断点下面的代码是完美的,但并不建议这样做,因为阻碍了调试。

var x=l, y=2,z=X+y;

59、什么是未声明和未定义的变量?

未声明的变量是程序中不存在且未声明的变量。如果程序尝试读取未声明变量的值,则会在运行时遇到错误。未定义的变量是在程序中声明但尚未给出任何值的变量如果程序尝试读取未定义变量的值,则返回未定义的值60.:如何编写可动态添加新元素的代码?

下面给出一段示例代码

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><tit1e>有课前端网—专业前端技术学习网</tit1e></head><body><p id="ickt">ickt</p><script type="text/javascript">function addNode (){ var p= document. createElement('p');var textNode document, createTextNode('有课前端网')p .appendchild(textNode);document. getElementById('ickt') .appendChild(p)}addNode ()</script></body></html>

61、什么是全局变量?这些变量如何声明?使用全局变量有哪些问题?

全局变量是整个代码中都可用的变量,也就是说,这些变量没有任何作用域var关键字用于声明局部变量,如果省略var关键字,则声明一个全局变量使用全局变量面临的问题是局部变量和全局变量名称的冲突。此外,很难调试和测试依赖于全局变量的代码。

62、解释 JavaScript中定时器的工作,并说明使用定时器的缺点。

定时器用于在设定的时间执行一段代码,或者在给定的时间间隔内重复该代码这通过使用函数 setTimeout、setInterval和 clearInterva来完成。

setTimeout( function, delay)函数用于启动在所属延迟之后调用特定功能的定时器。

setInterval( function,dlay)函数用于在提到的延迟中重复执行给定的功能,只有在取消时才停止。

clearInterval(id)函数指示定时器停止定时器在一个线程内运行,因此事件可能需要排队等待执行。

63、ViewState和 SessionState有什么区别?

View State特定于会话中的页面;SessionState特定于可在Web应用程序中的所有页面上访问的用户特定数据。

64、什么是===运算符?

===称为严格等式运算符,当两个操作数具有相同的值和类型时,该运算符返回true。

65、说明如何使用 JavaScript提交表单。

要使用 JavaScript提交表单,可以使用以下代码。

document .form [0] .submit();

66、元素的样式/类如何改变?

可以通过以下方式改变元素的样式。

document. getElementById("myText").style. fontsize ="20";

可以通过以下方式改变元素的类。

document. getElementById("myText ").className ="anyclass";

67、JavaScript中的循环结构都有哪些?

for、 while、do.… while、 for in、 for of(ES6新增的)

68、如何在 JavaScript中将base字符串转换为 integer?

parselnt()函数解析一个字符串参数,并返回一个指定基数的整数。parselnt()将要转换的字符串作为其*个参数,第二个参数是给定字符串的转换进制基数。

为了将4F(基数16)转换为整数,可以使用代码 parrent(”4F”,16)。

69、说明“==”和“===”的区别。

“==”仅检查值相等性,而“===”用于更严格的等式判定。如果两个变量的值或类型不同,则后者返回 false。

70、3+2+“7”的结果是什么?

由于3和2是整数,它们将直接相加,同时由于“7”是一个字符串,将会被直连接,因此结果将是57。

71、如何检测客户端机器上的操作系统?

为了检测客户端机器上的操作系统,应使用 navigator.app Version字符串(属性)。

72、JavaScript中的null表示什么?

null用于表示无值或无对象。它意味着没有对象或空字符串,没有有效的布尔没有数值和数组对象

73、delete操作符的功能是什么?

delete操作符用于删除对象中的某个属性,但不能删除变量、函数等。

74、JavaScript中有哪些类型的弹出框?

ua;alert、 confirm和 prompt。

75、void(0)的作用是什么?

void操作符使表达式的运算结果返回 undefined。

void(0)用于防止页面刷新,并在调用时传递参数“0”。

void(0)用于调用另一种方法而不刷新页面。

76、如何强制页面加载 JavaScript中的其他页面?

必须插入以下代码才能达到预期效果。

<script language="JavaScript"  type="text/javascript"><!--location.href="http://newhost/newpath/newfile.html";//--></script>

77、转义字符是用来做什么的?

当使用特殊字符(如单引号、双引号、撇号和&符号)时,将使用转义字符(反斜杠)。在字符前放置反斜杠,使其显示。

下面给出两个示例。

document. write"I m a "good"boy "document. write"I m a\"good\"boy"

78、什么是 JavaScript cookie?

cookie是存储在访问者计算机中的变量。每当一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。可以使用 JavaScript来创建和获取 cookie的值。

79、解释 JavaScript中的pop()方法。

pop()方法与shift()方法类似,但不同之处在于shift()方法在数组的开头工作。此外,pop()方法将*后一个元素从给定的数组中取出并返回,然后改变被调用的数组例如:

var colors = ["red","blue","green"]; colors. pop ();// colors :["red","blue"]
80、在 JavaScript中使用 innerHTML的缺点是什么?
缺点如下:
(1)内容随处可见
(2)不能像“追加到 innerHTML”一样使用。
(3)即使使用+=,如” innerHTML= innerhTML+’htm'”,旧的内容仍然会被HTML替换。

(4)整个 innerHTML内容被重新解析并构建成元素,因此它的速度要慢得多。

(5) innerHTML不提供验证,因此可能会在文档中插入具有破坏性的HTML并将其中断。

81、break和 continue语句的作用是什么?

break语句从当前循环中退出;continue语句继续下一个循环语句。

82、在 JavaScript中, datatypes的两个基本组是什么?

两个基本组是原始类型和引用类型。

原始类型包括数字和布尔类型。引用类型包括更复杂的类型,如字符串和日期。

83、如何创建通用对象?

通用对象可以通过以下代码创建。

var o= new Object ()。

84、typeof是用来做什么的?

typeof是一个运算符,用于返回变量类型的字符串描述。

85、哪些关键字用于处理异常?

try...catch...finally用于处理 JavaScript中的异常。try{执行代码}catch(exp){ 抛出错误提示信息}finally {无论try/catch的结果如何都会执行。}

86、JavaScript中不同类型的错误有几种?

有3种类型的错误。

Load time errors,该错误发生于加载网页时,例如出现语法错误等状况,称为加载时间错误,并且会动态生成错误。

Run time errors,由于在HTML语言中滥用命令而导致的错误。

Logical errors,这是由于在具有不同操作的函数上执行了错误逻辑而发生的错误。

87、在 JavaScript中,push方法的作用是什么?

push方法用于将一个或多个元素添加或附加到数组的末尾。使用这种方法,可通过传递多个参数来附加多个元素。

88、在 JavaScript中, unshift方法的作用是什么?

unshift方法就像在数组开头工作的push方法。该方法用于将一个或多个元素添加到数组的开头。

89、如何为对象添加属性?

为对象添加属性有两种常用语法。

中括号语法,比如obj[” class”]=12。

点语法,比如 obj. class=12。

90、获得 CheckBox状态的方式是什么?

alert( document getElement Byld(’checkbox1’) .checked;

如果 CheckBox选中,此警告将返回TRUE。

91、解释一下 window. onload和 onDocumentReady。

在载入页面的所有信息之前,不运行 window. onload。这导致在执行任何代码之前会出现延迟。

window.onDocumentReady在加载DOM之后加载代码。这允许代码更早地执行(早于 window. onload)。

92、如何理解 JavaScript中的闭包?

闭包就是能够读取其他函数内部变量的函数。

闭包的用途有两个,一是可以读取函数内部的变量,二是让这些变量的值始终保持在内存中。

93、如何把一个值附加到数组中?

可以在数组末尾处添加成员arr[ arr length]= value;或者调用push方法 arr.push(value)。

94、解释一下for-in循环。

for-in循环用于循环对象的属性。

for-in循环的语法如下。

for (var iable name in object){}

在每次循环中,来自对象的一个属性与变量名相关联,循环继续,直到对象的所有属性都被遍历。

95、描述一下 JavaScript中的匿名函数。

被声明为没有任何命名标识符的函数称为匿名函数。一般来说,匿名函数在声明后无法访问。

匿名函数声明示例如下。

var anon=function(){alert('I am anonymous' );anon();

96、和DOM事件流的区别是什么?

区别如下。

(1)执行顺序不一样

(2)参数不一样。

(3)事件名称是否加on不一样。

(4)this指向问题不一样。

97、阐述一下事件冒泡。

Java Script允许DOM元素嵌套在一起。在这种情况下,如果单击子级的处理程序,父级的处理程序也将执行同样的工作。

98、JavaScript里函数参数 arguments是数组吗?

在函数代码中,使用特殊对象 arguments,开发者无须明确指出参数名,使用下标就可以访问相应的参数。

arguments虽然有数组的性质,但其并非真正的数组。它只是一个类数组对象,并没有数组的方法,不能像真正的数组那样调用 .join()、, .concat()、.pop()等方法。

99、什么是构造函数?它与普通函数有什么区别?

构造函数是一种特殊的方法,主要用来创建对象时初始化对象,经常与new运算符一起使用,创建对象的语句中构造函数的名称必须与类名完全相同。

与普通函数相比,区别如下

(1)构造函数只能由new关键字调用

(2)构造函数可以创建实例化对象

(3)构造函数是类的标志。

100、请解释一下 JavaScript和CSS阻塞。

JavaScript的阻塞特性是所有浏览器在下载 JavaScript代码的时候,会阻止其他一切活动,比如其他资源的下载,内容的呈现等,直到 JavaScript代码下载、解析、执行完毕后才开始继续并行下载其他资源并渲染内容。

为了提高用户体验,新一代浏览器都支持并行下载 JavaScript代码,但是 JavaScript代码的下载仍然会阻塞其他资源的下载(例如图片、CSS文件等)。

为了防止 JavaScript修改DOM树,浏览器需要重新构建DOM树,所以就会阻塞其他资源的下载和渲染。

嵌入的 JavaScript代码会阻塞所有内容的呈现,而外部 JavaScript代码只会阻塞其后内容的显示,两种方式都会阻塞其后资源的下载。也就是说,外部脚本不会阻塞外部脚本的加载,但会阻塞外部脚本的执行。

CSS本来是可以并行加载的,但是当CSS后面跟着嵌入的 JavaScript代码的时候,该CSS就会阻塞后面资源的下载。

而当把嵌入的 JavaScript代码放到CSS前面时,就不会出现阻塞的情况了(在IE6下CSS都会阻塞加载)。

根本原因是因为浏览器会维持HTML中CSS和 JavaScript代码的顺序,样式表必须在嵌入的 JavaScript代码执行前先加载、解析完。而嵌入的 JavaScript代码会阻塞后面的资源加载,所以就会出现CSS阻塞资源加载的情况。

本文完~

CSS面试题(附答案)

 

CSS部分的面试题主要考察应试者对CSS基础概念模型的理解,例如文档流、盒模型、浮动、定位、选择器权重、样式继承等。很多应试者认为CSS很简单,没多少内容,面试就是面试 JavaScript部分的内容,这些观点是错误的,面试的*关往往会考察应试者对CSS的掌握情况。因此,CSS也常常是应试者掉入的*个陷阱。

1、CSS有哪些基本选择器?它们的权重是如何表示的?

CSS基本选择器有类选择器、属性选择器和ID选择器。

CSS选择器的权重预示着CSS选择器样式渲染的先后顺序,元素样式渲染时,权重高的选择器样式会覆盖权重低的选择器样式。

通常将权重分为4个等级,可用0.0.0.0来表示这4个等级。

!important关键字优先级*高。

注意:!importont井非选择器,而是针对选择器内的单一样式设置的。当然,不同选择器内应用 !important的权重也是不一样的,例如,在id选择器内的!important关键字权重要高于类选择器内的 !important关键字权重,即下面所说的选择器权重组合。

内联样式(非元素器)的优先级可看成1.0.0.0。

ID选择器的优先级为0.1.0.0。

类属性选择器、属性选择器、伪类的优先级为0.0.1.0。

元素选择器、伪元素选择器的优先级为0.0.0.1。

通配符选择器对特殊性没有任何贡献值。

当把选择器组合使用的时候,相应的层级权重也会递增,例如# id .class的权重为0.1.1.0。

2、CSS的引入方式有哪些?ink和@ import的区别是什么?

CSS有3种引入方式。

  • 行内式是指将样式写在元素的 style属性内。
  • 内嵌式是指将样式写在 style元素内。
  • 外链式是指通过link标签,引入CSS文件内的样式。

通过link标签引入样式与通过@ import方法引入样式有如下区别。

(1)加载资源的限制。

link是 XHTML的标签,除了加载CSS文件外,还可以加载RSS等其他事务,如加载模板等。

@ import只能加载CSS文件。

(2)加载方式。

如果用link引用CSS,在页面载入时同时加载,即同步加载。

如果用@ import引用CSS,则需要等到网页完全载入后,再加载CSS文件,即异步加载。

(3)兼容性。

link是 XHTML的标签,没有兼容问题。

@ import是在CSS2.1中提出的,不支持低版本的浏览器。

(4)改变样式

link的标签是DOM元素,支持使用 JavaScript控制DOM和修改样式;@ import是种方法,不支持控制DOM和修改样式。

3、浮动元素引起的问题和解决方法是什么?

引起的问题有如下几个。

(1)父元素的高度无法被撑开,影响与父元素同级的元素。

(2)与元素同级的非浮动元素会紧随其后(类似遮盖现象)。

(3)如果一个元素浮动,则该元素之前的元素也需要浮动;否则,会影响页面显示的结构(即通常所说的串行现象)。

解决方法如下:

(1)为父元素设置固定高度。

(2)为父元素设置 overflow:hidden即可清除浮动,让父元素的高度被撑开。

(3)用 clear:both样式属性清除元素浮动。

注意:如果只有左浮动或只有右浮动,可以单独设置 clear:left或 clear:right,但是设置clear:both则都可以解决,所以此方法在工作中用得更多。

(4)外墙法是指在父元素外面,添加“一道墙”,设置属性 clear:both

(5)内墙法是指在父元素内部,浮动元素的*后面,添加“一道墙”,设置属性 clear:both

(6)伪元素是指为了少创建元素,对父元素添加afer伪元素,设置属性 content:””;display :block;clear:both。

注意:这里所说的少创建元素,实际上并没有少创建,添加的伪元素也是元素,只不过没有写在HTML文档中而已。

(7)使用通用类 clearfix, clearfix的实现如下:

clearfix:after {  content " ";display:block;clear:both;}
注意:推荐以上这种方式,因为 clearfix已经应用在各大CSS框架(如 Bootstrap等)中,并成为行业的默认规范。
4、position的值分别是相对于哪个位置定位的?
relative表示相对定位,相对于自己本身所在正常文档流中的位置进行定位。absolute表示*对定位,相对于*近一级(从直接父级元素往上数,直到根元素)定位,相对于 statIc的父元素进行定位。
fixed用于生成*对定位,相对于浏览器窗口或 frame进行定位。
statIc是默认值,没有定位,元素出现在正常的文档流中。
sticky是生成黏性定位的元素,容器的位置根据正常文档流计算得出。
注意:CSS3的新增属性有点类似于 relative与 fixed的结合体。如果目标区域在屏幕中可见,表现为 relative;如果目标区域在屏幕中不可见,表现为fixed。
5、请说明 position:absolute和float属性的异同。
共同点是对内联元素设置float和 absolute属性,可以让元素脱离文档流,并且可以设置其宽高。
不同点是float仍可占据位置,不会覆盖在另一个BFC区域上,浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止, absolute会覆盖文档流中的其他元素,即遮盖现象。
6、CSS选择器(符)有哪些?
(1)id选择器(#myld)。
(2)类选择器( .my ClassName)。
(3)标签选择器(div,p,h1)
(4)相邻选择器(h1+p)
(5)子选择器(ul>li)
(6)后代选择器(li  a)
(7)通配符选择器(*)
(8)属性选择器( button[disabled=”true”])。
(9)伪类选择器( a:hover、 li:nth- child)表示一种状态。
(10)伪元素选择器(li:before、“:after”、“:first- letter”、“:first-line”、“;selecton”)表示文档某个部分的表现。
注意:在CSS3规范中,为了区别伪元素和伪类,CSS3建议伪类用单冒号“:”,伪元素用双冒号”::”。
7、CSS的哪些样式可以继承?哪些不可以继承?
可继承的样式有font- size font-family color, UL LI DL DD DT。
不可继承的样式有 border、 padding, margin, width、 height。
注意:为了方便辨识,与字体相关的样式通常可以继承,与尺寸相关的样式通常不能继承。
8、CSS优先级如何排序?
优先级如下:
!important>style(内联)>ld(权重100)> class(权重10)>标签(权重1)。同类别的样式中,后面的会覆盖前面的。
9、HTML是什么?CSS是什么?JavaScript是什么?
(1)HTML( Hyper Text Markup Language,超文本标记语言)是做网站时使用的些文本标记标签,比如div、span等
(2)CSS( Cascading Style Sheet,层叠样式表)是做网站时为美化网站而为标签添加的样式,比如 background(背景)、 color(字体颜色) height(高度)、widh(宽度)等。
(3) JavaScript是网站中实现前后台交互效果、网页动画效果的一种开发语言,比如鼠标单击( click)事件、前后台数据请求(Ajax)等。
10、为什么要初始化CSS?
因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没有初始化CSS,往往会导致页面在不同浏览器之间出现差异。
当然,初始化样式有时会对SEO产生一定的影响,但鱼和熊掌不可兼得,所以在力求影响*小的情况下初始化CSS。
*简单的初始化方法就是:*{ padding:0;margin:0;}
11、如何居中div?如何居中一个浮动元素?
确定容器的宽高,例如宽400px、高200px的div.设置层的外边距。
div{ float:leftwidth:400px;height:200px;margin:-100px 0 0-200px;/*注意,由于左上外边距优先级高于右下外边距优先级,因此,还可以简化设置 margin:-150px-250px;*/position:relative;left50%;top:50%;/*为方便看效果,添加一种背景色*/background-color:pink}
12、构成CSS的基本语句是什么?
构成CSS的基本语句如下。
选择器{属性名称1:属性值1;属性名称2:属性值2;}
例如
div{ margin-top:20px;border:2px solid #red;}
13、display有哪些值?说明它们的作用。
display的值有 block、none, inline、 inline- block、list-item、 table和 inherit。其作用如下。
block是指块类型。默认宽度为父元素宽度,可设置宽高,换行显示。   none是指元素不会显示,已脱离文档流。
inline是指行内元素类型。默认宽度为内容宽度,不可设置宽高,同行显示。
inline- block是指默认宽度为内容宽度,可以设置宽高,同行显示。
list-item是指像块类型元素一样显示,并添加样式列表标记。
注意:例如,用div模拟li元素<ul>< div style=” display:list-item:”>有课前端网</d></ul>。
table是指此元素会作为块级表格显示。
inherit是指从父元素继承 display属性的值。
14、简要描述块级元素和行内元素的区别。
块级元素的前后都会自动换行。默认情况下,块级元素会独占一行。例如<p><h1-h6><div>都是块级元素,当显示这些元素中间的文本时,都将从新行中开始显示,其后的内容也将在新行中显示。
行内元素可以和其他行内元素位于同一行,在浏览器中显示时不会换行。例如<a><span>等,对于行内元素,不能设置其高度和宽度。
还有一种元素是行内块级元素,比如<img>< input>元素等。这些元素可以和其他行内元素位于同一行,同时可以设置其高度和宽度。
15、如何用DIV+CSS实现3栏布局(左右固定200pX,中间自适应)?
具体代码如下:
html
<div class="container"><div class="main"><h2>有课前端网</h2></div><div class="left">左边内容</div>div class="right" >右边内容</div></dv>

CSS

.container div {height:200px;}.container{ padding:0 200px;}.main,.left,.right{position:relative;float:left;}.left.right{width:200px;}.main{ width:100%;background:yellow;}.left {background:blue:margin-left:-100%;left:-200px;}.right {background:green;margin-left:-200px;left:200px;}
16、解释浮动及其工作原理。
浮动的元素可以向左或向右移动,直到它的外边缘碰到包含元素(父元素)或另一个浮动元素的边框为止。要想使元素浮动,必须为元素设置一个宽度( width)。虽然浮动元素已不在文档流中,但是它浮动后所处的位置依然在浮动之前的水平方向上。
因为浮动元素不在文档流中,所以文档流中的块元素表现得就像浮动元素不存在一样,下面的元素会填补原来的位置。
有些元素会在浮动元素的下方,但是这些元素的内容并不一定会被浮动的元素遮盖。当定位内联元素时,要考虑浮动元素的边界,围绕浮动元素放置内联元素。也可以把浮动元素想象成被块元素忽略的元素,而内联元素会关注的元素。
17、解释一下 CSS Sprite,以及如何在页面或网站中使用它。
CSS Sprite其实就是把网页中一些背景图片整合到一张图片文件中,再利用CSS的“ background- image”“ background- repeat”“ background- position”的组合进行背景定位, background- position可以用数字精确地定位出背景图片的位置。
注意:在高级浏览器中,可以基于图片的bose64编码存储,将图片与其他类型的文件打包。
18、在书写高效CSS时有哪些问题需要考虑?
(1)样式,从右向左解析一个选择器
(2)类型选择器的速度,ID选择器*快, Universal(通配符*)*慢。对于常用的4种类型选择器,解析速度由快到慢依次是ID、 class, tag和 universal。
(3)不要用标签限制ID选择器(如:ul#main- navigation{},ID已经是唯一的,不需要Tag来限制,这样做会让选择器变慢)。
(4)后代选择器*糟糕(换句话说, html body ul li a{}这个选择器是很低效的)。
(5)想清楚你的需求,再去书写选择器。
(6)CSS3选择器(如nth- child)能够漂亮地定位我们想要的元素,又能保证CSS整洁易读。然而,这些神奇的选择器会浪费很多的浏览器资源。
(7)我们知道ID选择器的速度*快,但是如果都用ID选择器,会降低代码的可读性和可维护性等。在大型项目中,相对于使用ID选择器提升速度,代码的可读性和可维护性带来的收益更大。
19、说出几种解决IE6  Bug的方法。
解决方案如下:
(1)双边距问题,是使用fLoat引起的。
解决方法是使用 display:inline。
(2)3像素问题,是使用float引起的。
解决方法是使用 margin- right:-3px。
(3)超链接 hover伪类样式,单击后失效。
解决方法是使用以下正确的书写顺序:L→V→H→A(link, visited, hover., active)。
(4)z- index问题。
解决方法是给父级添加 position:relative
(5)PNG图片半透明问题。
解决方法是使用 JavaScript代码库,或使用IE滤镜
注意:在使用E滤镜解决PNG图片透明度的时候,在1E6中,会对事件产生影响。
20、页面重构怎样操作?
编写CSS,让页面结构更合理化,提升用户体验,达到良好的页面效果并提升性能
21、display:none和 visibility:hidden的区别是什么?
display:none隐藏对应的元素,在文档流中不再给它分配空间,它各边的元素会合拢,即脱离文档流。
visibility:hidden隐藏对应的元素,但是在文档流中仍保留原来的空间。
22、内联元素可以实现浮动吗?
在CSS中,任何元素都可以浮动。不论浮动元素本身是何种元素,都会生成个块级框。因此,对于内联元素,如果设置为浮动,会产生和块级框相同的效果。

23、简要描述CSS中 content属性的作用。

content属性与:before及:after伪元素配合使用,用来插入生成的内容,可以在元素之前或之后放置生成的内容。可以插入文本、图像、引号,并可以结合计数器,为页面元素插入编号。比如,查看如下代码。

body{counter-reset:chapter;} h1:before{ content:"第" counter( chapter)"章"}h1{counter-increment:chapter:}<h1></h1><h1></h1><h1></h1>

使用 content属性,并结合 :before选择器和计数器 counter,可以在每个<h1>元素前插入新的内容。

24、如何定义高度很小的容器?

因为有一个默认的行高,所以在IE6下无法定义小高度的容器。

两种解决方案分别是 overflow:hidden或font-size:容器高度px

25、如何在图片下方设置几像素的空白间隙?

定义img为 display:block,或定义父容器为font-size:0。

26、如何解决IE6双倍 margin的Bug?

使用 display:inline

27、如何让超出宽度的文字显示为省略号?

输入 overflow:hidden;width:xxx;white-space:nowrap;

text-overflow:ellipsis。

28、如何使英文单词发生词内断行?

输入word-wrap:break-word。

29、如何实现IE6下的 position:fxed?

具体代码如下:

html_{overflow:hidden;} body_{overflow:auto;height:100%:}.fixed{position:fixed;_position:absolute;left:0top:0padding:10pxbackground:#000}

30、如何让min- height兼容IE6?

具体代码如下。

.min-height{min-height:100px;_height:100px;background:red;}

31、已知高度的容器如何在页面中水平垂直居中?

具体代码如下。

<style type=text/css"># box {width:200px;height:200px;background:red;position:absolute;left:50%;top:50%;margin:-100px 0 0-100px;/*或者 marion:-100px*/}</style><div id="box“></div>

32、px和em的区别是什么?

px和em都是长度单位,两者的区别是:px的值是固定的,指定为多少就是多少,计算比较容易;em的值不是国定的,是相对于容器字体的大小,并且em会继承父级元素的字体大小。

浏览器的默认字体高都是16px,所以未经调整的浏览器都符合lem=16px,那么12px=0.75em,10px=0.625em。

与cm对应的另一个长度单位是rem,是指相对于根元素(通常是HTML元素)字体的大小。

33、什么叫优雅降级和渐进增强?两者有什么区别?

优雅降级 graceful degradation是指一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。

渐进增强 progressive enhancement是指针对低版本浏览器构建页面,保证*基本的功能,然后再针对高级浏览器进行效果、交互等改进并追加功能,以达到更好的用户体验。

两者的区别如下。

(1)优雅降级从复杂的现状开始,并试图减少用户体验的供给。

(2)渐进增强则从一个非常基础并且能够起作用的版本开始,并不断扩充,以适应未来环境的需要。

(3)降级(功能衰减)意味着往回看,而渐进增强则意味着朝前看,同时保诬其根基处于安全地带。

34、网页制作会用到哪些图片格式?

用于网页制作的主流图像格式有JPG、PNG、GIF等。

JPG:压缩率高,文件小,*常用。

PNG:支持无损压缩,色彩损失小,保真度高,文件稍大。

GIF:支持动画显示,但只支持256色显示,目前已经被Fash大量取代。

35、CSS的 content属性有什么作用?有什么应用?

CSS的 content属性专门应用在 before/after伪元素上,用于插入生成的内容*常见的应用是利用伪类清除浮动。

36、对行内元素设置 margin-top和 margin- bottom是否起作用?

不起作用(需要注意行内元素的替换元素img、 Input,它们是行内元素,但是可以设置它们的宽度和高度,并且 margin属性也对它们起作用, margin-op和 margin- botton有着类似于 inline- block的行为)

37、div+css的布局较table布局有什么优点?

(1)改版的时候更方便,只须改动CSS文件。

(2)页面加载速度更快、结构清晰、页面简洁。

(3)表现与结构分离。

(4)搜索引擎优化(SEO)更友好,排名更靠前。

38、如果设置<p>的font-sze为10rem,那么当用户重置或拖曳浏览器窗口时,它的文本会不会受到影响?

不会

39、谈谈你对BFC规范的理解。

BFC( Block Formatting Context)指块级格式化上下文,即一个创建了新的BFC的盒子是独立布局的,盒子里面的子元素的样式不会影响到外面的元素。在同一个BFC中,两个毗邻的块级盒在垂直方向(和布局方向有关系)的 margin会发生折叠。

BFC决定元素如何对其内容进行布局,也决定与其他元素的关系和相互作用。

40、谈谈你对C规范的理解。

IFC( Inline Formatting Context)指内联格式化上下文,IFC的线框( line box)高度由其包含行内元素中*高的实际高度计算而来(不受竖直方向的 padding/margin的影响)。IFC中的线框一般左右都贴紧整个IFC,但是会被foat元素扰乱。同一个IFC下的多个线框高度不同。

IFC中是不可能有块级元素的,当插入块级元素时(如在p中插入div),会产生两个匿名块,两者与div分隔开,即产生两个IFC,每个IFC对外表现为块级元素,与div垂直排列。

41、谈谈你对GFC规范的理解。

GFC( GridLayout Formatting Context)指网格布局格式化上下文,即当把一个的 display值设为grid的时候,此元素将会获得一个独立的渲染区域。可以通过在网格容器( grid container)上定义网格定义行( grid definition row)和网格定义列(grid definition column),在网格项目( grid item)上定义网格行( grid row)和网格列(grid column)来为每一个网格项目定义位置和空间。

42、谈谈你对FFC规范的理解。

FFC( Flex Formatting Context)指自适应格式化上下文,即 display值为fex或lne-flex的元素将会生成自适应容器。伸缩容器中的每一个子元素都是一个伸缩单元。伸缩单元可以是任意数量的。伸缩单元内和伸缩容器外的一切元素都不受影响。简单地说, Flexbox定义了伸缩容器内伸缩单元的布局。

43、访问超链接后 hover样式就不出现的原因是什么?应该如何解决?

因为访问过的超链接样式覆盖了原有的 hover和 active伪类选择器样式,解决方法是将CSS属性的排列顺序改为L→V→H→A(link, visited, hover, active)。

44、什么是外边距重叠?重叠的结果是什么?

外边距重叠就是 margin- collapse在CSS中,相邻的两个盒子(可能是兄弟关系也可能是祖先关系)的外边距可以结合成一个单独的外边距。这种合并外边距的方式称为折叠,因此而结合成的外边距称为折叠外边距。

折叠结果遵循下列计算规则。

(1)当两个相邻的外边距都是正数时,折叠的结果是它们两者中较大的值

(2)当两个相邻的外边距都是负数时,折叠的结果是两者中*对值较大的值。

(3)当两个外边距一正一负时,折叠的结果是两者相加的和。

45、rgba0和 opacity的透明效果有什么不同?

rgba()和 opacity都能实现透明效果,但它们*大的不同是 opacity作用于元素,并且可以设置元素内所有内容的透明度;而 rgba()只作用于元素的颜色或其背景色(设置rgba透明的元素的子元素不会继承透明效果)。

46、CSS中可以让文字在垂直和水平方向上重叠的两个属性是什么?

垂直方向的属性是 line-height.水平方向的属性是 letter-spacing。

47、你知道哪些关于 letter- spacing的妙用?

可以用于消除 inline- block元素间的换行符空格间隙

48、有什么方式可以对一个DOM设置它的CSS?

有以下三种方式。

  • 外链式,即通过link标签引入一个外部CSS文件中。
  • 内嵌式,即将CSS代码写在 style标签内。
  • 行内式,即将CSS代码写在元素的 style属性中。

49、在CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内?

*基本的方式如下。

设置 display属性为none,或者设置 visibility属性为 hidden技巧性的方式如下。

设置宽高为0,透明度为0,设置z- index位置为-1000。

50、常用的块属性标签及其特征有哪些?

常用块标签有div、hl、h6、ol、ul、li、d、 table、p、br、form。块标签的特征有独占一行,换行显示,可以设置宽、高,块可以套块和行。

51、常用的行内属性标签及其特征有哪些?

行标签有span、a、img、var、em, strong、 textarea、 select、 option、 input.行标签的特征有在行内显示,内容撑开宽、高,不可以设置宽、高(img, input、 textarea等除外),行只能套用行标签。

52、浏览器标准模式和怪异模式之间的区别是什么?

它们的区别是盒子模型的渲染模式不同。

可以使用 window. top document compatMode判断当前模式为何种模式结果为 Back Compat,表示怪异模式结果为 CSSICompat,表示标准模式。

53、如何避免文档流中的空白符合并现象?

空白符合并是标准文档流的特征之一,可以通过设置 white-spac修改这一特征,属性值如下。

pre表示不会合并空白符,渲染换行符,不会自动换行,相当于pre元素。

pre-wrap表示不会合并空白符,渲染换行符,自动换行pre-line表示合并空白符,渲染换行符,自动换行。

nowrap表示合并空白符,不会渲染换行符,不会自动换行。

normal表示默认值,按照文档流特点渲染,合并空白符,不会渲染换行符,自动换行。

54、常见的兼容性问题有哪些?

PNG24位的图片在IE6浏览器上出现背景,解决方案是改成PNG8,也可以引段脚本进行处理浏览器默认的 margin和 padding不同。解决方案是用一个全局的*{ margin:0 padding:0;}来统一它们。

IE6双边距Bug是指在块属性标签float后又有横行的 margin时,在IE6中显示的margin比设置的大浮动IE产生的双倍距离(IE6的双边距问题是指在IE6下,如果对元素设置了浮动,同时又设置了 margin-left或 margin- right, margin的值会加倍)

#box{ float:left;width:10px;margin:00 100px;}

这种情况下IE会产生20px的距离,解决方案是在float的标签样式控制中加入display:inline,将其转换为行内属性(这个符号只会被IE6识别)。

用渐进识别的方式,从总体中逐渐排除局部。

首先,巧妙地使用“\9”这一标记,将IE浏览器从所有情况中分离出来。然后,再次使用“+”将IE8和I7、IE6分离开,这样IE8就能被独立识别。

CSS

.bb{background-color:#f1ee18;/所有识别*/ background- color:#00deff\9;/IE6、7、8识别”/+ background- color:#a200ff;/*E6、7识别*/ background- color:#1e0bdl;/"IE6识别”/}

怪异模式问题是指漏写DTD声明, Firefox仍然会按照标准模式来解析网页,但在IE中会触发怪异模式。为避免怪异模式给我们带来不必要的麻烦,*好养成书写DTD声明的好习惯。现在可以使用[hml5]

推荐的写法是'< doctype html>’上下 margin重合的问题IE和FF中都存在,相邻两个div的 margIn-et和 margin- right不会重合,但是margin-top和 margin- bottom会重合。

解决方法是养成良好的代码编写习惯,同时采用 margin-top或者同时采用 margin- bottom。

55、透明度具有继承性,如何取消透明度的继承?

使用rgba给元素的背景设置透明度的方式,来替代使用opacity设置元素透明度的方式,解决子元素继承父元素透明度的问题。

56、CSS中,自适应的单位都有哪些?

自适应的单位有以下几个

  • 百分比:%
  • 相对于视口宽度的单位:ww
  • 相对于视口高度的单位:vh
  • 相对于视口宽度或者高度(取决于哪个小)的单位:Vm
  • 相对于父元素字体大小的单位:em
  • 相对于根元素字体大小的单位:rem

57、说说rem和em的区别。

它们都是相对单位

  • rem表示相对于根元素的字体大小。
  • em表示相对于父元素的字体大小

58、什么是FOUC?如何避免FOUC?

FOUC即无样式内容闪烁( Flash Of Unstyled Content),是在IE下通过 @import方式导入CSS文件引起的,如:< style type=” text/css” media=”all”@ Dimporturl(‘demo.css);</style>

IE会首先加载整个HTML文档的DOM,然后再导入外部的CSS文件。因此,在页面DOM加载完成到CSS导入完成中间,有一段时间页面上的内容是没有样式的,这段时间的长短跟网速和电脑速度都有关系。

解决方法是在<head>之间加入一个<link>或< script>标签

59、说说 display:none和 visibility:hidden的区别。

display:none隐藏对应的元素,在文档布局中不再给它分配空间,它各边的元素会合拢,就当它从来都不存在。

visibility:hidden隐藏对应的元素,但是在文档布局中仍保留原来的空间。

本文完~

常见的HTML5面试题(附答案)

     HTML5为我们提供了更多的语义化标签、更丰富的元素属性,以及更让人欣喜的功能。但在面试中,HTML5部分的面试题主要考察应试者对HTML5API的掌握情况,这是HTML5的重点,也正是这些API推动了前端的发展。
这些新技术早已应用在很多大型项目中。
有些人认为HTML5只是新增了一些语义化HTML标签,或者HTML5只是对HTML做了拓展,我们只须了解HTML相关知识的观点是不正确的。
今天我们将跟大家分享42道HTML5的相关面试题。
1、HTML5有哪些新特性?移除了哪些元素?
HTML5的新特性如下:
  • 拖放( Drag and drop)APIl
  • 语义化更好的内容标签( header、nav、 footer、 aside、 article、 section)
  • 音频、视频( audio、 video)API
  • 画布( Canvas)API
  • 地理( Geolocation)APl
  • 本地离线存储( localStorage),即长期存储数据,浏览器关闭后数据不丢失。
  • 会话存储( sessionStorage),即数据在浏览器关闭后自动删除
  • 表单控件包括 calendar、date、time、 email、url、 search。
  • 新的技术包括 webwork、 websocket、 Geolocation
移除的元素如下:
  • 纯表现的元素,包括 basefont,big、 center、font、s, strike,t、u
  • 对可用性产生负面影响的元素,包括 frame、 frameset、 Noframes
2、如何处理HTML5新标签的浏览器兼容问题?
IE8、IE7、IE6支持用 document. create Element产生标签,可以利用这一特性让这些浏览器支持HTML5新标签。浏览器支持新标签后,还需要添加标签默认的样式(*好的方式是直接使用成熟的框架,使用*多的是 html5shim框架),可以用 IE hack引入该框架
<!--[if 1t IE 9]><script>src="http://html5shim.googlecode.com/svn/trunk/htm15.js</script><![end if]-->

3、如何区别HTML和HTML5?

用 DOCTYPE声明新增的结构元素和功能元素来区别它们。

4、什么是HTML5?

HTML5是*新的HTML标准,它的主要目标是提供所有内容,而不需要任何Flash、 SilverLight等的额外插件,这些内容来自动画、视频、富GUI等

HTML5是万维网联盟(W3C)和网络超文本应用技术工作组( WHATWG)合作输出的。

5、新的HTML5文档类型和字符集是什么?

HTML5文档类型是<!doctype html>。

HTML5使用的字符集< meta charset=”UTF8″>。

6、HTML5 Canvas元素有什么作用?

Canvas元素用于在网页上绘制图形,该元素标签的强大之处在于可以直接在HTML上进行图形操作。

7、HTML5新增了哪些功能AP?

新增的功能API包括 Media APl、 Text Track API、 Application Cache API、User Interaction、 Data Transfer API、 Command API、 Constraint Validation API、 History API

8、HTML5的离线存储有哪些?

有以下离线存储localStorage,可长期存储数据,即浏览器关闭后数据不丢失session Storage,数据在浏览器关闭后自动删除,

9、HTML5的form如何关闭自动补全功能?

将不想要提示的frm元素下的 Input元素的 autocomplete属性设置为off

10、如何在HTML5页面中嵌入音频?

HTML5包含了嵌入音频文件的标准方式,支持的格式包括MP3、Wav和Ogg等,嵌入方式如下。

<audio controls><source src="icketang.mp3" type="audio/mpeg">Your browser does'nt support audio embedding feature.</audio>

11、如何在HTML5页面中嵌入视频?

和嵌入音频文件一样,HTML5定义了嵌入视频的标准方式,支持的格式包括MP4、WebM和Ogg等,嵌入方式如下。

< video width=”450” height=”340” contro1s><source src="icketang.mp4"  type="video/mp4">Your browser does'nt support video embedding feature.</video>

12、HTML5引入了哪些新的表单属性?

新增表单属性包括 datalist、 datetime、 output、 keygen、date、 month、week、time、 number、 range、 emailurl

13、如何显示我们自己画的一个弹框?

可以用一个简单的方法,在页面上单击一个按钮,弹出一个弹框,而弹框也是自己写的一个div。单击前,先把弹框隐藏, onclick事件发生之后就会显示出来

14、HTML5应用缓存和常规的HTML浏览器缓存有什么差别?

HTML5应用缓存*关键的就是支持离线应用,可获取少数或者全部网站内容,包括HTML、CSS、图像和 JavaScript脚本并存在本地。该特性提升了网站的性能,可通过如下方式实现。

<!doctype html><html manifest="example. appcache">......</html>

与传统的浏览器缓存比较,该特性并不强制要求用户访问网站。

15、为什么HTML5里面不需要DTD( Document Type Definition,文档类型定义)?如果不放入<!doctype html>标签,HTML5还会工作吗?

HTML5没有使用SGML或者 XHTML,它是一个全新的类型,因此不需要参考DTD。对于HTML5,仅须放置下面的文档类型代码,让浏览器识别HTML5文档。

如果不放入<!doctype html>标签,HTML5不会工作。浏览器将不能识别出它是HTML文档,同时HTML5的标签将不能正常工作。

16、哪些浏览器支持HTML5?

几乎所有的浏览器(如 Safari、 Chrome、 Firefox、 Opera、IE)都支持HTML5

17、本地存储和会话(事务)存储之间的区别是什么?

本地存储数据持续永久,但是会话存储在浏览器打开时有效,在浏览器关闭时会话重置存储数据。

18、HTML5中的应用缓存是什么?

HTML5应用缓存的*终目的是帮助用户离线浏览页面。换句话说,如果网络连接不可用,打开的页面就来自浏览器缓存,离线应用缓存可以帮助用户达到这个目的。

应用缓存可以帮助用户指定哪些文件需要缓存,哪些不需要

19、如果把HTML5看成一个开放平台,它的构建模块有哪些?

如果把HTML5看成一个开放平台,它的构建模块至少包括以下几个,如<nav><header><section><footer>。

≤nav>标签用来将具有导航性质的链接划分在一起,使代码结构在语义化方面更加准确

< header>标签用来定义文档的页眉。

< section>标签用来描述文档的结构。

< footer>标签用来定义页脚。在典型情况下,该元素会包含文档作者的姓名、文档的创作日期和联系信息

20、HTML5为什么只需要写<!doctype htm>?

HTML5不基于SGML,因此不需要对DTD进行引用,但是需要 DOCTYPE来规范浏览器的行为(让浏览器按照它们的方式来运行)。而HTM4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的类型。

21、HTML5应用程序缓存为应用带来什么优势?

应用程序缓存为应用带来3个优势。

(1)离线浏览,让用户可在应用离线时(网络不可用时)使用它们。

(2)速度,让已缓存资源加载得更快。

(3)减少服务器负载,让浏览器将只下载服务器更新过的资源。

22、与HTML4比较,HTML5废弃了哪些元素?

废弃的元素包括 frame、frameset、 noframe、 applet、big、 center和 basefont。

23、HTML5标准提供了哪些新的API?

HTML5提供很多新的AP1,包括 Media APl、 Text Track API、 Application Cache API、 User InteractionAPI、 Data Transfer API、 Command APl、 Constraintion Validation API和 History API

24、请你说一下 Web Worker和 WebSocket的作用。

Web Worker的作用如下:

(1)通过 worker= new Worker(url)加载一个 JavaScript文件,创建一个 Worker,同时返回一个 Worker实例

(2)用 worker.postMessage(data)向 Worker发送数据

(3)绑定 worker.onmessage接收 Worker发送过来的数据

(4)可以使用 worker.terminate()终止一个 Worker的执行。

WebSocket的作用如下。

它是Web应用程序的传输协议,提供了双向的、按序到达的数据流。它是HTML5新増的协议, WebSocket的连接是持久的,它在客户端和服务器之间保持双工连接,服务器的更新可以及时推送到客户端,而不需要客户端以一定的时间间隔去轮询。

25、如何实现浏览器内多个标签页之间的通信?

在标签页之间,调用 localstorge、 cookies等数据存储,可以实现标签页之间的通信

26、如何让 Websocket兼容低版本浏览器?

使用 Adobe Flash Socket、 ActiveX HTMLFile(E)、 multipart编码发送XHR

与长轮询发送XHR等,可以实现不支持 WebSocket API的浏览器对 Web Socket的兼容。

27、HTML5为浏览器提供了哪些数据存储方案?

在较高版本的浏览器中,提供了 sessionStorage:和 globalStorage。在HTML5规范中,用 localStorage取代 globalStorage 。

HTML5中的 Web Storage包括两种存储方式,分别是 sessionStorage和 localStorage。

sessionStorage用于在本地存储一个会话( session)中的数据,这些数据只有同一个会话中的页面才能访问,当会话结来后,数据也随之销毀。因此 sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。

localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。

localStorage和 sessionStorage都具有相同的操作方法,例如 setItem、 getItem和removeltem等

28、请描述一下 sessionStorage和 localStorage的区别。

sessionStorage用于在本地存储一个会话中的数据,这些数据只有同一个会话中的页面才能访问,当会话结束后,数据也随之销毀。因此 sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。

而 localstorage用于持久化本地存储,除非主动删除数据,否则数据是永远不会过期的。

29、localStorage和 cookie的区别是什么?

localStorage的概念和cookie相似,区别是 localStorage是为了更大容量的存储设计的。cookie的大小是受限的,并且每次请求一个新页面时, cookie都会被发送过去,这样无形中浪费了带宽。另外, cookie还需要指定作用域,不可以跨域调用。

除此之外, localStorage拥有 setlten, getItem、 removeltem、 clear等方法, cookie则需要前端开发者自己封装 setCookie和 get Cookie。但 cookie也是不可或缺的,因为 cookie的作用是与服务器进行交互,并且还是HTP规范的一部分,而 localStorage仅因为是为了在本地“存储”数据而已,无法跨浏览器使用。

30、请你谈谈 cookie的特点。

cookie虽然为持久保存客户端数据提供了方便,分担了服务器存储的负担,但是有以下局限性。

(1)每个特定的域名下*多生成20个 cookie。

(2)IE6或更低版本*多有20个 cookie。

(3)IE7和之后的版本*多可以有50个 cookie。

(4) Firefox*多可以有50个 cookie。

(5) Chrome和 Safari没有做硬性限制。

IE和 Opera会清理近期*少使用的 cookie, Firefox会随机清理 cookie。

cookie*大为4096字节,为了兼容性,一般不能超过4095字节。

IE提供了一种存储方式,可以让用户数据持久化,叫作 userdata,从IE5.0就开始支持此功能。每块数据*多128KB,每个域名下*多1MB。这个持久化数据放在缓存中,如果缓存没有被清理,就会一直存在。

优点如下:

(1)通过良好的编程,控制保存在 cookie中的 session对象的大小。

(2)通过加密和安全传输技术(SSL),降低 cookie被破解的可能性。

(3)只在 cookie中存放不敏感数据,即使被盗也不会有重大损失。

(4)控制 cookie的生命周期,使之不会永远有效。数据偷盗者很可能得到一个过期的 cookie。

缺点如下:

(1)“ cookie”的数量和长度有限制。每个 domain*多只能有20条 cookie,每个cookie的长度不能超过4KB,否则会被截掉。

(2)安全性问题。如果 cookie被别人拦截了,就可以取得所有的 session信息。即使加密也于事无补,因为拦截者并不需要知道 cookie的意义,他只要原样转发 cookie就可以达到目的。

(3)有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果把这个计数器保存在客户端,那么它起不到任何作用

31、cookie和 session的区别是什么?

区别如下:

(1) cookie数据存放在客户的浏览器上, session数据存放在服务器上。

(2) cookie不是很安全,别人可以分析存放在本地的 cookie并进行 cookie欺骗。考虑到安全问题应当使用 session。

(3) session会在一定时间内保存在服务器上。当访问增多时,会占用较多服务器的资源。为了减轻服务器的负担,应当使用 cookie。

(4)单个 cookie保存的数据不能超过4KB,很多浏览器都限制一个站点*多保存20个 cookie。

所以个人建议可以将登录信息等重要信息存放在 session中,其他信息(如果需要保留)可以存放在 cookie中。

32、什么是SVG?

SVG即可缩放失量图形( Scalable Vector Graphics)。它是基于文本的图形语言,使用文本、线条、点等来绘制图像,这使得它轻便、显示迅速。

33、Canvas和SvG的区别是什么?

两者的区别如下:

(1)一旦 Canvas绘制完成将不能访问像素或操作它;任何使用SVG绘制的形状都能被记忆和操作,可以被浏览器再次显示。

(2) Canvas对绘制动画和游戏非常有利;SVG对创建图形(如CAD)非常有利。

(3)因为不需要记住以后事情,所以 Canvas运行更快;因为为了之后的操作,SVG需要记录坐标,所以运行比较缓慢。

(4)在 Canvas中不能为绘制对象绑定相关事件;在SVG中可以为绘制对象绑定相关事件。

(5) Canvas绘制出的是位图,因此与分辨率有关;SvG绘制出的是矢量图,因此与分辨率无关。

34、如何使用 Canvas和HTML5中的SVG画一个矩形?

使用SVG绘制矩形的代码如下:

<svg xmlns=http://www.w3.org/2000/svg  version="1.1"><rect style="fill:rgb(255,100,0);"height=200"  width="400"></rect></svg>

使用 Canvas绘制矩形的代码如下。

<canvas id="myCanvas" width=500" height="500"></canvas>var canvas=document.getElementById('mycanvas');var ctx= canvas.getContext('2d'); ctx.rect(100,100,300,200);ctx fillstyle = 'pink 'ctx. fill()

35、本地存储的数据有生命周期吗?

本地存储的数据没有生命周期,它将一直存储数据,直到用户从浏览器清除或者使用 JavaScript代码移除。

36、HTML5中如何实现应用缓存?

首先,需要指定“ manifest”文件,” manifest”文件帮助你定义缓存如何工作以下是“ manifest”文件的结构。

CACHE MANTEEST # version 1.0/demo. css/demo. js/demo.png所有 manifest文件都以” CACHE MANIFEST"语句开始。#(散列标签)有助于提供缓存文件的版本。manifest文件的内容类型应是"text/ cache- manifest”。

创建一个缓存 manifest文件后,在HTML页面中提供 manifest链接,代码如下所示。

<html manifest=”icketang. appcache”>

*次运行以上文件时,它会添加到浏览器应用缓存中,在服务器宕机时,页面从应用缓存中获取数据。

37、如何刷新浏览器的应用缓存?

应用缓存通过变更“#”标签后的版本号来刷新,如下所示:

CACHE  MANIFEST # version 2.0/icketang.css/icketang.js/icketang. pngNETWORK: login. php

38、应用缓存中的回退是什么?

应用缓存中的回退会帮助你指定在服务器不可访问时,显示某文件。例如在下面的manifest文件中,如果用户输入了“/home”,同时服务器不可到达,“404htm”文件应送达。

FALLBACK:/home//404. html

39、应用缓存中网络命令的作用是什么?

网络命令描述不需要缓存的文件,例如以下代码中“ login.php”始终都不应该缓存或者离线访问。

NETWORK login. php

40、什么是 Websql?

Websql是一个在浏览器客户端的结构关系数据库,是浏览器内的本地 RDBMS(关系型数据库管理系统),可以使用SQL查询。

41、Websql是HTML5的一个规范吗?

不是,许多人把它标记为HTML5,但是它不是HTML5规范的一部分,这个规范是基于 SQLite的

42、HTML5如何实现跨域?

在服务器端设置允许在其他域名下访问,例如允许所有域名访问以下内容。

response.setHeader("Access-Control-Allow-Origin""*");response.setHeader ("Access-Control-Allow-Methods""POST");response.setHeader("Access-Control-Allow-Headers""x-requested-with, content-type");

本文完~