杂货铺


  • 首页

  • 归档

  • 标签

  • 搜索

UEditor 入门学习

发表于 2017-09-28 | | 阅读次数
字数统计 1,411 | 阅读时长 6

通过 UE.getEditor('containerId') 来获取编辑器。

配置

1
2
3
4
5
6
7
8
9
var ue = UE.getEditor('container', {
toolbars:[
['在这里配置工具栏内容'],
['这里配置第二行的工具栏内容']
],
autoHeightEnabled: true,
...
这里配置其他配置项: true
});

可以通过 ue.getOpt('配置项名称') 方法来读取配置项。
详细配置项内容可以访问官方文档了解更多。

二次开发

通过 registerUI 这个方法来添加扩展的内容:

1
2
3
UE.registerUI('uiname',function(editor, uiname) {
// do something
}, [index,[editorId]]);

阅读全文 »

AngularJS 平滑升级指南

发表于 2017-08-04 | | 阅读次数
字数统计 1,082 | 阅读时长 4

分离 controller 的 function

1
2
3
app.controller('myController', ['$scoppe', function($scope){
// AngularJS 中定义controller
}])

写成两个文件:
负责注册所有controller的文件

1
2
3
4
// app-controller.js
app.controller('firstController', ['$scope', firstCtrl])
.controller('secondController', ['$scope', secondCtrl])
.controller(...)

与其余单个controller文件

1
2
3
4
// first.controller.js
var firstCtrl = function($scope) {
$scope.info = 'hello world';
};

这样代码就会变得清晰,一个注册 conrtroller 的文件与其他负责完成业务逻辑与交互逻辑的单个 controller 文件。

这里需要注意的一点是,app-controller.js 用到了 first.controller.js 中的 firstCtrl 方法,所以需要在调用注册函数之前定义这些方法。

阅读全文 »

数组常用方法

发表于 2017-07-21 | | 阅读次数
字数统计 1,227 | 阅读时长 5

array.concat(item…)

concat 方法产生了一个新数组,它包含一份 array 的浅复制,并把一个或多个参数 item 附加在其后。如果参数 item 是一个数组,那么它的每个元素会被分别添加。

1
2
3
4
var a = ['a', 'b', 'c'];
var b = [1, 2, 3];
var c = a.concat(b, 'another');
console.log(c); // ['a', 'b', 'c', 1, 2, 3, 'another']

array.join(separator)

join 方法把一个 array 构造成一个字符串。它先把 array 中的每个元素构造成一个字符串,接着用一个 separator 分隔符把它们连接在一起。默认的 separator 是逗号’,’。要想做到无缝连接可以用空字符串’’作为 separator 。

1
2
3
var a = ['a', 'b', 'c'];
var b = a.join('');
console.log(b); // 'abcd'

array.push(item…)

push 方法把一个或多个参数 item 附加到一个数组的尾部。和 cacat 方法不同的是,它会修改 array ,如果参数 item 是一个数组,它会把参数数组作为单个元素整个添加到数组中,并返回这个 array 的新长度值。

1
2
3
4
5
var a = ['a', 'b', 'c'];
var b = [1, 2, 3];
var c = a.push(b, 'another');
console.log(a); // ['a', 'b', 'c', [1, 2, 3], 'another']
console.log(c); // 5

阅读全文 »

重绘与回流

发表于 2017-07-11 | | 阅读次数
字数统计 1,186 | 阅读时长 4

在面试的时候被问到重绘(Repaint)与回流(Reflow),虽然自己之前有了解过,但是也是有印象,所以这次去网上查了资料,好好总结下。

虽然在 PC 端,重绘与回流对性能的影响微乎其微,但是在移动端,这两者简直是性能杀手。

浏览器解析过程

首先我们要明白的是浏览器的解析过程,才能更好地理解重绘与回流。解析过程大致分为以下四步:

  1. 解析 HTML 以构建 DOM 树
    渲染引擎开始解析 HTML 文档,转换树中的 HTML 标签到 DOM 节点。生成内容树。
  2. 构建渲染树
    解析 CSS 成样式结构体,根据 CSS 选择器计算出节点的样式,创建另一个树:渲染树
  3. 布局渲染树
    从根节点递归调用,计算每一个元素的大小、位置等,给每个节点所应该出现在屏幕上的精确坐标。
  4. 绘制渲染树
    遍历渲染树,每个节点将使用 UI 后端层来绘制。
    阅读全文 »

Node.js 中的 MongoDB 基本操作

发表于 2017-07-02 | | 阅读次数
字数统计 1,120 | 阅读时长 5

Node.js 中 MongoDB 数据库操作

起步

首先安装 Node.js 和 MongoDB。

然后添加模块

1
npm install mongodb

示例

导入 MongoDB

