acrens / blog Goto Github PK
View Code? Open in Web Editor NEW本项目为了记录一下本人项目开发中遇到的问题及解决方案
License: MIT License
本项目为了记录一下本人项目开发中遇到的问题及解决方案
License: MIT License
相信很多前端er都使用过 line-height 来设置行高布局。下面看看官方定义:
On block level elements, the line-height property specifies the minimum height of line boxes within the element.On non-replaced inline elements, line-height specifies the height that is used to calculate line box height.
有时候我们在开发的时候并没有太深入的去了解一个属性,比如:line-height 的不同取值达到的效果并不同,下面依次看看常用的几种取值方式。å
line-height: 26px 目的就是直接定义目标元素的行高为 26px 的高度。
line-height: 150% 一般用该方式定义目标元素的行高会配合 font-size: 14px 属性使用,因为用百分比当前元素的行高为 1.5 * 14px = 21px。且如果其层叠子元素没有定义 line-height 属性,不管有没有定义 font-size 属性,其层叠子元素行高均为 21px(与自身的 font-size 没有任何关系)。
line-height:1.5 用该方式一般也是配合 font:14px 属性使用,但是对层叠子元素的影响效果并不同,如果层叠子元素没有定义 line-height 属性,但是定义了 font-size 属性,那这些层叠子元素的行高为继承过来的 line-height 倍数值乘以自身的 font-size 属性。
一般情况下,为了更加方便及清晰的使用 line-height,使用倍数取值是最佳的设置方式,如:body {font: 12px/1.5 tahoma,arial,"\5b8b\4f53"}。
很多项目会使用到bootstrap框架,bootstrap可以兼容IE低版本,通过respond.js可以解决IE对bootstrap的兼容问题,但问题来了,一般大型项目都是将前端资源文件和主站服务区分放入不同服务器,资源文件一般通过CDN访问,这个时候如果通过respond.js去解决IE兼容性问题是无效的。
对于一个项目而言,如果前端资源和主站服务不在同一个域名上,则respond.js解决bootstrap兼容性是无效的。
假设网站应用域名为example.dxy.com
前端资源服务器域名为static.db.com
首先下载:cross-domain-files
在页面上引入styles、respond.js后面加上下载的三个文件即可以解决IE下respond.js无效问题:
respond.proxy.gif、respond.proxy.js 应该放在example.dxy.com域名任意可访问的目录下;
respond-proxy.html 应该放在前端资源服务器static.dxy.com域名目录下;
如:
<script src="http://example.dxy.com/assets/respond.proxy.js"></script>最近在开发项目时,编写一个简单的登录页面,HTML页面上只有一个文本框和一个提交按钮,文本框需要支持Enter按键ajax提交。在这里我就纳闷的出了问题,我编写好了判断是否文Enter按键的JS提交事件,最后实现的效果是每次按下Enter按键,form表单自动提交并刷新页面,我却一直不知道为什么,后来查了资料,就有如下问题。
在编写HTML中form表单代码时,这样的页面有时候键盘回车键在文本框中触发时会自动交form表单情况,最终查阅资料发现有如下情况会自动enter按键提交form表单,无需编写JS。这里是示例代码:form-auto-submit
1.如果form表单里有type为submit的按钮存在,一个文本框还是多个文本框都提交生效。
2.如果form表单里面只有一个type="text"的input文本框,不管按钮是什么type,回车键生效。
3.如果按钮不是input,而是用button,并且没有加type,IE下默认为type=button,Chrome默认为type=submit。
4.对于其它表单元素,如textarea、select不影响,radio、checkbox不影响触发规则,但本身在Chrome下会响应回车键,在IE下不响应。
5.最奇怪的是如果有type="image"的input,效果等同于type="submit"。
曾经有伟人说过,对于一件新鲜事物,如果需要搞明白他,就会有以下三个步骤:What、How、Why(学习、思维三部曲 或 叫做学习黄金圈);而对于很多人,在学习一门技术时,都停留在 What 阶段,到使用时就不知道如何使用,就算使用了也不知道为什么要用。
Promise 是抽象异步处理对象以及对其进行各种操作的组件,而且 Promise 并不是从 JavaScript 中发祥的概念。
Promise 具有三种状态,分别为 pending(执行中)、resolved(被接受)、rejected(被拒绝)。
实例化:
静态方法:Promise.all、Promise.race、Promise.resolve、Promise.reject:
Promise.all()
Promise.all 方法为 Promise 组件的静态方法,无需创建 Promise 对象就可以直接使用此方法来并行执行多个 Promise 对象,且在 Promise.all(["Promise1","Promise2", "Promise2"]),如果在 all 方法参数的数组中有一个 Promise 对象执行失败即停止执行,返回结果需要等到数组对象执行完成才返回最后结果,结果为多个 Promise 对象返回值组成的数组。
代码:
var p1 = Promise.resolve(1);
var p2 = Promise.resolve(2);
var p3 = Promise.resolve(3);
Promise.all([p1, p2, p3]).then(function(results) {
console.log(results); // [1, 2, 3]
});
Promise.race()
Promise.race 方法性质同 Promise.all 方法,使用方式也一样,但是有一点不同是在 Promise.race(["Promise1","Promise2","Promise3"]) 等到数组参数里面第一个 Promise 对象执行完成就返回执行结果(这里说的第一个不是第一个参数,也可能是第二个,是指第一个执行完成的 Promise 对象)。
代码:Promise.race([new Promise(), new Promise(), new Promise()]);
Promise.resolve()
这是一种直接到达 Promise resolved 状态的快捷方式,并且创建返回一个 Promise 对象。
代码:
Promise.resolve("acrens").then(function(name) {
console.log(name); // acrens
});
Promise.reject()
同理,这是达到 Promise rejected 状态的快捷方式,并且创建返回一个进行 reject 的新 Promise 对象。如果传入的参数为一个 Promise 对象,则返回的是一个新的 Promise 对象(和 resolve 不同)。
代码:Promise.reject(new Error("error"));
对象方法:new Promise().then、new Promise().catch:
then()
用于注册 Promise 分别达到 resolved、rejected 状态时的回调函数,如:then(resolve, reject),当达到 resolved 状态时,执行 resolve 方法,否则,执行 reject 方法;reject 函数可以不在此注册,可以使用 catch 注册(这也是注册 reject 方式的语法糖,更方便 Promise 链方法);如果不需要注册 resolved 状态时的回调函数,then 方法第一个参数不可以省略,但是可以 then(undefined, reject) 这样书写。
代码:
var promise = new Promise(function(resolve, reject) {
resolve(2);
});promise.then(function(value) {
console.info('Task --------- ' + value); // Task --------- 2
}).catch(function onRejected(error) {
console.error(error);
});
catch()
catch 方法在此就不多赘述,其只是注册 rejected 状态回调函数的语法糖。
代码:(参照上面 then 方法代码示例)。
Promise 从实例化到执行完成可以参照下图并结合上述代码理解(只有认真地去理解这个流程图,才可以看到 Promise 的精髓,坏笑...):
注意:fulfill 就相当 resolved 状态。
Promise 需要解决的问题也就是其产生的原因(废话):
异步问题
用异步的方式来表达异步的代码是艰难的,甚至很难用我们的大脑来理解。(事件轮询、并发模式)
回调地狱
并不是简单地理解为代码嵌套,编辑器代码缩进空格;还包括代码的控制转移(如在回调之前进行的第三方调用,控制权转交给第三方)。
在项目开发中,时常会使用到异步处理及代码多层嵌套,这对于后期理解和维护代码是一个“坑”,因此可以尝试使用 Promise 方式去解决代码给后期带来的负担。
注:下一篇更新 Promise 扩展阅读版
春节快到了,假期也快到了,空闲之余刷个微博,看见 @ruanyf 提出了一个问题与 TDZ 有关,但是貌似阮大当时还没有意识到这个问题,多亏一些其他业内同仁提出了与 TDZ 相关;当然,以阮大的能力这都不是事。由于当时我本身也还不知道 TDZ 这一回事没有看懂,所以就花了一些时间去搞清楚什么是 TDZ 及TDZ会带来一些什么问题,本文主要是用于介绍我对 TDZ 的一些理解,如有问题,多谢指出。
案例一
let y = 1;
function foo(x = y, y) {
console.log(x);
}
foo(); // ReferenceError: y is not defined
function analysis() {
"use strict";
let y = 1;
function foo() {
let x = arguments[0] !== (void 0) ? arguments[0] : y; // y not defined
let y = arguments[1];
}
foo();
return {};
}
案例二
let y = 1;
function foo(x = function(){console.log(y)}, y = 2) {
x(); // 2
y = 3;
x(); // 3
}
foo();
console.log(y); //1
function analysis() {
"use strict";
let y = 1;
function foo() {
let x = arguments[0] !== (void 0) ? arguments[0] : function() {
console.log(y);
};
let y = arguments[1] !== (void 0) ? arguments[1] : 2;
x(); // 2
y = 3;
x(); // 3
}
foo();
console.log(y); // 1
return {};
}
案例三
let y = 1;
function foo(x = function(){console.log(y)}) {
let y = 3;
x(); // 1
}
foo();
function analysis() {
"use strict";
let y = 1;
function foo() {
let x = arguments[0] !== (void 0) ? arguments[0] : function() {
console.log(y);
};
function funBody() {
let y = 3;
x();
}
funBody();
}
foo();
return {};
}
案例四
function foo(x = function(){console.log(y)}) {
let y = 3;
x(); // // ReferenceError: y is not defined
}
foo();
function analysis() {
"use strict";
function foo() {
let x = arguments[0] !== (void 0) ? arguments[0] : function() {
console.log(y);
};
function funBody() {
let y = 3;
x();
}
funBody();
}
foo();
return {};
}
以上核心部分在代码翻译部分,通过配合一下资料及个人的理解,翻译出通俗易懂的代码:
Versions for Mac,通过 Versions 管理 SVN 代码,昨晚在更新代码的过程中未更新完成被强制退出,导致项目目录文件被锁(locked),此时如果更新代码会提示工作目录被锁。在网上找了很多种解决方案,有一个方案解决了我的问题:
方案:http://www.jianshu.com/p/9adcc352e3e6
可能涉及知识:
1、显示目录隐藏文件:defaults write com.apple.finder AppleShowAllFiles -bool true;
2、重启 Finder:killall Finder。
时光荏苒,犹如白驹过隙。过去的时间不能追回,未来的时间不能逾越,唯有珍惜眼前才是最切实际。
说到2015年,经历了很多事情,因为这也算是“真正的”走出了校门,踏入社会。我也像大多数刚毕业的学生一样,怀有一颗赤子之心,认为社会是多么的美好。也一样怀有自己的梦想,俗话说:梦想是要有得,万一实现了呢?
2015,我就怀着这样一颗心,开始追逐自己的梦想,就在今年4月份,我辞去了母校所在城市的工作,独自来到美丽的杭州。其实在辞去工作这段时间心里还是很不舒服的,第一、有点舍不得从校园一起走出来的同学,第二、对原来公司的意见确实蛮大的(算了,无力吐槽,Too young Too Simple)。这是2015记忆比较深得第一件事。
2015,我初次来到杭州,由于所学专业为互联网相关,自然寻找的是互联网相关工作。相比以前呆的城市,我在杭州寻找工作那段时间,完全体会到了互联网时代优秀人员的缺乏,从某一方面也反应出了学校对于人才培养方式的欠缺。其实,我现在所呆的公司,之前应聘我是被刷的,当然,也有其他创业公司给到offer,薪资也很似诱人,考虑到未来的发展,我也寻求了朋友的意见(这里得感谢@正常人够我富舆论性么 ),我最终选择再次请求@丁香园 给我面试机会。这是2015记忆比较深的第二件事。
2015,工作是找到了,没地方住,还好高中同学@邱望收留了我,一住就是两个月,两个人挤着不到10㎡的房间(反正很小),当时我也是厚着脸皮住了,哈哈哈。那两个月真心的感谢他。
2015,最让我感动的事情就是下面要总结的事情了,女朋友反抗她爸妈对她得叮嘱来到我的身边了,当时来了之后,其实还是蛮感动得。就冲这一点,我是该对她更用心,更好些。看到这里,是不是有些矫情了。这是2015记忆比较深的第三件事。
2015,让我比较不是很满意的就是学习(特别不满意),初定的计划都未能坚持,书籍未看完,视频未看完,该学习的都未学习完成,得反省反省。有时候也开始学着写一些东西分享出去,这一点2015年算是完成了一部分吧,还算满意。
2015,工作上自己还是比较满意,有很好的团队,也有很好的工作提供锻炼,自己也很好的完成了。工作这段时间,自己也干得比较开心,自由让我工作效率更加的好,这也是自己比较喜欢的一种方式。
再见2015,你好2016
致2016的自己:
多看些书,多几次旅行,多看些电影,多打些电话,多交些朋友,多赚些钱......
性能优化的目的无非是减少用户流量消耗,提升用户首屏体验,提升用户访问速度,让用户专注内容本身。
在开始提笔写这篇博客前就遇到了一个很棘手的问题,这篇博客标题叫什么,思考了一会,我心里冒出了三个答案:
注:原文
以上内容仅为个人理解,如果本内容大家觉得哪里写的不对,望大家指出,供一起讨论。
在大型项目开发中,可能存在这类问题,前端代码和服务器代码分离,前端代码在前端资源服务器通过CDN访问,作为一个前端人员,不管修复BUG还是开发新功能,可能需要把前端资源拉到本地开发,绑定本机测试,这个时候浏览器访问系统会存在font-face跨域加载失败,看上去太怪了。
1、mac可以通过 open -a "Google Chrome" --args --disable-web-security 此命令避免问题,如果别人也要绑定你本机访问,再叫别人这样访问,那太 low。
2、本机 apache 配置所有域均可正常访问 font-face
cd /private/etc/apache2/
vim httpd.conf
添加到文件:
<FilesMatch ".(ttf|ttc|otf|eot|woff|font.css)$">
Header set Access-Control-Allow-Origin "_" #_为
找到
添加到其内部:
AddType application/vnd.ms-fontobject .eot
AddType font/ttf .ttf
AddType font/otf .otf
AddType application/x-font-woff woff
打开 httpd.conf ,找到 LoadModule headers_module libexec/apache2/mod_headers.so,去除前面的#;
在同目录 extra 下找到 httpd-vhosts.conf 对应服务虚拟机,如:<VirtualHost *:80> 里面添加 Header set Access-Control-Allow-Origin * 支持所有域名。
面向过程、面向对象、函数式编程
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.