一、 JVM的生命周期

  1. JVM实例对应了一个独立运行的java程序它是进程级别
    a) 启动。启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点
    b) 运行。main()作为该程序初始线程的起点,任何其他线程均由该线程启动。JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM
    自己使用,java程序也可以标明自己创建的线程是守护线程
    c) 消亡。当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出
  2. JVM执行引擎实例则对应了属于用户运行程序的线程它是线程级别的

二、 JVM的体系结构

jvm体系结构

  1. 类装载器(ClassLoader)(用来装载.class文件)
  2. 执行引擎(执行字节码,或者执行本地方法)
  3. 运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈)

三、 JVM类加载器

JVM整个类加载过程的步骤:

  1. 装载
    装载过程负责找到二进制字节码并加载至JVM中,JVM通过类名、类所在的包名通过ClassLoader来完成类的加载,
    同样,也采用以上三个元素来标识一个被加载了的类:类名+包名+ClassLoader实例ID。
  2. 链接
    链接过程负责对二进制字节码的格式进行校验、初始化装载类中的静态变量以及解析类中调用的接口、类。
    完成校验后,JVM初始化类中的静态变量,并将其值赋为默认值。
    最后对类中的所有属性、方法进行验证,以确保其需要调用的属性、方法存在,以及具备应的权限(例如public、private域权限等),
    会造成NoSuchMethodError、NoSuchFieldError等错误信息。
  3. 初始化
    初始化过程即为执行类中的静态初始化代码、构造器代码以及静态属性的初始化,在四种情况下初始化过程会被触发执行:
    调用了new;
    反射调用了类中的方法;
    子类调用了初始化;
    JVM启动过程中指定的初始化类。

VM类加载顺序:
jvm加载顺序
JVM两种类装载器包括:启动类装载器和用户自定义类装载器。
启动类装载器是JVM实现的一部分;
用户自定义类装载器则是Java程序的一部分,必须是ClassLoader类的子类。
JVM装载顺序:
Jvm启动时,由Bootstrap向User-Defined方向加载类;
应用进行ClassLoader时,由User-Defined向Bootstrap方向查找并加载类;

  1. **Bootstrap ClassLoaderzh
    这是JVM的根ClassLoader,它是用C++实现的,JVM启动时初始化此ClassLoader,并由此ClassLoader完成$JAVA_HOME中jre/lib/rt.jar(Sun JDK的实现)
    中所有class文件的加载,这个jar中包含了java规范定义的所有接口以及实现。
  2. Extension ClassLoader
    JVM用此classloader来加载扩展功能的一些jar包。
  3. System ClassLoader
    JVM用此classloader来加载启动参数中指定的Classpath中的jar包以及目录,在Sun JDK中ClassLoader对应的类名为AppClassLoader。
  4. User-Defined ClassLoader
    User-DefinedClassLoader是Java开发人员继承ClassLoader抽象类自行实现的ClassLoader,基于自定义的ClassLoader可用于加载非Classpath中的jar以及目录。

ClassLoader抽象类的几个关键方法:
(1) loadClass
此方法负责加载指定名字的类,ClassLoader的实现方法为先从已经加载的类中寻找,如没有则继续从parent ClassLoader中寻找,
如仍然没找到,则从System ClassLoader中寻找,最后再调用findClass方法来寻找,如要改变类的加载顺序,则可覆盖此方法
(2) findLoadedClass
此方法负责从当前ClassLoader实例对象的缓存中寻找已加载的类,调用的为native的方法。
(3) findClass
此方法直接抛出ClassNotFoundException,因此需要通过覆盖loadClass或此方法来以自定义的方式加载相应的类。
(4) findSystemClass
此方法负责从System ClassLoader中寻找类,如未找到,则继续从Bootstrap ClassLoader中寻找,如仍然为找到,则返回null。
(5) defineClass
此方法负责将二进制的字节码转换为Class对象
(6) resolveClass
此方法负责完成Class对象的链接,如已链接过,则会直接返回。

四、 JVM执行引擎

在执行方法时JVM提供了四种指令来执行:
(1)invokestatic:调用类的static方法
(2)invokevirtual:调用对象实例的方法
(3)invokeinterface:将属性定义为接口来进行调用
(4)invokespecial:JVM对于初始化对象(Java构造器的方法为:)以及调用对象实例中的私有方法时。

主要的执行技术有:
解释,即时编译,自适应优化、芯片级直接执行
(1)解释属于第一代JVM,
(2)即时编译JIT属于第二代JVM,
(3)自适应优化(目前Sun的HotspotJVM采用这种技术)则吸取第一代JVM和第二代
JVM的经验,采用两者结合的方式
开始对所有的代码都采取解释执行的方式,并监视代码执行情况,然后对那些经常调用的方法启动一个后台线程,将其编译为本地代码,
并进行优化。若方法不再频繁使用,则取消编译过的代码,仍对其进行解释执行。

五、 JVM运行时数据区


第一块:PC寄存器
PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息。
第二块:JVM栈
JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址
第三块:堆(Heap)
它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。

