博客

  • 积极面对工作–资质平庸的人该怎么办

    最近看到这篇文章,有一些感触,有一些像事情像发生在自己身上。

    转载以自勉。

    【转载】资质平庸的人该怎么办

    天赋秉异的人永远是少数,剩下的都是资质平庸的芸芸众生。相信即使只是普通人,也有一颗不甘于平庸的心。那么资质平庸的人该如何在职场上做出一番成就呢?

    其实以大多数人的努力程度之低,根本轮不到拼天赋。你需要的是比别人更加熟悉职场的规则、遵守规则、利用规则,这个过程也是“被社会与职场的规律驯化”的过程。“被驯化”是无法避免的,只有熟悉“游戏规则”,才能更好地“玩游戏”。

    一名百度员工在离职时总结出11条职场心得,希望能帮助你更好适应职场人生。

    1、你有“同理心”吗?

    什么叫“同理心”?

    说复杂点儿,同理心就是站在当事人的角度和位置上,客观地理解当事人的内心感受,且把这种理解传达给当事人的一种沟通交流方式。

    说简单点儿,同理心就是“己所不欲,勿施于人”。将心比心,也就是设身处地去感受、去体谅他人。说白了,同理心就是“情商”。

    具体点说:同理心就是,领导交办一项工作,你要读懂他的目的、看清他的用意。

    我经常遇到这样的情况:给团队成员安排工作时,一再询问“我说明白了吗”“有没有问题”,再三确认后,提交上来的东西仍然答非所问。所以我在接受任务时,总会向领导确认:你想要的是什么?你的目的是什么?了解这个以后,就可以站在他的角度,有效的帮他解决问题。

    2、听话,出活

    什么叫“听话”?有句老话叫“干活不由东,累死也无功”,谁是“东”啊?你的直属领导就是“东”,大部分时候,听他的话准没错儿。

    根据我的经验,一般来说,领导都比你水平高,起码在一点上是这样:他比你信息更全面、判断的更准确。因为领导更容易接触到更高层,更了解更高层的意图,他知道的你不知道,你在自己的角度上认为“这么做对”,但领导在更高的层面,并不一定这么看。

    什么叫“出活”?就是领导给你的工作,你得按时完成并且汇报总结。如果这个工作要持续较长时间,那么你需要阶段性的给领导反馈。

    我们经常犯一个错误,领导安排的工作,他不问你也不说,黑不提白不提这事儿就算过去了。过去了?哪儿那么容易啊!领导都记着呢,你等他问你的时候——“诶小陈,上次安排你做的那事儿怎么样了?”——他就已经在心里给你写上了标签:“不靠谱”。一个“不靠谱”需要用十个“靠谱”来扭转,两个“不靠谱”就很难转变印象,三个“不靠谱”你就没有机会了。

    3、要想人前显贵,必须背地里受罪

    道理并不难懂,就是真到受苦的时候就含糊了。

    有的人会说,我年纪轻轻的为什么不好好享受生活啊?这种想法很普遍,这本是一个价值观的问题,没什么可说的,一个人想怎么生活都对。但是有一些朋友是在追求理想和享受生活中纠结的,和这些朋友,是可以聊的。

    马云曾经说过:我们追求的应是人生的大平衡,而不是一时一日的小平衡(大意如此)。新东方也有一句话说:怕吃苦吃苦一辈子,不怕苦吃苦半辈子。两句话大意相同,值得深思。

    4、能忍多大事儿,就能成多大事儿

    有一天加班,晚上2点钟到家,收到老板的一封邮件,批评我工作不到位。我收到邮件后就很崩溃,还很委屈。于是当即奋笔疾书,回邮件!解释我是如何工作的,我做的如何有道理,我做的如何有效果……写了2000多字。

    写完了,我好像冷静了一些,我就琢磨一个事儿:如果我是老板,我对一个员工工作不满意,于是我给他写了封邮件批评他,我想看到的是他洋洋洒洒的解释和辩解吗?显然不是啊。然后我就突然明白了,于是我把那2000多字都删了,简单回复了一句话,大意是:我会反思工作的问题,然后尽快整改。

    两个月后我晋升了。在我的晋升仪式上,我对我老板说起这件事,他对我说,我知道你很委屈,我就是想看看你在面对委屈和压力时,会有怎样的反应,这体现了一个人的成熟程度。

    5、总躲着领导,你就危险了

    不少人躲着领导,尽量少跟领导说话、绕着领导走。因为跟领导近了事儿就多,不跟领导多接触,事儿少,多清闲。这是“一叶障目,不见泰山”。

    如果你想在工作上取得一些成绩,我建议还是应该主动的多和领导沟通。领导在平时开会时说的多是大面儿上的话,真话、有用的话、有价值的话不一定说。这并不是他不想说,而是没机会说。

    有心的员工会随时抽时间和领导沟通、增加私人交流的机会:一起吃饭、一起抽烟、一起上下班、甚至一起打球K歌……通过这样的机会,你可以了解领导对于你的看法、对于工作的观点,这些都有益于你调整自己的工作的方式。

    有朋友担心这样做会引起领导反感,其实完全不会,领导们多是孤独的,如果他发现有一个员工虚心向他请教、积极分享工作的思考,他是非常高兴的。

    老板也是人,大家用人类的方式沟通,一切会变得简单很多。

    6、帮助别人千万别吝啬

    当你正在忙于某项工作时,有同事来向你“求助”,很多时候我们会很直接、甚至粗暴的拒绝,殊不知这样做正在给你今后的工作种下麻烦的种子。

    风水轮流转,在一家公司里,大家的工作互相交叉的几率很大,说不定你会用上谁,这些人脉关系需要平时去维护。今天你帮助了人家,说不定明天对方就会成为你的救命稻草,这非常可能。

    7、目标再目标,量化再量化

    没有目标的,都不叫工作;没有量化的,都不叫目标。

    在接受一项工作时,先问目标是什么;在布置一项工作时,先交代目标是什么。这个不说清楚,都是扯淡。

    不想成为蒙着眼睛拉磨的驴?那么除了清楚的知道自己的目标外,还得知道你的部门、你的公司的目标,最关键的,你需要知道,你的工作在总体目标中处在什么地位、扮演什么角色。如果你发现,你工作的目标和总体目标关系很小、甚至没有关系,那么你就很容易被拿掉。

    8、找到解决问题的办法是我的义务

    领导安排的工作,不能说“我做不了”、“我做不到”。

    公司请我们来工作,是为了解决问题的,如果不能解决问题,我们就没有价值。工作推进中遇到困难,无法继续进行,这是很正常的事儿,我们需要做的是主动寻找答案和办法,哪怕你的办法不妥,那么就去问,但无论如何不能对你的领导说,我不会。

    解决问题的能力是员工最关键的能力,没有之一。在工作中遇到困难特别正常,在这时,我们有一项义务,就是找到解决问题的办法。

    9、尽量不说“不是我,我没有”

    尽量不说“不是我”、“没有我”这样的话,因为这些话毫无作用,领导听惯了这样的推卸之词,丝毫不会为之所动。

    此时如果能够主动承担责任,反而体现了一种担当。即便真是被冤枉了,当场辩解往往也不是最明智的选择,可以先保持沉默,私下找机会和领导进行沟通。

    10、“言多必失”死得惨

    在公司里,少说闲话,不说是非话,不做是非人。

    你就相信一点:你说的每句话,你的老板都会知道。好话可能不一定,坏话则是一定的。还是做个正直的人吧,这样最简单,也受益最大。正直人的原则是:批评当面说,赞美背后讲。

    11、知道什么时候离开

    好多同事和朋友和我聊过离职的话题,我对朋友们的建议是,如果你因为觉得工作不爽,那就别离职,因为甭管到哪里,都会不爽:老板不喜欢、同事不可爱、工作太劳累、关系太复杂……我以我在多家大公司工作的经历担保:几乎所有我工作过的公司,令人不爽的事儿都是一样的。

    那么什么时候离开呢?有两种情况:

    1、在这家公司,你已经没有上升的空间、无法学习到更多的东西了;

    2、在这家公司,你已学到足够的知识,可以在新领域或新平台上一展身手了。

    作者|泰然野孤禅

    来源|第一职场网

  • 动画事件 webkitAnimationStart webkitAnimationEnd

    var d = document.getElementById('animation');
    d.addEventListener('webkitAnimationStart', listener);
    d.addEventListener('webkitAnimationEnd', listener);
    function listener(e) {
    	console.log(e.type, e);
    }

    AnimationEvent 事件对象具有

    animationName 动画名称
    elapsedTime 动画运行时间(秒)
    type animationstart
    以及其他事件属性
  • 使用html新属性download自定义下载文件

    在 HTML5 中可以设置 a 标签的 download 属性,实现点击超链接时直接下载文件而不是打开超链接。

    代码示例:

    <a href="woxinfeishi-bukezhuanye.jpg" download="我心匪石.jpg">点击下载图片</a>

    Demo 示例:html-download.html

    目前该属性仅 Chrome、Firefox 支持。

    使用 download 属性需要注意,只有同域(来源相同)时才会得到完整支持。这一点 w3school 并没有明确指出。Mozilla 的开发文档里有一行小字:This attribute is only honored for links to resources with the same-origin.

    在 Chrome 下,当 href 不同域,会以原始的名称下载文件。在 Firefox 下,当 href 不同域时,会当做普通 a 处理,直接在浏览器中打开该连接。

    我们知道通过程序下载文件时,设置 Content-Disposition 头信息,可以告诉浏览器文件存储的名字。火狐浏览器会优先使用 Content-Disposition 给出的文件名。

  • 键盘数值对照表

    键盘数值对照表

    按键 数值 描述
    DOM_VK_CANCEL 3 Cancel key
    DOM_VK_HELP 6 Help key
    DOM_VK_BACK_SPACE 8 退格键
    DOM_VK_TAB 9 Tab键
    DOM_VK_CLEAR 12 “5” key on Numpad when NumLock is unlocked. Or on Mac, clear key which is positioned at NumLock key
    DOM_VK_RETURN 13 Return/enter key on the main keyboard
    DOM_VK_ENTER 14 Reserved, but not used
    DOM_VK_SHIFT 16 Shift 键
    DOM_VK_CONTROL 17 Ctrl 键
    DOM_VK_ALT 18 Alt 键(Mac上为Option 键)
    DOM_VK_PAUSE 19 Pause key
    DOM_VK_CAPS_LOCK 20 Caps lock
    DOM_VK_ESCAPE 27 Escape 键
    DOM_VK_SPACE 32 空格键
    DOM_VK_PAGE_UP 33 Page Up key
    DOM_VK_PAGE_DOWN 34 Page Down key
    DOM_VK_END 35 End key
    DOM_VK_HOME 36 Home key
    DOM_VK_LEFT 37 Left arrow
    DOM_VK_UP 38 Up arrow
    DOM_VK_RIGHT 39 Right arrow
    DOM_VK_DOWN 40 Down arrow
    DOM_VK_SELECT 41 Linux support for this keycode was added in Gecko 4.0
    DOM_VK_PRINT 42 Linux support for this keycode was added in Gecko 4.0
    DOM_VK_EXECUTE 43 Linux support for this keycode was added in Gecko 4.0
    DOM_VK_PRINTSCREEN 44 Print Screen key
    DOM_VK_INSERT 45 Ins(ert) key
    DOM_VK_DELETE 46 Del(ete) key
    DOM_VK_0 48
    DOM_VK_1 49
    DOM_VK_2 50
    DOM_VK_3 51
    DOM_VK_4 52
    DOM_VK_5 53
    DOM_VK_6 54
    DOM_VK_7 55
    DOM_VK_8 56
    DOM_VK_9 57
    DOM_VK_COLON 58 Colon (“:”) key
    DOM_VK_SEMICOLON 59 Semicolon (“;”) key
    DOM_VK_LESS_THAN 60 Less-than (“<“) key
    DOM_VK_EQUALS 61 Equals (“=”) key
    DOM_VK_GREATER_THAN 62 Greater-than (“>”) key
    DOM_VK_QUESTION_MARK 63 Question mark (“?”) key
    DOM_VK_AT 64 Atmark (“@”) key
    DOM_VK_A 65
    DOM_VK_B 66
    DOM_VK_C 67
    DOM_VK_D 68
    DOM_VK_E 69
    DOM_VK_F 70
    DOM_VK_G 71
    DOM_VK_H 72
    DOM_VK_I 73
    DOM_VK_J 74
    DOM_VK_K 75
    DOM_VK_L 76
    DOM_VK_M 77
    DOM_VK_N 78
    DOM_VK_O 79
    DOM_VK_P 80
    DOM_VK_Q 81
    DOM_VK_R 82
    DOM_VK_S 83
    DOM_VK_T 84
    DOM_VK_U 85
    DOM_VK_V 86
    DOM_VK_W 87
    DOM_VK_X 88
    DOM_VK_Y 89
    DOM_VK_Z 90
    DOM_VK_CONTEXT_MENU 93
    DOM_VK_NUMPAD0 96 0 on the numeric keypad
    DOM_VK_NUMPAD1 97 1 on the numeric keypad
    DOM_VK_NUMPAD2 98 2 on the numeric keypad
    DOM_VK_NUMPAD3 99 3 on the numeric keypad
    DOM_VK_NUMPAD4 100 4 on the numeric keypad
    DOM_VK_NUMPAD5 101 5 on the numeric keypad
    DOM_VK_NUMPAD6 102 6 on the numeric keypad
    DOM_VK_NUMPAD7 103 7 on the numeric keypad
    DOM_VK_NUMPAD8 104 8 on the numeric keypad
    DOM_VK_NUMPAD9 105 9 on the numeric keypad
    DOM_VK_MULTIPLY 106 * on the numeric keypad
    DOM_VK_ADD 107 + on the numeric keypad
    DOM_VK_SEPARATOR 108
    DOM_VK_SUBTRACT 109 – on the numeric keypad
    DOM_VK_DECIMAL 110 Decimal point on the numeric keypad
    DOM_VK_DIVIDE 111 / on the numeric keypad
    DOM_VK_F1 112 F1 键
    DOM_VK_F2 113 F2 键
    DOM_VK_F3 114 F3 键
    DOM_VK_F4 115 F4 键
    DOM_VK_F5 116 F5 键
    DOM_VK_F6 117 F6 键
    DOM_VK_F7 118 F7 键
    DOM_VK_F8 119 F8 键
    DOM_VK_F9 120 F9 键
    DOM_VK_F10 121 F10 键
    DOM_VK_F11 122 F11 键
    DOM_VK_F12 123 F12 键
    DOM_VK_F13 124 F13 键
    DOM_VK_F14 125 F14 键
    DOM_VK_F15 126 F15 键
    DOM_VK_F16 127 F16 键
    DOM_VK_F17 128 F17 键
    DOM_VK_F18 129 F18 键
    DOM_VK_F19 130 F19 键
    DOM_VK_F20 131 F20 键
    DOM_VK_F21 132 F21 键
    DOM_VK_F22 133 F22 键
    DOM_VK_F23 134 F23 键
    DOM_VK_F24 135 F24 键
    DOM_VK_NUM_LOCK 144 Num Lock key
    DOM_VK_SCROLL_LOCK 145 Scroll Lock key
    DOM_VK_CIRCUMFLEX 160 Circumflex (“^”) key
    DOM_VK_EXCLAMATION 161 Exclamation (“!”) key
    DOM_VK_DOUBLE_QUOTE 162 Double quote (“””) key
    DOM_VK_HASH 163 Hash (“#”) key
    DOM_VK_DOLLAR 164 Dollar sign (“$”) key
    DOM_VK_PERCENT 165 Percent (“%”) key
    DOM_VK_AMPERSAND 166 Ampersand (“&”) key
    DOM_VK_UNDERSCORE 167 Underscore (“_”) key
    DOM_VK_OPEN_PAREN 168 Open parenthesis (“(“) key
    DOM_VK_CLOSE_PAREN 169 Close parenthesis (“)”) key
    DOM_VK_ASTERISK 170 Asterisk (“*”) key
    DOM_VK_PLUS 171 Plus (“+”) key
    DOM_VK_PIPE 172 Pipe (“|”) key
    DOM_VK_HYPHEN_MINUS 173 Hyphen/Minus (“-“) key
    DOM_VK_OPEN_CURLY_BRACKET 174 Open curly bracket (“{“) key
    DOM_VK_CLOSE_CURLY_BRACKET 175 Close curly bracket (“}”) key
    DOM_VK_TILDE 176 Tilde (“~”) key
    DOM_VK_COMMA 188 Comma (“,”) key
    DOM_VK_PERIOD 190 Period (“.”) key
    DOM_VK_SLASH 191 Slash (“/”) key
    DOM_VK_BACK_QUOTE 192 Back tick (“`”) key
    DOM_VK_OPEN_BRACKET 219 Open square bracket (“[“) key
    DOM_VK_BACK_SLASH 220 Back slash (“\”) key
    DOM_VK_CLOSE_BRACKET 221 Close square bracket (“]”) key
    DOM_VK_QUOTE 222 Quote (”’) key
    DOM_VK_META 224 Command key on Mac
    DOM_VK_ALTGR 225 AltGr key on Linux
    DOM_VK_WIN 91 Windows logo key on Windows. Or Super or Hyper key on Linux
    DOM_VK_KANA 21 Linux support for this keycode was added in Gecko 4.0
    DOM_VK_EISU 22 “英数” key on Japanese Mac keyboard
    DOM_VK_JUNJA 23 Linux support for this keycode was added in Gecko 4.0
    DOM_VK_FINAL 24 Linux support for this keycode was added in Gecko 4.0
    DOM_VK_HANJA 25 Linux support for this keycode was added in Gecko 4.0
    DOM_VK_KANJI 25 Linux support for this keycode was added in Gecko 4.0
    DOM_VK_CONVERT 28 Linux support for this keycode was added in Gecko 4.0
    DOM_VK_NONCONVERT 29 Linux support for this keycode was added in Gecko 4.0
    DOM_VK_ACCEPT 30 Linux support for this keycode was added in Gecko 4.0
    DOM_VK_MODECHANGE 31 Linux support for this keycode was added in Gecko 4.0
    DOM_VK_SLEEP 95 Linux support for this keycode was added in Gecko 4.0

    数值到按键名对照关系

    var mapCodeName = {
        3: "cancel",
        6: "help",
        8: "back_space",
        9: "tab",
        12: "clear",
        13: "return",
        14: "enter",
        16: "shift",
        17: "control",
        18: "alt",
        19: "pause",
        20: "caps_lock",
        27: "escape",
        32: "space",
        33: "page_up",
        34: "page_down",
        35: "end",
        36: "home",
        37: "left",
        38: "up",
        39: "right",
        40: "down",
        41: "select",
        42: "print",
        43: "execute",
        44: "printscreen",
        45: "insert",
        46: "delete",
        48: "0",
        49: "1",
        50: "2",
        51: "3",
        52: "4",
        53: "5",
        54: "6",
        55: "7",
        56: "8",
        57: "9",
        58: "colon",
        59: "semicolon",
        60: "less_than",
        61: "equals",
        62: "greater_than",
        63: "question_mark",
        64: "at",
        65: "a",
        66: "b",
        67: "c",
        68: "d",
        69: "e",
        70: "f",
        71: "g",
        72: "h",
        73: "i",
        74: "j",
        75: "k",
        76: "l",
        77: "m",
        78: "n",
        79: "o",
        80: "p",
        81: "q",
        82: "r",
        83: "s",
        84: "t",
        85: "u",
        86: "v",
        87: "w",
        88: "x",
        89: "y",
        90: "z",
        93: "context_menu",
        96: "numpad0",
        97: "numpad1",
        98: "numpad2",
        99: "numpad3",
        100: "numpad4",
        101: "numpad5",
        102: "numpad6",
        103: "numpad7",
        104: "numpad8",
        105: "numpad9",
        106: "multiply",
        107: "add",
        108: "separator",
        109: "subtract",
        110: "decimal",
        111: "divide",
        112: "f1",
        113: "f2",
        114: "f3",
        115: "f4",
        116: "f5",
        117: "f6",
        118: "f7",
        119: "f8",
        120: "f9",
        121: "f10",
        122: "f11",
        123: "f12",
        124: "f13",
        125: "f14",
        126: "f15",
        127: "f16",
        128: "f17",
        129: "f18",
        130: "f19",
        131: "f20",
        132: "f21",
        133: "f22",
        134: "f23",
        135: "f24",
        144: "num_lock",
        145: "scroll_lock",
        160: "circumflex",
        161: "exclamation",
        162: "double_quote",
        163: "hash",
        164: "dollar",
        165: "percent",
        166: "ampersand",
        167: "underscore",
        168: "open_paren",
        169: "close_paren",
        170: "asterisk",
        171: "plus",
        172: "pipe",
        173: "hyphen_minus",
        174: "open_curly_bracket",
        175: "close_curly_bracket",
        176: "tilde",
        188: "comma",
        190: "period",
        191: "slash",
        192: "back_quote",
        219: "open_bracket",
        220: "back_slash",
        221: "close_bracket",
        222: "quote",
        224: "meta",
        225: "altgr",
        91: "win",
        21: "kana",
        22: "eisu",
        23: "junja",
        24: "final",
        25: "hanja",
        28: "convert",
        29: "nonconvert",
        30: "accept",
        31: "modechange",
        95: "sleep"
    };
  • 使用 Firefox 在 Android 设备上进行网页调试

    通过 Firefox 提供的开发者工具——远程调试安卓版Firefox浏览器,能够实现在是 PC 浏览器上调试手机浏览器中的网页。相比较通过使用 Chrome 在 Android 设备上进行网页调试,配置过程略复杂一点。

  • 整合 Advanced lazy load 与 Responsive Lightbox

    因为博客文章展示页面宽度有限制,一些文章使用到的图片原始宽度会超出,导致图像显示时必须压缩宽度,使得图像模糊。比如浏览器如何加载网页 — JavaScript PerformanceTiming中的第一张图片。所以考虑增加一个图像浏览插件,使得点击图像使得点击图片使能够弹出较大的对话框,尽可能按原始宽度展示图像。

    今天尝试了几款,最终选择了 Responsive Lightbox by dFactory

    启用 Responsive Lightbox

    在使用这款插件时遇到了几个问题:

    1. 文章的图像没有设置链接,点击图像没有响应
    2. 文章的图像使用了懒加载,无法识别正确的图像地址

    关于第一点,在试用的插件中均遇到了这个问题,也就意味着即使今后在文章中添加图片时一并添加链接,以前的文章仍然无法使用这个功能。(修改所有历史文章不是一个明智的选择)

    关于第二点,由于这些插件都没有解决第一个问题,所以刚开始考虑把懒加载去掉。

    查看了一下 Responsive Lightbox 的文件 responsive-lightbox/js/front.js ,发现它是查询特定 a 标签:

    $( 'a[rel*="' + rlArgs.selector + '"], a[data-rel*="' + rlArgs.selector + '"]' )
    

    设想可以通过 JavaScript 给图片追加 a 标签:

    $('img[src]').each(function() {
    	var src, img = $(this);
    	if (img.parent().prop('tagName') == 'A') {
    		return;
    	}
    	// 1, 兼容 lazy load; 2, 兼容未设置链接的图片
    	src = img.attr('imageholder') || img.attr('src');
    	if (src) {
    		$('<a data-rel="' + rlArgs.selector + '[lightbox[gallery-AAAA]" href="' + src + '" target="_blank"></a>')
    			.insertBefore(img)
    			.append(img);
    	}
    });
    
    if (window.innerWidth < 480) {
    	return false;
    }
    

    判断 window.innerWidth,是因为在手机上展示效果不够理想。

    至此,在改动较少且不影响体验和增加图片下载的前提下整合了 Advanced lazy loadResponsive Lightbox

  • 浏览器如何加载网页 — JavaScript PerformanceTiming

    在地址栏中输入一个 url,发生了哪些事情?

    1. 输入 blog.zhengxianjun.com
    2. 浏览器查找域名的 IP 地址
      1. 查找浏览器 hosts 缓存
      2. 查找系统缓存——本机 hosts 文件
      3. 查找最近的本地域名服务器(LDNS)
      4. (LDNS)查找 Root Server->返回所在域的 gTLD Server(全球共13台国际顶级域名服务器)->查找域名对应的 Name Server->匹配域名和 IP 映射表->返回IP记录以及 TTL->LDNS 缓存并返回给浏览器
    3. 浏览器向服务器发起一个 HTTP 请求报文
      1. 应用层协议 HTTP 通过TCP报文发送到服务器
      2. TCP 3次握手(HTTP 1.0 规定服务器处理完成后立即断开TCP连接,1.1 版本)
      3. 返回 HTTP 报文,如果包含重定向信息,浏览器进行重定向(重定向次数限制)
    4. 服务器处理请求,并返回 HTTP 响应报文
    5. 浏览器接收 HTML,分析 HTML 中的资源(图片、样式、音视频),继续请求
    6. 浏览器呈现网页

    JavaScript 提供的 PerformanceTiming 接口详述了各个阶段发生的时间点。

    PerformanceTiming 定义

    PerformanceTiming 所有属性均为只读。

    PerformanceTiming 示例

    网页加载时间示例

    w3 文档地址:http://www.w3.org/TR/navigation-timing/

  • JavaScript RSA 非对称加密

    使用 JSEncrypt 完成 JavaScript 非对称加密。

    假定整个加解密过程中使用的密钥如下。

    公钥:

    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5A/TPEmOQYgT2po11qvjeBUPE
    dqUEz1Z7MeHH7KI2p74pYK8RsvYngy1cH/wnMXmsf+Wb3tmlqNGa7atW8wlpSfXX
    QV9bFECPEVRnESo8xtN7ZAlJFcdRvBVgfVwC3m9HWpVvKnd9NREXIcg5NHh57q7u
    lsGCZJ2VOJm9EIgFEwIDAQAB
    -----END PUBLIC KEY-----
    

    私钥:

    -----BEGIN RSA PRIVATE KEY-----
    MIICXQIBAAKBgQC5A/TPEmOQYgT2po11qvjeBUPEdqUEz1Z7MeHH7KI2p74pYK8R
    svYngy1cH/wnMXmsf+Wb3tmlqNGa7atW8wlpSfXXQV9bFECPEVRnESo8xtN7ZAlJ
    FcdRvBVgfVwC3m9HWpVvKnd9NREXIcg5NHh57q7ulsGCZJ2VOJm9EIgFEwIDAQAB
    AoGBALcfBVVXHBiyC7udSfInET+e8l4oGFjUZwJ0csaQnlV+XadSvLTF7wFYwrKm
    LcsVGxrzU+2c+ssOdrfjeW0MDEjrbd1xtmayP8Kh2/Pg+9jZqj188tTlLwzUW6iz
    KDEpiG5P1f1cbKY+R/BHQIKt7vcd2QMNVctxSkjl1uSvU/ERAkEA7uCuAJsVgmui
    NjDscoXyj+QRFWqDnUNCZqSqjYw7/BC36xYg/Xolw/bqg9aTgua96fv9k9hExOBY
    eNV3mj63bwJBAMZG7J5/vc3bkVwOS3A5E8j4hwCIFDylbKQ8chdulC3wwDLaSRdE
    evUfhAmMev1cc4QiVaXzGKPcS9ko8Gdz2p0CQAftfvjYLMOSTOTdhMtcNKuf1w1N
    5qZOeCKt7lcaQ1dfOqtbpaaj6iLxy+CqO2UJwV3FlinU8JtUEruX4gtFb5MCQGgb
    l2RFuHhdgH5wdwXOwme0rtYFnXKWfWvi3RkWk7FnhtNssBIKf/EzAhYtb+qWX4US
    rhv7f4WSRzUX/NqlBzUCQQCfDpC5/DZ/7RMKbDj7inW2G/3T56jzCdicIAgN0erZ
    jcbB7+8VQLjcw5LFYPwgjjz5v6Amw42VY+dBUNWVEH9C
    -----END RSA PRIVATE KEY-----

    JSEncrypt 使用私钥加密示例:

    // 创建 RSA 对象
    var crypt = new JSEncrypt();
    
    // 私钥
    var private_key = "-----BEGIN RSA PRIVATE KEY-----...";
    
    crypt.setPrivateKey(private_key);
    
    var encrypted = crypt.encrypt('123456');
    

    得到结果:

    bC8nemetJfmenSldUccrHcY+aMVBO1ANYJky42vKhv+8iMmecAmDSalOj/065+AZBRhsWuT0C26A5IJTnI9COpA3L1xV54Mwz8j3Y0DdGRqaAFH+lkibVj/JOsTYfKVWnPMwc0D/EL2IJdi18sct2s3CvGxp7+1sRayKSoPvTa8=

    RSA 加密得到的密文每次都不一样, 因为加入了随机数。

    JSEncrypt 使用公钥解密示例:

    var crypt = new JSEncrypt();
    var private_key = "-----BEGIN RSA PRIVATE KEY-----...";
    
    crypt.setPrivateKey(private_key);
    
    var decrypted = crypt.decrypt('123456');
    

    PHP 使用私钥加密示例:

    openssl_pkey_new(array('private_key_bits' => 1024));
    

    PHP 使用公钥加密示例:

    openssl_pkey_new(array('private_key_bits' => 1024));
    

    JSEncrypt 同时支持自动创建公钥和私钥:

    // 支持 512、1024、2048、4096
    // key 越长, 生成密钥和加密时间越长
    var crypt = new JSEncrypt({default_key_size: 1024});
    
    // 获取公钥
    var public_key = crypt.getPublicKey();
    
    // 获取私钥
    var private_key = crypt.getPrivateKey();
    

    利用 JSEncrypt 可以完成在前端网页对密码等敏感信息进行加密,传输到服务器端再进行解密。

    JSEncrypt 项目地址:https://github.com/travist/jsencrypt

    在 JSEncrypt 基础上实现的在线工具 —— RSA 加密解密

  • JavaScript 箭头函数 —— Arrow Function

    Arrow Function 是 ECMAScript6 中的新特性。

    先看两个酷炫的箭头函数示例:

    var a1 = [
    	"Hydrogen",
    	"Helium",
    	"Lithium",
    	"Beryl­lium"
    ];
    
    var a2 = a1.map(function(i){ return i.length });
    
    var a3 = a1.map( i => i.length );
    

    更炫

    var b1 = [4, 3, 2, 1];
    
    var b2 = b1.sort(function(i, j){ return i > j });
    
    var b3 = b1.sort((i, j) => i > j);
    

    在最新版的 Firefox 中可以体验这种特性。

    Arrow Function map

    Arrow Function sort

  • 使用循环实现斐波那契数列

    递归中比较常见的例子是斐波那契数列、汉诺塔。

    使用递归实现斐波那契数列其实很浪费,f(n) = f(n-1) + f(n-2)。在进一步计算 f(n-1) = f(n-2) + f(n-3),会发现 f(n-2) 被重复计算。

    下面是通过循环实现的斐波那契数列:

    function Fibonacci(number) {
    	var i, list = new Array();
    
    	list[0] = 0;
    	list[1] = 1;
    
    	for (i = 1; i < number; i++) {
    		list[i + 1] = list[i] + list[i - 1];
    	}
    
    	return list[number];
    }
    

    获取完整的斐波那契数列:

    function Fibonacci(number, full) {
    	var i, list = new Array();
    
    	list[0] = 0;
    	list[1] = 1;
    
    	for (i = 1; i < number; i++) {
    		list[i + 1] = list[i] + list[i - 1];
    	}
    
    	if (full) {
    		return list;
    	}
    
    	return list[number];
    }