1
var mongoClient = require('mongodb').MongoClient;

连接数据库

1
2
3
4
5
mongoClient.connect('mongodb://localhost:27017/myDatabase', function(err, db) {
...//在此进行增删查改
});

阅读全文 »

express 基础

发表于 2017-06-25 | | 阅读次数
字数统计 1,101 | 阅读时长 5

基于 Node.js 平台的 web 应用开发框架,并且不会对 Node.js已有的特性进行二次抽象。

安装:

1
2
npm : npm install express
yarn : yarn add express

导入:

1
2
const express = require('express');
const app = express(); // app为express的实例

路由功能 router

路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。

每一个路由都可以有一个或者多个处理器函数,当匹配到路由时,这些函数将被执行。

阅读全文 »

JS实现常用排序算法

发表于 2017-06-18 | | 阅读次数
字数统计 1,810 | 阅读时长 7

插入算法

它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。具有n个元素时它需要经过n-1趟排序。对于p = 1到p = n-1趟,插入排序保证从位置0到位置p上的元素为已排序状态。它就是基于这个事实来排序的。
插入排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function insertionSort(arr){
//如果数组的长度小于等于1,直接返回数组
if (arr.length <= 1) return arr;
//遍历数组
for (var i = 0; i < arr.length; i++){
//取到当前数值,往前查找,看时候有比该数值大的数
for(var j = i-1; j >=0; j--){
//如果存在下标小的数大于下标大的数
if (arr[i] < arr[j]){
//交换两个数字的位置
var temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
return arr;
}

最好的情况只需要 n-1 次操作完成,最坏则需要 n(n-1)/2 次。插入算法的时间复杂度为 O(n^2) 。因而插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,插入排序还是一个不错的选择。

阅读全文 »

模版引擎 nunjucks

发表于 2017-06-10 | | 阅读次数
字数统计 428 | 阅读时长 2

在 js 中,通过 nunjucks.render(模板名 name , 数据 context) 来得到页面数据,可通过 res.end(数据) 将页面传递出去。

  • 注释

    1
    {# 注释 #}
  • 变量

    1
    {{ 变量名 }}
  • if 判断

    1
    2
    3
    4
    5
    6
    7
    {% if 条件1 %}
    执行内容1;
    {% elif 条件2 %}
    执行内容2;
    {% else %}
    执行内容3;
    {% endif %}
  • for 循环
    for 可以遍历数组和对象

    1
    2
    3
    4
    5
    <ul>
    {% for item in items %}
    <li>{{ item }}</li>
    {% endfor %}
    </ul>
阅读全文 »

工厂模式与备忘录模式实例详解

发表于 2017-05-31 | | 阅读次数
字数统计 837 | 阅读时长 3

工厂模式

适用于大批量创建同类型的对象,通过同一个接口创建对象,根据传入的参数不同从而创建不同内容的对象,让这个接口由子类决定实例化哪一个类。
优点:解决了多个类似对象声明的问题,易于维护和扩展,稳定性好。
推荐场景:1. 对象的构建十分复杂。 2. 需要依赖具体环境创建不同实例。 3. 处理大量具有相同属性的小对象。

实施过程:

  1. 提供父构造函数
  2. 设置父构造函数的原型对象
  3. 定制不同对象上的差异化属性(设置子构造函数–>父构造函数的静态方法)
  4. 在父构造函数上添加静态工厂方法
    1. 判断是否支持生产
    2. 设置子构造函数(父构造函数的静态方法)的原型对象
    3. 修正构造器属性
    4. 返回利用子构造函数创建的实例对象
  5. 使用父构造函数的静态工厂方法创建指定的对象
阅读全文 »

单例模式实例详解

发表于 2017-05-23 | | 阅读次数
字数统计 1,199 | 阅读时长 4

保证一个特定的类只有一个实例(并且永远是同一个)
在JavaScript中,只有对象没有类,要实现单例模式也有多种方法。

最简单的方式:通过字面量来创建对象,因为在JS中对象之间永远不可能相等,除非它们是同一个对象
使用字面量创建的对象总是唯一的。

实现单例模式的的几种途径

  1. 在代码中提供一个全局变量来存储创建出来的实例。缺点:该全局变量可能会被轻易的修改和覆盖
  2. 尝试在构造函数的静态成员中缓存实例属性。缺点:函数的静态属性在外部可以直接修改,容易导致实例对象的丢失。
  3. 将实例对象包装在闭包中,安全性好,无法轻易修改。缺点:有额外的闭包开销。
    阅读全文 »
123
Shine Hwong

Shine Hwong

纸上得来终觉浅,绝知此事要躬行

25 日志
62 标签
GitHub
© 2017 Shine Hwong
由 Hexo 强力驱动
主题 - NexT.Pisces