(1) 堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的
(2) Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配
(3) TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。
第四块:方法区域(Method Area)
(1)在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。
(2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class
对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,
当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。
第五块:运行时常量池(Runtime Constant Pool)
存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。
第六块:本地方法堆栈(Native Method Stacks)
JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。

六、 JVM垃圾回收

GC的基本原理: 将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停
(1)对新生代的对象的收集称为minor GC;
(2)对旧生代的对象的收集称为Full GC;
(3)程序中主动调用System.gc()强制执行的GC为Full GC。
不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:
(1)强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)
(2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)
(3)弱引用:在GC时一定会被GC回收
(4)虚引用:由于虚引用只是用来得知对象是否被GC

分享到
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
servlet过滤器首先得在web.mxl配置maping

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!--一个时间的过滤器配置-->
<filter>
<filter-name>FilterDay</filter-name>
<filter-class>com.houpu.filter.FilterDay</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDay</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

#具体的filter实现
package com.houpu.filter;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

public class FilterDay extends HttpServlet implements Filter {

public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
arg0.setCharacterEncoding("utf-8");
Calendar instance = Calendar.getInstance();
int hours = instance.get(Calendar.HOUR_OF_DAY);
arg0.setAttribute("time", instance.get(Calendar.YEAR) + "年"
+ instance.get(Calendar.MONTH) + "月"
+ instance.get(Calendar.DAY_OF_MONTH) + "日"
+ instance.get(Calendar.HOUR_OF_DAY) + "时"
+ instance.get(Calendar.MINUTE) + "分");
System.out.println(hours);
if ((hours <= 24 && hours >= 19) || (hours >= 0 && hours <= 5)) {

//利用dispatcher跳转
arg0.getRequestDispatcher("black.jsp").forward(arg0, arg1);
System.out.println("晚上");
}
if (hours < 19 && hours >= 14) {
System.out.println("下午");
arg0.getRequestDispatcher("guoguo.jsp").forward(arg0, arg1);
// arg2.doFilter(arg0, arg1); 继续请求、
}
if (hours >= 6 && hours <= 12) {
arg0.getRequestDispatcher("day.jsp").forward(arg0, arg1);
System.out.println("上午");
}
if (hours > 12 && hours < 14) {
arg0.getRequestDispatcher("day.jsp").forward(arg0, arg1);
System.out.println("中午");
}
}
public void init(FilterConfig arg0) throws ServletException {

}

}
分享到
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
1、什么是Ognl?

OGNL(Object-Graphic Navigation Language),对象图道行语言。是一种可以方便操作对象属性的开源表达式语言。

2、特点?

a、支持对象的方法调用,形式,eg:objName.methodName();

b、支持静态类的方法调用和值访问,expression:@[类全名(包括包路径)]@[方法名|值名]
eg:@tutorial.MyConstant@App_NAME;

c、支持赋值操作和表达式串联,eg:price=100,discount=80,calculatePrice()//返回80???

d、访问OGNL上下文(OGNL context)和ActionContext

e、操作集合对象

3、使用OGNL表达式

1)“#”符号有三种用途

a、访问非根对象(struts中值栈为根对象),eg:OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:

名称 作用域
eg
parameters reques session application
#parameters.id[0]
#request.userName
#session.userName
#application.userName
b、用于过滤和投影

eg:books.{?#this.price>35}

c、用于构建Map集合

在页面上取一个Map的值:

eg:<s:property value="#myMap['foo1']"/>
2)“%”符号的用途是在标签的属性被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式
3)“$”符号有两种用途
在国际化资源文件中,引用OGNL表达式,在struts2配置文件中,引用OGNL表达式
<result type="redirect">listUser.action?msg=${msg}</result>
分享到
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<%@ page import="java.net.*,java.util.*,java.lang.*,java.io.*"%>
<%@ page contentType="text/xml;charset=utf-8"%>
<%
String url = null;
StringBuffer params = new StringBuffer();
Enumeration enu = request.getParameterNames();
int total = 0;
while (enu.hasMoreElements()) {
String paramName=(String)enu.nextElement();
if(paramName.equals("url")){
url=request.getParameter(paramName);
}else{
if(total==0){
params.append(paramName).append("=").append(URLEncoder.encode(request.getParameter(paramName), "UTF-8"));
} else {
params.append("&").append(paramName).append("=").append(URLEncoder.encode(request.getParameter(paramName), "UTF-8"));
}
++total;
}
}
//url = url + "?" + params.toString();

if(url != null){
URL connect = new URL(url.toString());
URLConnection connection = connect.openConnection();
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));
String line;
//StringBuilder json = new StringBuilder();
while((line = reader.readLine()) != null){
//json.append(line);
out.println(line);
}
//json.toString();
//System.out.println(json.toString());
//out.print(json.toString());
//创建于2017/3/26 希望以后写出其他代理方法
reader.close();
}
%>
分享到

高德地图web js版使用

高德地图web版使用

1
<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.3&key=5774e5d7879ad6affd51e5f8dffde51d"></script>

