首页
好物推荐
薅羊毛领红包
好看壁纸
更多
隐私政策
友情链接
时光机
搜索
1
使用 docker 快速安装 Home Assistant
6,125 阅读
2
Ipad mini2 降级到IOS10.3.3系统
4,121 阅读
3
Home Assistant集成OpenWrt
3,553 阅读
4
华为手机开启ADB进行WIFI远程调试
3,487 阅读
5
小米电视开机广告和乐播投屏广告Hosts屏蔽列表
3,291 阅读
无分类
智能家居
心得随想
文档教程
登录
Search
标签搜索
Linux
JS
教程
CSS
HTML
配置
NodeJS
Docker
解决方案
文档
Git
Java
技术培训
Hadoop
Mac
Windows
RiotJS
Python
VPS
Home Assistant
DONG HAO
累计撰写
154
篇文章
累计收到
59
条评论
首页
栏目
无分类
智能家居
心得随想
文档教程
页面
好物推荐
薅羊毛领红包
好看壁纸
隐私政策
友情链接
时光机
搜索到
31
篇与
教程
的结果
2017-06-07
Angularjs1 pass on the parameters by url, not ui-self.
Currently, if you are using angularjs router, and use ui-self to link your destination page in html, and you can pass on the parmaters by ui-self. However, if right click and 'open link in new tab', the parameters in ui-self will be missing, and it can't pass on. what we can do?first let's browse a code: 1. file 1: audience.js$stateProvider.state('audiencesCreate', { url: '/audience/create-audience', params: {folder: null, type: null}, templateUrl: 'templates/audiences/audiences.create.html' }); file 2: checkout.html<div class="col-md-12"> <ul> <li ng-if="audiencePermission.digital"> <a ui-sref="audiencesCreate({type:'digital'})">Start a New Digital Audience</a> </li> <li ng-if="audiencePermission.tv"> <a ui-sref="audiencesCreate({type:'tv'})">Start a New TV Audience</a> </li> <li ng-if="audiencePermission.firstParty"> <a ui-sref="audiencesUpload">Start a New Upload (Audience Onboard)</a> </li> <li> <a ng-click="open(audienceID)">View this Distribution</a> </li> <li> <a href ui-sref="audiencesSaved">Browse Saved Audiences</a> </li> </ul> </div> Question: It can't open link in new tab. Solution: change js code for url with add '?parameter' The only difference is now we have the parmeter in url when open digital or tv.$stateProvider.state('audiencesCreate', { url: '/audience/create-audience?type?folder', params: {folder: null, type: null}, templateUrl: 'templates/audiences/audiences.create.html' });
2017年06月07日
113 阅读
0 评论
0 点赞
2017-05-31
riot.js入门--项目脚手架
今天我们开始正式进入riot.js项目开发实战html脚手架<!DOCTYPE html> <html lang="zh-cn"> <head> <title>DSDC前端框架</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="renderer" content="webkit"> <meta http-equiv="pragma" content="no-cache" /> <meta name="viewport" content="user-scalable=0, width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <link rel="shortcut icon" type="image/x-icon" href="/static/img/favicon.ico"> <link rel="stylesheet" type="text/css" href="/static/css/app.css?version={{ think.config('version') }}"/> </head> <body> <app-main></app-main> <script type="text/javascript" src="/static/lib/easyui/jquery.min.js"></script> <script type="text/javascript" src="/static/lib/riot/riot.compiler.min.js"></script> <script type="text/javascript" src="/static/js/app.js?version={{ think.config('version') }}"></script> <script type="riot/tag" src="/static/tag/app-main.tag?version={{ think.config('version') }}"></script> </body> </html> app.js/** 防止this污染 **/ var tag = this; /** jquery观察者 **/ (function ($) { var o = $({}); //自定义事件对象 $.each({ trigger: 'publish', on: 'subscribe', off: 'unsubscribe' }, function (key, val) { jQuery[val] = function () { o[key].apply(o, arguments); }; }); })(jQuery); $(function () { /** riot 全局混合函数 **/ riot.mixin({ /** riot 观察者 **/ observable: riot.observable(), /** mixin的其它方法... **/ extend: function (des, src, override) { if (src instanceof Array) { for (var i = 0, len = src.length; i < len; i++) this.extend(des, src[i], override); } for (var i in src) { if (override || !(i in des)) { des[i] = src[i]; } } return des; }, isEmptyObject: function (e) { var t; for (t in e) return !1; return !0 } }); /** 挂载app-main.tag **/ riot.mount('app-main'); /** jquery的观察者使用 **/ $.subscribe('toastr:show', function (e, arg = { type: 'success', title: '', message: '' }) { toastr[arg.type](arg.message, arg.title, { progressBar: true, closeButton: true }); }); $.publish('toastr:show', { type: 'success', title: '提醒', message: '系统升级成功!' }); /** riot的观察者使用 **/ tag.observable.on('metadata:table:reload', function () { $(tag.refs.metadataList).datagrid('reload'); }); tag.observable.trigger('metadata:table:reload'); }); metadata-list.tag<metadata-list> <table ref="metadataList"></table> <div ref="metadataListButtons"> <table> <tr> <td> <input ref="searchBox" name="searchMetadata"></input> </td> <td> <a ref="addButton">添加</a> </td> <td> <a ref="updateButton">更新</a> </td> <td> <a ref="deleteButton">删除</a> </td> </tr> </table> </div> <metadata-add if={show == 'add'}></metadata-add> <metadata-update if={show == 'update'}></metadata-update> <script> var tag = this; tag.on('before-mount', function(){ //挂载 add.tag riot.compile('/static/tag/metadata/add.tag', function() { riot.mount('metadata-add'); }); riot.compile('/static/tag/metadata/update.tag', function() { riot.mount('metadata-update'); }); //注册 metadata:table:reload 观察者事件 tag.observable.on('metadata:table:reload',function(){ $(tag.refs.metadataList).datagrid('reload'); }); }); tag.on('mount', function() { //$.parser.parse(tag.root); $(tag.refs.addButton).linkbutton({ iconCls: 'fa fa-plus icon', plain:true, onClick: function(){ tag.show = 'add'; tag.update(); } }); $(tag.refs.updateButton).linkbutton({ iconCls: 'fa fa-edit icon', plain:true, disabled:true, onClick: function(){ tag.show = 'update'; tag.update(); } }); $(tag.refs.deleteButton).linkbutton({ iconCls: 'fa fa-remove icon', plain:true, disabled:true, onClick: function(){ $.ajax({ type: 'POST', url: '/base/fetch', contentType: "application/json", dataType: "json", data: JSON.stringify({ '_url': '/metadata/source/delete', '_withtoken': true, 'ids': [tag.selectRow.id] }), success: function(res) { tag.observable.trigger('metadata:table:reload'); } }); } }); $(tag.refs.searchBox).searchbox({ searcher:function(value, name){ alert(value + "," + name) }, prompt:'搜索' }); $(tag.refs.metadataList).datagrid({ url: '/base/fetch', queryParams: { '_url': '/metadata/source/list', '_withtoken': true }, columns: [ [{ field: 'id', title: 'id', hidden: true }, { field: 'name', title: '系统名称', width:300 }, { field: 'code', title: '系统代码', width:200 }, { field: 'createdate', title: '创建日期', width:200 }, { field: 'mtddesc', title: '备注', width:400 }] ], fitColumns: true, fit:true, border: false, singleSelect:true, pageSize: 20, pageList: [20, 40, 60], pagination: true, pagePosition: 'top', loadFilter: function(data) { return data.result; }, onClickRow:function(index,row){ $(tag.refs.updateButton).linkbutton('enable'); $(tag.refs.deleteButton).linkbutton('enable'); tag.selectRow = row; }, onLoadSuccess:function(data){ $(tag.refs.updateButton).linkbutton('disable'); $(tag.refs.deleteButton).linkbutton('disable'); } }); $(tag.refs.metadataList).datagrid('getPager').pagination({ displayMsg: '位置: {from} 到 {to} 行,共计 {total} 项', //layout: ['list', 'sep', 'first', 'prev', 'sep', 'links', 'sep', 'next', 'last', 'sep', 'refresh'], buttons: $(tag.refs.metadataListButtons) }); }); </script> <style> :scope{ display: block; position: relative; height: 100%; } </style> </metadata-list>
2017年05月31日
173 阅读
0 评论
0 点赞
2017-05-31
riot.js入门--为什么选择riot
1、自定义标签它允许所有浏览器【>ie8】,使用自定义标签,<=ie8的浏览器,可使用html5shiv.js或其它方法,使用riot.js<todo> <!-- 布局 --> <h1>{ opts.title }</h1> <ul> <li each={ value, index in list }> {index}: {value} </li> </ul> <form onsubmit={ add }> <input> <button>Add #{ items.length + 1 }</button> </form> <!-- ui逻辑,可以放在这 --> <script> this.list = []; this.title = opts.title || "标题"; add(e) { var input = e.target[0] this.items.push(input.value) input.value = '' } </script> </todo> 一个自定义标签,把脚本也html结构关联到一起,形成一个可重用的组件。2、可读性更强自定义标签,让你更简单的使用html,构建更复杂的views。你的应用,使用自定义标签后,看起来,就会像这样子:<body> <h1>欢迎学习riot.js</h1> <article-header></article-header> <article-content> <part1></part1> <part2></part2> </article-content> <article-footer></article-footer> <script> riot.mount('*', { api: forum_api }); </script> </body> 用自定义标签划分板块,结构会更加的清晰易懂,每个板块只管管好自己的逻辑,并不担心因板块太多,而显得混乱。3、虚拟dom 尽可能减少DOM重绘和回流的次数 单向的数据传输: update或unmount都是从 父亲->孩子 预编译和缓存表达式,解析更加高效 更多可控的事件 可用于服务器端 4、更加接近标准 没有独立的监听属性的系统【没额外的消耗】 事件对IE8友好 能很好的跟其它工具合作 没有额外的属性前缀 【不需要 data-xx 或 ng-xx】 jQuery友好 5、使用你自己喜欢的工具编译 能用coffeescript、jade、typescript、es6或任意的预处理器创建标签 整合到npm, commonjs, amd, bower和component 有gulp,grunt, browserfiy插件 特性1、友好的语法尽可能简单,但高效强大的语法,是它设计的初衷之一。 强大的属性缩写: class={enable: true, hidden: false} 不需要额外的手动绑定,像render,state,constructor等 可插值使用: Add #{items.length + 1} 或 class=”item {selectd: true}” 逻辑代码,可不放在script标签内 可使用【部分】es6方法声明 2、更短的学习曲线只有很少的API,常用的,就mount/unmount, route, on/trigger, observable3、体积小,但功能强大除了mvp常用功能外,还有路由,事件监听等强大的板块,几乎能满足日常的站点开发。4、零依赖而且不依赖其它类库,能独立运行。5、低耦合独立组件,随时可以插拔使用部分转载来源:da宗熊专栏 -- 初识riot.js
2017年05月31日
256 阅读
0 评论
0 点赞
2017-05-31
riot.js入门--简介
Web Componnets(网页组件化) Web Component 是标准,所以会是组件技术的最终方向。最终互联网上将全部是这种标准组件,但这可能需要很长时间 Riot简介Riot的目标是使 UI 开发尽可能地简单。可以把它理解成 “web component的jquery” - 它提供了达成同样目标的更简短的语法。它简化了编写可重用组件的整体开发体验。Riot.js是一个客户端模型-视图-呈现(MVP)框架并且它非常轻量级甚至小于1kb。 尽管他的大小令人难以置信,所有它能构建的有如下:一个模板引擎,路由,甚至是库和一个严格的并具有组织的MVP模式。当模型数据变化时视图也会自动更新。MVP设计模式Riot使用Model-View-Presenter (MVP)设计模式来组织代码,这样它能够更模块化、更具可测试性且易于理解。 正如在MVC(模型-视图-控制器)或MVVM(模型-视图-视图模型)模式里,其目的是从应用程序的视图中分离逻辑,但MVP更简单。让我们把它和MVC比较一下: MVC模式更复杂。许多箭头围成一个圈。控制器的角色不明确,这种模式可以以许多不同的方式解释。事实上,这是造成有太多该模式下客户端框架的根本原因。MVP则相反,没有太多的解释空间,歧义少。每部分的作用是明确的。它适合大大大小小的工程,是单元测试的最佳模式。Riot的核心思想把部分的DOM和代码逻辑封装成一个为tag的文件,然后在需要的时候mount,在不需要的时候unmount。 mount: 加载,在页面中显示 unmount: 卸载,在页面中移除 my-tag 示例<my-tag> <!-- 布局 --> <h3 class="title">{ opts.title }</h3> <div>{ opts.text }</div> <!-- 逻辑 --> <script> var tag = this; tag.title = "标题3" </script> <!-- 样式,:scope 只对my-tag作用 --> <style> :scope{ display:block; } :scope .title{ color:#333; } </style> </my-tag> mount 示例<!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <div id="main"></div> <!-- 加载Riot --> <script src="js/riot+compiler.min.js" charset="utf-8"></script> <!-- 加载自定义的tag --> <script src="js/my-tag.tag" type="riot/tag" charset="utf-8"></script> <!-- 执行Mount --> <script type="text/javascript"> riot.mount( document.getElementById("main"), "my-tag", {title:"标题3",text:"内容"} ); </script> </body> </html> 更多riot.js文档 Riotjs v2.6.8 中文文档 不是最新版本,英文不是很好的先学懂 Riotjs v3.x 英文文档 Riotjs 代码风格指南 Riotjs Style Guide Riotjs segmentfault上的文章 Riotjs da宗熊专栏
2017年05月31日
192 阅读
0 评论
0 点赞
2017-04-07
js面向对象编程之继承
引用文章来源: Javascript面向对象编程(二):构造函数的继承 Javascript面向对象编程(三):非构造函数的继承 构造函数的继承现在有一个"动物"对象的构造函数function Animal(){ this.species = "动物"; } 还有一个"猫"对象的构造函数function Cat(name,color){ this.name = name; this.color = color; } 使"猫"继承"动物"的五种方法:构造函数绑定第一种方法也是最简单的方法,使用call或apply方法,将父对象的构造函数绑定在子对象上,即在子对象构造函数中加一行:function Cat(name,color){ Animal.apply(this, arguments); this.name = name; this.color = color; } var cat1 = new Cat("大毛","黄色"); console.log(cat1.species); // 动物 prototype模式如果"猫"的prototype对象,指向一个Animal的实例,那么所有"猫"的实例,就能继承Animal了。Cat.prototype = new Animal(); Cat.prototype.constructor = Cat; var cat1 = new Cat("大毛","黄色"); console.log(cat1.species); // 动物 Cat.prototype = new Animal(); 我们将Cat的prototype对象指向一个Animal的实例,它相当于完全删除了prototype 对象原先的值,然后赋予一个新值。Cat.prototype.constructor = Cat; 任何一个prototype对象都有一个constructor属性,指向它的构造函数。加了这一行以后,Cat.prototype.constructor指向Animal。 如果没有Cat.prototype = new Animal();这一行 Cat.prototype.constructor是指向Cat的。 console.log(Cat.prototype.constructor == Animal); //true 每一个实例也有一个constructor属性,默认调用prototype对象的constructor属性。 console.log(cat1.constructor == Cat.prototype.constructor); // true cat1.constructor也指向Animal! 这显然会导致继承链的紊乱(cat1明明是用构造函数Cat生成的),因此我们必须手动纠正,将Cat.prototype对象的constructor值改为Cat。这就是第二行的意思。 直接继承prototype第三种方法是对第二种方法的改进。由于Animal对象中,不变的属性都可以直接写入Animal.prototype。所以,我们也可以让Cat()跳过 Animal(),直接继承Animal.prototype。 现在,我们先将Animal对象改写:function Animal(){ } Animal.prototype.species = "动物"; 然后,将Cat的prototype对象,然后指向Animal的prototype对象,这样就完成了继承。Cat.prototype = Animal.prototype; Cat.prototype.constructor = Cat; var cat1 = new Cat("大毛","黄色"); console.log(cat1.species); // 动物 与前一种方法相比,这样做的优点是效率比较高(不用执行和建立Animal的实例了),比较省内存。缺点是 Cat.prototype和Animal.prototype现在指向了同一个对象,那么任何对Cat.prototype的修改,都会反映到Animal.prototype。所以,上面这一段代码其实是有问题的。请看第二行Cat.prototype.constructor = Cat; 这一句实际上把Animal.prototype对象的constructor属性也改掉了!console.log(Animal.prototype.constructor); // Cat 利用空对象作为中介由于"直接继承prototype"存在上述的缺点,所以就有第四种方法,利用一个空对象作为中介。var F = function(){}; F.prototype = Animal.prototype; Cat.prototype = new F(); Cat.prototype.constructor = Cat; F是空对象,所以几乎不占内存。这时,修改Cat的prototype对象,就不会影响到Animal的prototype对象。console.log(Animal.prototype.constructor); // Animal function extend(Child, Parent) { var F = function(){}; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; Child.uber = Parent.prototype; } 拷贝继承上面是采用prototype对象,实现继承。我们也可以换一种思路,纯粹采用"拷贝"方法实现继承。简单说,如果把父对象的所有属性和方法,拷贝进子对象,不也能够实现继承吗?这样我们就有了第五种方法。首先,还是把Animal的所有不变属性,都放到它的prototype对象上。function Animal(){} Animal.prototype.species = "动物"; 然后,再写一个函数,实现属性拷贝的目的。function extend2(Child, Parent) { var p = Parent.prototype; var c = Child.prototype; for (var i in p) { c[i] = p[i]; } c.uber = p; } 这个函数的作用,就是将父对象的prototype对象中的属性,一一拷贝给Child对象的prototype对象。使用的时候,这样写:extend2(Cat, Animal); var cat1 = new Cat("大毛","黄色"); alert(cat1.species); // 动物 非构造函数的继承现在有一个对象,叫做"中国人"。var Chinese = { nation:'中国' }; 还有一个对象,叫做"医生"。var Doctor ={ career:'医生' } 让"医生"去继承"中国人",这两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。object()方法function object(o) { function F() {} F.prototype = o; return new F(); } 这个object()函数,其实只做一件事,就是把子对象的prototype属性,指向父对象,从而使得子对象与父对象连在一起。使用的时候,第一步先在父对象的基础上,生成子对象:var Doctor = object(Chinese); 然后,再加上子对象本身的属性:Doctor.career = '医生'; 这时,子对象已经继承了父对象的属性了。console.log(Doctor.nation); //中国 浅拷贝除了使用"prototype链"以外,还有另一种思路:把父对象的属性,全部拷贝给子对象,也能实现继承下面这个函数,就是在做拷贝:function extendCopy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } c.uber = p; return c; } 使用的时候,这样写:var Doctor = extendCopy(Chinese); Doctor.career = '医生'; console.log(Doctor.nation); // 中国 但是,这样的拷贝有一个问题。那就是,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。现在给Chinese添加一个"出生地"属性,它的值是一个数组。Chinese.birthPlaces = ['北京','上海','香港']; 通过extendCopy()函数,Doctor继承了Chinese。var Doctor = extendCopy(Chinese); 然后,我们为Doctor的"出生地"添加一个城市:Doctor.birthPlaces.push('厦门'); 这样,Chinese的"出生地"也被改掉了!console.log(Doctor.birthPlaces); //北京, 上海, 香港, 厦门 console.log(Chinese.birthPlaces); //北京, 上海, 香港, 厦门 所以,extendCopy()只是拷贝基本类型的数据,我们把这种拷贝叫做"浅拷贝"。这是早期jQuery实现继承的方式。深拷贝所谓"深拷贝",就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用"浅拷贝"就行了。function deepCopy(p, c) { var c = c || {}; for (var i in p) { if (typeof p[i] === 'object') { c[i] = (p[i].constructor === Array) ? [] : {}; deepCopy(p[i], c[i]); } else { c[i] = p[i]; } } return c; } 使用的时候这样写:var Doctor = deepCopy(Chinese); 现在,给父对象加一个属性,值为数组。然后,在子对象上修改这个属性:Chinese.birthPlaces = ['北京','上海','香港']; Doctor.birthPlaces.push('厦门'); 这时,父对象就不会受到影响了。console.log(Doctor.birthPlaces); //北京, 上海, 香港, 厦门 console.log(Chinese.birthPlaces); //北京, 上海, 香港 目前,jQuery库使用的就是这种继承方法。
2017年04月07日
133 阅读
0 评论
0 点赞
2017-04-07
jquery观察者模式
观察者模式又叫做发布-订阅模式观察者模式主要应用于对象之间一对多的依赖关系,当一个对象发生改变时,多个对该对象有依赖的其他对象也会跟着做出相应改变,使程序更易于扩展和维护。观察者模式代码实现(function($) { var o = $({}); $.each({ trigger: 'publish', on: 'subscribe', off: 'unsubscribe' }, function(key, val) { jQuery[val] = function() { o[key].apply(o, arguments); }; }); })(jQuery); 观察者模式应用//订阅错误信息 $.subscribe('app.error', function(e, data) { alert('错误:' + data); }); //发布错误信息 $.ajax({ ..... error:function(){ $.publish('app.error','ajax请求错误!'); } }); //发布错误信息 if(!object){ $.publish('app.error','未找到对象!'); return false; }
2017年04月07日
129 阅读
0 评论
0 点赞
2016-12-15
使用LazyLoad动态加载js/css文件
LazyLoad 介绍LazyLoad是一个简单的动态加载js/css资源文件的js库,可以在需要的页面去加载需求js/css资源,达到页面加载的简洁以及效率。Github 地址https://github.com/rgrove/lazyload/资源下载lazyload.js 下载地址如何使用// 加载js文件,当加载完成后执行回调函数 LazyLoad.js('http://example.com/foo.js', function () { alert('foo.js has been loaded'); }); // 加载多个js文件,当全部加载完成后执行回调函数 LazyLoad.js(['foo.js', 'bar.js', 'baz.js'], function () { alert('all files have been loaded'); }); // 加载css文件,当加载完成后执行回调函数 LazyLoad.css('foo.css', function (arg) { alert(arg); }, 'foo.css has been loaded'); // 加载多个css文件,当全部加载完成后执行回调函数 LazyLoad.css('foo.css', function () { alert(this.foo); // displays 'bar' }, null, {foo: 'bar'}); 浏览器兼容性 Firefox 2+ Google Chrome Internet Explorer 6+ Opera 9+ Safari 3+ Mobile Safari Android
2016年12月15日
186 阅读
0 评论
0 点赞
2016-12-13
html5教程
文档类型声明<!DOCTYPE HTML>H5 meta全解声明文档使用的字符编码<meta charset='utf-8'>优先使用 IE 最新版本和 Chrome<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>页面描述<meta name="description" content="不超过150个字符"/>页面关键词屏幕的缩放<meta name="viewport" content="width=device-width,height=device-height, user-scalable=no,initial-scale=1, minimum-scale=1, maximum-scale=1,target-densitydpi=device-dpi ">width viewport的宽度[device-width | pixel_value]width如果直接设置pixel_value数值,大部分的安卓手机不支持,但是ios支持; <p>height viewport 的高度 (范围从 223 到 10,000 )</p> <p>user-scalable [yes | no]是否允许缩放</p> <p>initial-scale [数值] 初始化比例(范围从 > 0 到 10)</p> <p>minimum-scale [数值] 允许缩放的最小比例</p> <p>maximum-scale [数值] 允许缩放的最大比例</p> <p>target-densitydpi 值有以下(一般推荐设置中等响度密度或者低像素密度,后者设置具体的值dpi_value,另外webkit内核已不准备再支持此属性)<br /> -- dpi_value 一般是70-400//没英寸像素点的个数<br /> -- device-dpi设备默认像素密度<br /> -- high-dpi 高像素密度<br /> -- medium-dpi 中等像素密度<br /> -- low-dpi 低像素密度</p> <pre><code>####忽略电话号码和邮箱 `<meta name="format-detection" content="telphone=no, email=no"/>` ####设置作者姓名及联系方式 `<meta name="author" contect="hadong, dhso@163.com" />` ####搜索引擎抓取 `<meta name="robots" content="index,follow"/>` ####启用360浏览器的极速模式(webkit) `<meta name="renderer" content="webkit">` ####避免IE使用兼容模式 `<meta http-equiv="X-UA-Compatible" content="IE=edge">` ####不让百度转码 `<meta http-equiv="Cache-Control" content="no-siteapp" />` ####针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓 `<meta name="HandheldFriendly" content="true">` ####微软的老式浏览器 `<meta name="MobileOptimized" content="320">` ####UC强制竖屏 `<meta name="screen-orientation" content="portrait">` ####UC强制全屏 `<meta name="full-screen" content="yes">` ####UC应用模式 `<meta name="browsermode" content="application">` ####QQ强制竖屏 `<meta name="x5-orientation" content="portrait">` ####QQ应用模式 `<meta name="x5-page-mode" content="app">` ####添加 RSS 订阅 `<link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml"/>` ####添加 favicon icon `<link rel="shortcut icon" type="image/ico" href="/favicon.ico"/>` ####SNS 社交标签 </code></pre> <meta property="og:type" content="类型" /> <meta property="og:url" content="URL地址" /> <meta property="og:title" content="标题" /> <meta property="og:image" content="图片" /> <meta property="og:description" content="描述" />Windows 8 磁贴颜色<meta name="msapplication-TileColor" content="#000"/>Windows 8 磁贴图标<meta name="msapplication-TileImage" content="icon.png"/>windows phone 点击无高光<meta name="msapplication-tap-highlight" content="no">IOS 开启全屏显示<meta name="apple-mobile-web-app-capable" content="yes">IOS 改变顶部状态条的颜色<meta name="apple-mobile-web-app-status-bar-style" content="black" /> 在 web app 应用下状态条(屏幕顶部条)的颜色, 默认值为 default(白色),可以定为 black(黑色)和 black-translucent(灰色半透明);Safari 设置'添加到主屏幕图标'<link rel="apple-touch-icon-precomposed" href="/apple-touch-icon-57x57-precomposed.png"/>Safari 设置桌面图标的标题<meta name="apple-mobile-web-app-title" content="标题">判断浏览器<!--[if lt IE 7 ]><html class="oldie ie ie6"> <![endif]--> <!--[if IE 7 ]><html class="oldie ie ie7"> <![endif]--> <!--[if IE 8 ]><html class="ie ie8"> <![endif]--> <!--[if (gte IE 9)|!(IE)]><!--><html> <!--<![endif]-->H5 在移动应用开发的总结转到网易UEDCH5 一些移动应用框架MUI-最接近原生APP体验的高性能前端框架MUI DEMO IONIC-The top open source framework for building amazing mobile apps. Jingle SUI-轻量,小巧且精美的UI库 方便迅速搭建手机H5应用 framework7-特色的HTML框架 可以创建精美的iOS应用 weui-微信原生视觉体验一致的基础样式库 frozenui-简单易用,轻量快捷,为移动端服务的前端框架
2016年12月13日
157 阅读
0 评论
0 点赞
2016-12-06
SublimeText安装install package control
sublime text 编辑器安装install package control使用快捷键ctrl+` 或者 选择 View > Show Console打开命令控制台sublime text 2import urllib2,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7c0f' + '1e3d39e33b79698005270310898eea76'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation') sublime text 3import urllib.request,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7c0f' + '1e3d39e33b79698005270310898eea76'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
2016年12月06日
156 阅读
0 评论
0 点赞
2016-10-25
用forever运行ghost博客
如果没有安装,先安装npm install forever -g 查看forever运行状态forever list 运行GhostNODE_ENV=production forever start index.js 关闭Ghostforever stop index.js
2016年10月25日
80 阅读
0 评论
0 点赞
2016-10-21
前端注意要点
一些提示 1.多写写共用类 2.不要混用class和style,尽量避免将style直接放在标签上 3.使用栅格布局的时候,要注意页面大小造成的布局混乱 4.借助chrome/firefox的控制台来修改样式 5.看看其他框架,懂得组件的作用以及灵活使用 6.css和js加载顺序,以及优化 推荐一些前端框架 ZUI 一个基于 Bootstrap 深度定制开源前端实践方案,帮助你快速构建现代跨屏应用。 Amazeui 中国首个开源 HTML5 跨屏前端框架 Uikit 轻量级可定制的框架 Layui 轻量级模块化框架
2016年10月21日
74 阅读
0 评论
0 点赞
1
2