Marker点标记、
Polyline折线、
Polygon多边形、
Circle圆等。

1
2
3
4
5
6
var marker = new AMap.Marker({
position: [116.480983, 39.989628],//marker所在的位置
map:map//创建时直接赋予map属性
});
//也可以在创建完成后通过setMap方法执行地图对象
marker.setMap(map);

服务插件以及
工具插件,
比如工具条、
比例尺、
路线规划、
高级信息窗体等等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
AMap.plugin(['AMap.ToolBar','AMap.AdvancedInfoWindow'],function(){
//创建并添加工具条控件
var toolBar = new AMap.ToolBar();
map.addControl(toolBar);
//创建高级信息窗体并在指定位置打开
var infowindow = new AMap.AdvancedInfoWindow({
content: '<div class="info-title">高德地图</div><div class="info-content">'+
'<img src="http://webapi.amap.com/images/amap.jpg">'+
'高德是中国领先的数字地图内容、导航和位置服务解决方案提供商。<br>'+
'<a target="_blank" href="http://mobile.amap.com/">点击下载高德地图</a></div>',
offset: new AMap.Pixel(0, -30)
});
infowindow.open(map,[116.480983, 39.989628]);
})

类名 类功能说明
AMap.ToolBar 工具条,控制地图的缩放、平移等
AMap.Scale 比例尺,显示当前地图中心的比例尺
AMap.OverView 鹰眼,显示缩略图
AMap.MapType 图层切换,用于几个常用图层切换显示
AMap.Geolocation 定位,提供了获取用户当前准确位置、所在城市的方法
AMap.AdvancedInfoWindow 高级信息窗体,整合了周边搜索、路线规划功能
AMap.Autocomplete 输入提示,提供了根据关键字获得提示信息的功能
AMap.PlaceSearch 地点搜索服务,提供了关键字搜索、周边搜索、范围内搜索等功能
AMap.PlaceSearchLayer 搜索结果图层类,将搜索结果作为图层展示
AMap.DistrictSearch 行政区查询服务,提供了根据名称关键字、citycode、adcode来查询行政区信息的功能
AMap.LineSearch 公交路线服务,提供公交路线相关信息查询服务
AMap.StationSearch 公交站点查询服务,提供途经公交线路、站点位置等信息
AMap.Driving 驾车路线规划服务,提供按照起、终点进行驾车路线的功能
AMap.Transfer 公交路线规划服务,提供按照起、终点进行公交路线的功能
AMap.Walking 步行路线规划服务,提供按照起、终点进行步行路线的功能
AMap.Riding 骑行路线规划服务,提供按照起、终点进行骑行路线的功能
AMap.DragRoute 拖拽导航插件,可拖拽起终点、途经点重新进行路线规划
AMap.ArrivalRange 公交到达圈,根据起点坐标,时长计算公交出行是否可达及可达范围
AMap.Geocoder 地理编码与逆地理编码服务,提供地址与坐标间的相互转换
AMap.CitySearch 城市获取服务,获取用户所在城市信息或根据给定IP参数查询城市信息
AMap.IndoorMap 室内地图,用于在地图中显示室内地图
AMap.MouseTool 鼠标工具插件
AMap.CircleEditor 圆编辑插件
AMap.PolyEditor 折线、多边形编辑插件
AMap.MarkerClusterer 点聚合插件
AMap.RangingTool 测距插件,可以用距离或面积测量
AMap.CloudDataLayer 云图图层,用于展示云图信息
AMap.CloudDataSearch 云图搜索服务,根据关键字搜索云图点信息
AMap.Weather 天气预报插件,用于获取未来的天气信息
AMap.RoadInfoSearch 道路信息查询,已停止数据更新,反馈信息仅供参考
AMap.Hotspot 热点插件,地图热点已默认开启,不用手动添加,由Map的isHotspot属性替代
AMap.Heatmap 热力图插件

地图基础控件

1
2
3
4
5
6
7
8
9
10
11
12
13
14

var map = new AMap.Map('container',{
zoom: 10,
center: [116.39,39.9]
});

AMap.plugin(['AMap.ToolBar','AMap.Scale','AMap.OverView'],
function(){
map.addControl(new AMap.ToolBar());

map.addControl(new AMap.Scale());

map.addControl(new AMap.OverView({isOpen:true}));
});
名称 类名 简介
工具条 ToolBar 集成了缩放、平移、定位等功能按钮在内的组合控件
比例尺 Scale 展示地图在当前层级和纬度下的比例尺
定位 Geolocation 用来获取和展示用户主机所在的经纬度位置
鹰眼 OverView 在地图右下角显示地图的缩略图
类别切换 MapType 实现默认图层与卫星图、实施交通图层之间切换的控

定位

AMap.Geolocation 定位插件,整合了浏览器定位、精确IP定位、sdk辅助定位多种手段
Map.CitySearch 城市查询,IP定位获取当前城市信息

AMap.Geolocation 插件

官网demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mapObj = new AMap.Map('iCenter');
mapObj.plugin('AMap.Geolocation', function () {
geolocation = new AMap.Geolocation({
enableHighAccuracy: true,//是否使用高精度定位,默认:true
timeout: 10000, //超过10秒后停止定位,默认:无穷大
maximumAge: 0, //定位结果缓存0毫秒,默认:0
convert: true, //自动偏移坐标,偏移后的坐标为高德坐标,默认:true
showButton: true, //显示定位按钮,默认:true
buttonPosition: 'LB', //定位按钮停靠位置,默认:'LB',左下角
buttonOffset: new AMap.Pixel(10, 20),//定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
showMarker: true, //定位成功后在定位到的位置显示点标记,默认:true
showCircle: true, //定位成功后用圆圈表示定位精度范围,默认:true
panToLocation: true, //定位成功后将定位到的位置作为地图中心点,默认:true
zoomToAccuracy:true //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
});
mapObj.addControl(geolocation);
geolocation.getCurrentPosition();
AMap.event.addListener(geolocation, 'complete', onComplete);//返回定位信息
AMap.event.addListener(geolocation, 'error', onError); //返回定位出错信息
});

自己demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
mapObj = new AMap.Map('iCenter');
mapObj.plugin('AMap.Geolocation', function () {
geolocation = new AMap.Geolocation({
enableHighAccuracy: true,//是否使用高精度定位,默认:true
timeout: 10000, //超过10秒后停止定位,默认:无穷大
maximumAge: 0, //定位结果缓存0毫秒,默认:0
convert: true, //自动偏移坐标,偏移后的坐标为高德坐标,默认:true
showButton: true, //显示定位按钮,默认:true
buttonPosition: 'LB', //定位按钮停靠位置,默认:'LB',左下角
buttonOffset: new AMap.Pixel(10, 20),//定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
showMarker: true, //定位成功后在定位到的位置显示点标记,默认:true
showCircle: true, //定位成功后用圆圈表示定位精度范围,默认:true
panToLocation: true, //定位成功后将定位到的位置作为地图中心点,默认:true
zoomToAccuracy:true //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
});
mapObj.addControl(geolocation);
geolocation.getCurrentPosition();
AMap.event.addListener(geolocation, 'complete', onComplete);//返回定位信息
AMap.event.addListener(geolocation, 'error', onError); //返回定位出错信息
});
function onComplete(result){
console.log(result.formattedAddress); //定位成功获取地址信息
console.log(result.position); //定位成功获取定位结果
console.log(result.location_type); //定位结果的来源,可能的值有:'html5'、'ip'、'sdk'
}
function onError(error){

console.log(error.info);

console.log(error.message);
if('NOT_SUPPORTED'==error.info){
console.log('当前浏览器不支持定位功能 ');
}
if('FAILED'==error.info){
console.log('定位失败,失败原因可在message字段中获得。定位失败的原因');
}
}

GeolocationResult 对象

属性 类型 说明
position LngLat 定位结果
accuracy Number 精度范围,单位:米
location_type String 定位结果的来源,可能的值有:’html5’、’ip’、’sdk’
message String 形成当前定位结果的一些信息
isConverted Boolean 是否经过坐标纠偏
info String 状态信息 “SUCCESS”
addressComponent AddressComponent 地址信息,详情参考Geocoder
formattedAddress String 地址
pois Array 定位点附近的POI信息,extensions等于’base’的时候为空
roads Array 定位点附近的道路信息,extensions等于’base’的时候为空
crosses Array 定位点附近的道路交叉口信息,extensions等于’base’的时候为空

Geolocation的方法

isSupported( ) Boolean 是否支持浏览器定位,当不支持是getCurrentPosition也会使用尝试进行精确IP定位
getCurrentPosition(callback:function(status,result){}) 获取用户当前的精确位置信息
当回调函数中的status为complete的时候表示定位成功,result为GeolocationResult对象;
当回调函数中的status为error的时候表示定位失败,result为GeolocationError对象; callback的方式和事件监听的方式二者选择一种即可。
watchPosition( ) Number 使用浏览器定位接口监控当前位置,移动端有效。在监控过程中,每隔一段时间会自动调用定位成功或失败的回调函数。
注:由于时间间隔受浏览器限制,如您想自定义时间间隔,建议您使用定时器,每隔一段时间调用一次getCurrentPosition获取当前位置。
clearWatch(watchId:Number) Number 取消对当前位置的监控
getCityInfo(callback:function(status,result){}) 进行IP城市查询
status为complete的时候表示查询成功,result包含省、市、adcode、citycode、城市中心点center等信息;
status为error的时候表示查询失败

分享到

web前端基础知识备忘录

关于前端一些html css js 基础相关知识

CSS/CSS3长度、时间、频率、角度

一、CSS长度值

em 相对于父元素的字体大小
ex 相对于小写字母”x”的高度
gd 一般用在东亚字体排版上,这个与英文并无关系
rem 相对于根元素字体大小
vw 相对于视窗的宽度:视窗宽度是100vw
vh 相对于视窗的高度:视窗高度是100vh
vm 相对于视窗的宽度或高度,取决于哪个更小
ch 相对于0尺寸
px 相对于屏幕分辨率而不是视窗大小:通常为1个点或1/72英寸
in inch, 表英寸
cm centimeter, 表厘米
mm millimeter, 表毫米
pt 1/72英寸
pc 12点活字,或1/12点
% 相对于父元素。正常情况下是通过属性定义自身或其他元素

二、时间、频率、角度

deg degrees, 角度
grad grads, 百分度
rad radians, 弧度
turn turns, 圈数
ms milliseconds, 毫秒数
s seconds, 秒数
Hz Hertz, 赫兹
kHz kilohertz, 千赫

动态高度

1
min-height:calc(100vh + 51px);

导入自定义字体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*定义字体*/
@font-face{

font-family: matos;/* family name*/
src:url(fonts/glyphicons.woff), /*网页标准字体*/
url(fonts/glyphicons.ttf), /*apple 和ms 共同推出的字体格式*/
url(fonts/glyphicons.eot), /* 支持老版本ie字体*/
url(fonts/glyphicons.svg), /* 可变矢量图字体 scalable vector graphics*/
}

/* 使用字体*/
p{
font-family:matos;
}

分享到

web前端编码规范

前段编码规范

一般规范

1.减号(-)是用来分隔文件名
2.不指定协议使得 URL 从绝对的获取路径转变为相对的
3.文本缩进 一次缩进两个空格。
4.注释 每个方法 重要变量都应该有注释 使用yuidoc.js
5.代码检查

html规范

1.推荐使用 HTML5 的文档类型申明: <!DOCTYPE html>
2.HTML 验证 使用能通过标准规范验证的 HTML 代码
3.脚本加载 js 防止dom阻塞 并且适当加上async 属性
4.用语义化的标签 方便阅读
5.多媒体回溯 使用alt元素方便解释
6.关注点分离 严格地保证结构、表现、行为三者分离,并尽量使三者之间没有太多的交互和联系。
不使用超过一到两张样式表(i.e. main.css, vendor.css)
不使用超过一到两个脚本(学会用合并脚本)
不使用行内样式(
不在元素上使用 style 属性(



不使用行内脚本(
不使用表象元素(i.e. , ,
, ,
不使用表象 class 名(i.e. red, left, center)
7.Tab Index 在可用性上的运用

#javascript规范
1.全局命名空间污染与 IIFE
2.IIFE(立即执行的函数表达式)
3.使用严格模式
4.变量声明 var
5.理解 JavaScript 的定义域和定义域提升
6.总是使用带类型判断的比较判断 总是使用 === 精确的比较操作符
7.明智地使用真假判断
8.变量赋值时的逻辑操作
9.一定要加分号
10.嵌套函数
11.语句块内的函数声明
12.异常
13.简易的原型继承
14.使用闭包
15.切勿在循环中创建函数
16.eval 函数(魔鬼)
17.this 关键字 使用场景:在构造函数中 在对象的方法中(包括由此创建出的闭包内)
18.首选函数式风格
19.数组和对象的属性迭代
20.不要使用 switch
21.数组和对象字面量
22修改内建对象的原型链,应当也要避免。
23.自定义 toString() 方法
24.字符串 统一使用单引号(‘),不使用双引号(“)。
25.三元条件判断(if 的快捷方法)

#CSS and Sass (SCSS) style rules
1.ID and class naming
2.合理的避免使用ID ID不应该被应用于样式 你应该始终考虑使用class
3.CSS选择器中避免标签名 构建选择器时应该使用清晰, 准确和有语义的class(类)名
4.尽可能的精确
5.尽量使用缩写属性
6.省略“0”值后面的单位。不要在0值后面使用单位,除非有值。
7.十六进制表示法 3个字符的十六进制表示法更简短。 始终使用小写的十六进制数字。
8.ID 和 Class(类) 名的分隔符 使用连字符(中划线)分隔ID和Class(类)名中的单词。为了增强课理解性,在选择器中不要使用除了连字符(中划线)以为的任何字符(包括没有)来连接单词和缩写。
9.声明顺序
结构性属性:
1.display
2.position, left, top, right etc.
3.overflow, float, clear etc.
4.margin, padding
表现性属性:
1.background, border etc.
2.font, text
10.声明结束 为了保证一致性和可扩展性,每个声明应该用分号结束,每个声明换行。
11.属性名结束 属性名的冒号后使用一个空格。出于一致性的原因, 属性和值(但属性和冒号之间没有空格)的之间始终使用一个空格。
12.选择器和声明分离 每个选择器和属性声明总是使用新的一行。
13.规则分隔 规则之间始终有一个空行(双换行符)分隔。
14.CSS引号 属性选择器或属性值用双引号(””),而不是单引号(”)括起来。 URI值(url())不要使用引号。
15.选择器嵌套 (SCSS) 嵌套所有的选择器,但尽量避免嵌套没有任何内容的选择器。
16.嵌套中引入 空行 (SCSS) 嵌套选择器和CSS属性之间空一行。
17.上下文媒体查询(SCSS)
在Sass中,当你嵌套你的选择器时也可以使用上下文媒体查询。
在Sass中,你可以在任何给定的嵌套层次中使用媒体查询。
由此生成的CSS将被转换,这样的媒体查询将包裹选择器的形式呈现。
18.嵌套顺序和父级选择器(SCSS)
当前选择器的样式属性
父级选择器的伪类选择器 (:first-letter, :hover, :active etc)
伪类元素 (:before and :after)
父级选择器的声明样式 (.selected, .active, .enlarged etc.)
用Sass的上下文媒体查询
子选择器作为最后的部分

分享到

web前端 ajax加载其他页面方法

html异步加载静态页面

  1. jquery方法

#load方法:
定义一个函数 等待调用

1
2
3
4
5
<script>
function jump() {
var s=$("#mainBody").load("tempDemo.html", function(data) { $("#mainBody").show(100); $("#mainBody").html(data);});
}
</script>

其中参数tempDemo.html是需要加载的文件
#mainBody是接收的div显示的层
show方法可要可不要

#ajax方法

1
2
3
4
5
6
7
8
9
10
11
12
function jump() {
$.ajax({
url: 'tempDemo.html',
type: 'get',
dataType: 'html',
data: parames,
error: function() { alert('error'); },
success: function(data) {
$("#mainBody").html(data);
}
});
}

分享到

h5学习笔记

##web视频
1.Ogg = 带有 Theora 视频编码和 Vorbis 音频编码的 Ogg 文件
2.MPEG4 = 带有 H.264 视频编码和 AAC 音频编码的 MPEG 4 文件
3.WebM = 带有 VP8 视频编码和 Vorbis 音频编码的 WebM 文件

###添加视频标签

1
2
3
4
5
<video width="320" height="240" controls="controls">
<source src="movie.ogg" type="video/ogg">
<source src="movie.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>

###视频属性
autoplay autoplay 如果出现该属性,则视频在就绪后马上播放。
controls controls 如果出现该属性,则向用户显示控件,比如播放按钮。
height pixels 设置视频播放器的高度。
loop loop 如果出现该属性,则当媒介文件完成播放后再次开始播放。
preload preload 如果出现该属性,则视频在页面加载时进行加载,并预备播放。
如果使用 “autoplay”,则忽略该属性。
src url 要播放的视频的 URL。
width pixels 设置视频播放器的宽度。

###video方法属性
方法 属性 事件
play() currentSrc play
pause() currentTime pause
load() videoWidth progress
canPlayType videoHeight error
duration timeupdate
ended ended
error abort
paused empty
muted emptied
seeking waiting
volume loadedmetadata
height
width

##web音频

###实例
1
2
3
4
5
<audio controls="controls">
<source src="song.ogg" type="audio/ogg">
<source src="song.mp3" type="audio/mpeg">
Your browser does not support the audio tag.
</audio>

##audio 标签属性
属性 值 描述
autoplay autoplay 如果出现该属性,则音频在就绪后马上播放。
controls controls 如果出现该属性,则向用户显示控件,比如播放按钮。
loop loop 如果出现该属性,则每当音频结束时重新开始播放。
preload preload
如果出现该属性,则音频在页面加载时进行加载,并预备播放。
如果使用 “autoplay”,则忽略该属性。
src url 要播放的音频的 URL。

###实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
function allowDrop(ev)
{
ev.preventDefault(); //来避免浏览器对数据的默认处理(drop 事件的默认行为是以链接形式打开)
}

function drag(ev) //
{
ev.dataTransfer.setData("Text",ev.target.id); //设置拖拽的数据
}

function drop(ev) //当放置被拖数据时,会发生 drop 事件。
{
调用 preventDefault() {
ev.preventDefault(); // //来避免浏览器对数据的默认处理(drop 事件的默认行为是以链接形式打开)
var data=ev.dataTransfer.getData("Text"); //方法获得被拖的数据。该方法将返回在 setData() 方法中设置为相同类型的任何数据。
ev.target.appendChild(document.getElementById(data)); //把被拖元素追加到放置元素(目标元素)中
}
</script>
</head>
<body>

<div id="div1" ondrop="drop(event)" <!-- 进行放置 - ondrop 当放置被拖数据时,会发生 drop 事件。-->
ondragover="allowDrop(event)"></div> <!-- 目标div块 放到何处 - ondragover-->
<img id="drag1" src="img_logo.gif" draggable="true" <!-- 设置元素为可拖放-->
ondragstart="drag(event)" width="336" height="69" /><!-- 拖动什么 - ondragstart 和 setData()-->
</body>
</html>

##canvas 画布

##实例 --渐变
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
	
<canvas id="myCanvas" width="200" height="100" style="border:1px solid #c3c3c3;">
Your browser does not support the canvas element.
</canvas>
<script type="text/javascript">
//画线
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
cxt.moveTo(10,10); //第一个点
cxt.lineTo(150,50); //第二个点
cxt.lineTo(10,50); //第三个点
cxt.stroke(); //结束
//画圆
/*
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
cxt.fillStyle="#FF0000"; //颜色
cxt.beginPath(); //开始
cxt.arc(70,18,15,0,Math.PI*2,true);
cxt.closePath(); //结束
cxt.fill(); //画
*/
//画渐变
/*
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
var grd=cxt.createLinearGradient(0,0,175,50);
grd.addColorStop(0,"#FF0000");
grd.addColorStop(1,"#00FF00");
cxt.fillStyle=grd;
cxt.fillRect(0,0,175,50);
*/
//将图片放到画布上
/*
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");
var img=new Image()
//img.src="flower.png"
cxt.drawImage(img,0,0);
*/

</script>

##内联svg

###概况
    SVG 指可伸缩矢量图形 (Scalable Vector Graphics)
### 实例
    
1
2
3
4
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="190">
<polygon points="100,10 40,180 190,60 10,60 160,180"
style="fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;" />
</svg>
详细请看svg教程

##使用地理位置

###实例
<p id="demo">点击这个按钮,获得您的坐标:</p>
        <div id="mapholder"></div>
        <button onclick="getLocation()">试一下</button>
        <script>
            var x=document.getElementById("demo");
            function getLocation()
              {
              if (navigator.geolocation)
                {
                /* 如果getCurrentPosition()运行成功,则向参数showPosition中规定的函数返回一个coordinates对象*/
                navigator.geolocation.getCurrentPosition(showPosition);  //返回数据 
                //navigator.geolocation.watchPosition(showPosition);  // 返回用户的当前位置,并继续返回用户移动时的更新位置(就像汽车上的 GPS)。
                //....clearWatch() - 停止 watchPosition() 方法
                }
              else{x.innerHTML="Geolocation is not supported by this browser.";}
              }
            function showPosition(position)
              {
              x.innerHTML="Latitude: " + position.coords.latitude +
              "<br />Longitude: " + position.coords.longitude;

              //在google地图上显示位置
              var latlon=position.coords.latitude+","+position.coords.longitude;
              var img_url="http://maps.googleapis.com/maps/api/staticmap?center="
              +latlon+"&zoom=14&size=400x300&sensor=false";  //google地图变成图片api 需要翻墙才能使用
              console.log(img_url);
              document.getElementById("mapholder").innerHTML="<img src='"+img_url+"' />";
              }
            function showError(error)
              {
              switch(error.code) 
                {
                case error.PERMISSION_DENIED:  //Permission denied - 用户不允许地理定位
                  x.innerHTML="User denied the request for Geolocation."
                  break;
                case error.POSITION_UNAVAILABLE:  //Position unavailable - 无法获取当前位置
                  x.innerHTML="Location information is unavailable."
                  break;
                case error.TIMEOUT:  //Timeout - 操作超时
                  x.innerHTML="The request to get user location timed out."
                  break;
                case error.UNKNOWN_ERROR:
                  x.innerHTML="An unknown error occurred."
                  break;
                }
              }
        </script>

### getCurrentPosition() 方法 - 返回数据

属性                描述
coords.latitude    十进制数的纬度
coords.longitude    十进制数的经度
coords.accuracy     位置精度
coords.altitude     海拔,海平面以上以米计
coords.altitudeAccuracy    位置的海拔精度
coords.heading    方向,从正北开始以度计
coords.speed    速度,以米/每秒计
timestamp    响应的日期/时间

##web存储

###类别
    localStorage - 没有时间限制的数据存储
    sessionStorage - 针对一个 session 的数据
####实例
        //localStorage的使用
        
1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript"> 	
if (localStorage.pagecount) //存储访问网站的次数
{
localStorage.pagecount=Number(localStorage.pagecount) +1;
}
else
{
localStorage.pagecount=1;
}
document.write("Visits "+ localStorage.pagecount + " time(s).");
</script>
//sessionStorage的使用 在当前 session 中访问页面的次数进行计数
1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">
if (sessionStorage.pagecount)
{
sessionStorage.pagecount=Number(sessionStorage.pagecount) +1;
}
else
{
sessionStorage.pagecount=1;
}
document.write("Visits "+sessionStorage.pagecount+" time(s) this session.");
</script>

##Application Cache 应用缓存

##要点
1.html文件中标签  必须包含manifest属性
    
1
2
3
4
<!DOCTYPE HTML>
<html manifest="demo.appcache">
...
</html>
2.还需要像demo.appcache的 manifest 文件 并且文件分三部分 CACHE MANIFEST NETWORK FALLBAK 如下:
1
2
3
4
5
6
7
8
9
10
11
CACHE MANIFEST   //这个是必须的  并且一下三个文件会被离线下载
# 2012-02-21 v1.0.0
/theme.css
/logo.gif
/main.js

NETWORK: //永远不会被缓存
login.asp

FALLBACK: //无法建立因特网连接 用404.html 代替/html5/目录下的所有文件
/html5/ /404.html

##Web Worker 即后台运行的javascript

###实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!DOCTYPE html>
<html>
<body>
<p>Count numbers: <output id="result"></output></p>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<br /><br />
<script>
var w;
function startWorker()
{
if(typeof(Worker)!=="undefined") //判断浏览器是否支持web worker
{
if(typeof(w)=="undefined")
{
w=new Worker("demo_workers.js"); //创建 Web Worker 对象 运行demo_workers.js文件
}
w.onmessage = function (event) { //向 web worker 添加一个 "onmessage" 事件监听器
document.getElementById("result").innerHTML=event.data; //当 web worker 传递消息时,会执行事件监听器中的代码。
}; //event.data 中存有来自 event.data 的数据。
}
else
{
document.getElementById("result").innerHTML="Sorry, your browser
does not support Web Workers...";
}
}

function stopWorker()
{
w.terminate(); //终止 web worker,并释放浏览器/计算机资源,使用 terminate() 方法
}
</script>
</body>
</html>
###由于 web worker 位于外部文件中,它们无法访问下例 JavaScript 对象:window 对象 document 对象 parent 对象

##Server-Sent 向服务器发送事件 —单向消息传递

###接收 Server-Sent 事件通知
1
2
3
4
5
var source=new EventSource("demo_sse.php");   //EventSource用于接收服务器发来的通知
source.onmessage=function(event)
{
document.getElementById("result").innerHTML+=event.data + "<br />";
};
###服务器端 代码实例 ###PHP 代码 (demo_sse.php):
1
2
3
4
5
6
7
8
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

$time = date('r');
echo "data: The server time is: {$time}\n\n";
flush();
?>
###注解:"Content-Type" 报头设置为 "text/event-stream" 这个是最主要的向客户端发送事件流

##表单

##输入类型
    email  
    url
    number
    range            //range 类型用于应该包含一定范围内数字值的输入域。range 类型显示为滑动条。
    Date pickers (date, month, week, time, datetime, datetime-local)
    search   类型用于搜索域,比如站点搜索或 Google 搜索。search 域显示为常规的文本域。
    color 
##表单元素
    datalist        //元素规定输入域的选项列表。 列表是通过 datalist 内的 option 元素创建的
    keygen            //提供一种验证用户的可靠方法
    output            //元素用于不同类型的输出
    ####datalist
        
1
2
3
4
5
6
Webpage: <input type="url" list="url_list" name="link" />
<datalist id="url_list">
<option label="W3School" value="http://www.W3School.com.cn" />
<option label="Google" value="http://www.google.com" />
<option label="Microsoft" value="http://www.microsoft.com" />
</datalist>
####keygen
1
2
3
4
5
<form action="demo_form.asp" method="get">
Username: <input type="text" name="usr_name" />
Encryption: <keygen name="security" />
<input type="submit" />
</form>
##表单属性 #####from属性 autocomplete novalidate #####input属性 autocomplete autofocus //自动获取焦点 form form overrides (formaction, formenctype, formmethod, formnovalidate, formtarget) height 和 width list min, max 和 step multiple //属性规定输入域中可选择多个值。 pattern (regexp) //模式(pattern) 是正则表达式 placeholder //属性提供一种提示(hint),描述输入域所期待的值 required ###实例
1
2
3
4
5
6
7
<form action="demo_form.asp" method="get" autocomplete="on">
First name: <input type="text" name="fname" autofocus="autofocus" /><br />
Last name: <input type="text" name="lname" /><br />
E-mail: <input type="email" name="email" autocomplete="off" /><br />
<input type="submit" formaction="demo_admin.asp" value="Submit as admin" /><!--formaction - 重写表单的 action 属性-->
<input type="submit" />
</form>
formaction - 重写表单的 action 属性 formenctype - 重写表单的 enctype 属性 formmethod - 重写表单的 method 属性 formnovalidate - 重写表单的 novalidate 属性 formtarget - 重写表单的 target 属性 #####pattern实例
1
Country code: <input type="text" name="country_code" pattern="[A-z]{3}" title="Three letter country code" />
分享到

google代码追踪标签管理器

tag manager

放入头部

1
2
3
4
5
6
7
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-N56SN5T');</script>
<!-- End Google Tag Manager -->

放入body尾部

1
2
3
4
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-N56SN5T"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->

ga

跟踪 ID:UA-104393124-1

1
2
3
4
5
6
7
8
9
10
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-104393124-1', 'auto');
ga('send', 'pageview');

</script>

百度上非阻塞方式ga

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<script>
var gaJsHost = (("https:" == document.location.protocol)?"https://ssl." : "http://www.");
var head = document.getElementsByTagName("head")[0] || document.documentElement;
var script = document.createElement("script");
script.src = gaJsHost + "google-analytics.com/ga.js";
var done = false; // 防止onload,onreadystatechange同时执行
// 加载完毕后执行,适应所有浏览器
script.onload = script.onreadystatechange = function() {
if (!done && (!this.readyState ||
this.readyState === "loaded" ||
this.readyState === "complete")){
done = true;
try {
var pageTracker = _gat._getTracker("UA-104393124-1");
pageTracker._trackPageview();
} catch(err) {}
script.onload = script.onreadystatechange = null;
}
};
head.insertBefore(script,head.firstChild);
</script>
分享到