ZRender 使用记录
在使用 ZRender 过程中遇到的一些问题…
基础链接:
ZRnder 文档
ZRender github
textLineHeight 行高配置无效在家实测 4.0.7 已经修复了这个问题,在公司用的 4.0.4,看了下 commit 记录 官网是在 4.0.6 修复这个问题的,是由于代码中对传入配置优先级的取舍导致的
12不再维护{% codepen OqVgGb js,result 300 100% ldinglding dark %}
多行( \n ) + 超出省略( outerWidth )
扶额 …
从测试代码看没有问题,可以实现多行时仅最后一行出省略符…的效果,那应该是我这块的宽度计算 outerWidth 有问题(我这边做的处理是根据传入的文本计算换行、自适应宽度、自适应高度、超出最大限制后出省略符)
12不再维护{% codepen LaVjMR js,result 300 100% ldinglding dark %}
事件到底如何使用上手的时候看文档是 zrender.Eventful.on ,就去查 Event ...
计算字的宽高
在不算多功能需求中,我们会遇到需要用JS来计算字宽高的情况,比如
canvas根据渲染文字计算换行、块的大小等
IE8及以下双行并且有省略符…
文字少的时候居中,文字超出的时候出省略符…
通常,我们采用建立伪节点来计算
123456789101112131415161718192021// 参数配置的形式function getTextSize (text, style = {}, container = document.body) { let dom = document.createElement('div') // dom.id = 'YOUR_SCOPE_measure' for (let attr in style) { dom.style[attr] = style[attr] } dom.style.opacity = 0 dom.style.display = 'inline-block' dom.innerText = tex ...
如何打乱数组? (洗牌算法)
定义问题既然要让计算机打乱数组,我们得先定义下“打乱”是什么?
让一个数组内的元素随机排列
那么,你怎么定义 随机 ?
要知道在计算机软件层面只能通过各种算法产生伪随机数,真正的随机必须结合物理和硬件来实现,比如可以根据周围电磁场的噪音生成之类
所以稍稍修改下目标:
让一个数组内的元素随机排列,并且每种排列结果尽可能少偏差
制定方案我们有那些随机打乱数组的算法呢?
1. sort + random1arr.sort(function() {return .5 - Math.random()});
运行结果 ↓(橙色正偏差,紫色负偏差,全部接近白灰最佳)
从结果看来这种算法并不好,究其原因,各浏览器 sort 的实现为了追求效率,并不会每两个元素都能进行比较和置换,那么可能性的分布就已经很不均了。
2. map + sort + random1234var random = array.map(Math.random);array.sort(function(a, b) { return rando ...
同源策略(CORS)探究
一、有哪些场景
由 XMLHttpRequest 或者 Fetch 发起跨域 HTTP 请求
Web FONT (CSS @font-face)
WebGL 贴图
canvas API 中的 drawImage
CSS 中的资源请求
二、简单的 CORS 实现在跨域 AJAX 请求中, 浏览器端无需做任何操作,会自动在 header 信息中添加一个 Orgin 字段;如果是 Fetch ,则需要添加字段 mode: 'cors' 。
1234567891011GET http://square.10jqka.com.cn/usercenter/strategy/getrecommendlist HTTP/1.1Host: square.10jqka.com.cnConnection: keep-alivePragma: no-cacheCache-Control: no-cacheAccept: */*Origin: http://www.10jqka.com.cnUser-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) ...
Fetch 和 Ajax 有什么差别
首先让我们来现清理下概念
Ajax 最正确的概念应该是 异步 JavaScript 和 XML (Asynchronous Javascript And XML) ,是指通过核心对象 XHR (XMLHTTPRequest) 达到一种向服务器提出请求并处理响应而不阻塞用户的技术,为Web交互方向打开了新的大门。再后来,由于很多框架都封装了对应的 Ajax 方法,比如大名鼎鼎的 jQuery 中的 $.ajax(url, func),很多开发者开始直接称呼这类对 XHR (XMLHTTPRequest) 对象进行方法封装的方法为 Ajax 。
而 Fetch 这种新方法提供了一种简单,合理的方式来跨网络异步获取资源。
下面来了解下 Fetch 在使用中和 Ajax 的差别~
一、Promise标准提到 Fetch 和 Ajax 最大的不同,应该是 Fetch 是基于标准 Promise 实现,支持 async/await
试试这个简单的请求
1234567fetch('http://example.com/movies. ...
VPS出事的又一天
今天 vps 又被禁了,记一下检查流程 ╮(╯▽╰)╭
S1.检查是不是机子挂了进行海外连接ip测试站长工具 ping.chinaz.com/ 选择“海外”进行测试
如果全部超时,机子挂了,解决方案:
可能搬瓦工机房服务器处于维修状态,这个页面 可以查看当前机房服务器状态,绿色是正常
重启
重装
提交工单,找客服
备用 ip 测试工具
http://ping.pe/
S2. 检查是否ip被禁进行国内连接 ip 测试 同S1, 选择所有国内站点进行测试,如果全部超时,ip被封无疑
更换ip
免费更换地址 登陆后,点击 Test ,如果 bwg 检查 ip 确实被封,可以免费换(现在是,每十周并且被封才能免费换)
收费更换地址
S3.检查是否端口被封
telnet IP 端口
如果不是 ssh 端口被封还好,把自己暴露的服务端口改下重启,麻烦的是要通知所有用你机子的人..
SSH 端口被封
修改配置文件,修改/添加端口号
1vim /etc/ssh/sshd_config
...
了解你使用的 Sort ( 实现剖析) - 3
先上图, 本篇文章涉及 归并排序 和 基数排序 两种算法
往期:
了解你使用的 Sort ( 实现剖析) - 1 中,介绍了 **插入排序** 和 **交换排序** 中四种排序算法
了解你使用的 Sort ( 实现剖析) - 2 中,介绍了 **选择排序** 中两种算法
归并排序归并排序使用分治法,核心在于数列的“分”与“合”,不断地将两个已排好序的数组合并一个有序数组
思路:
将数组分割为两个部分,创建新的数组a1和 b1
如果a1的长度大于2,则继续执行1过程,直至ai
将ai中两个数字进行比较交换位置形成有效数组
递归向上比较两个数组大小并合并成新的有序数组 (例如比较数组第一位,即可得出哪个数组更小)
参考动画去理解 ↓
基数排序前置条件:
必须为整数数组,或者你可以转化为整数数组
知道数组的位数范围(比如 0 - 999 最多三位)
基数排序是桶排序的改进算法。由于桶排序需要创建数组数据范围长度的空间,很浪费空间,基数排序则是一个逐位(个位、十位、百位等)的桶排序,空间仅需长度为10的数组
思路:
首先只关注数组a中每个数的个位 ...
了解你使用的 Sort ( 实现剖析) - 2
先上图, 本篇文章涉及 选择排序 中两种算法
往期:
了解你使用的 Sort ( 实现剖析) - 1中,介绍了 **插入排序** 和 **交换排序** 中四种排序算法
直接选择思路:
遍历数组a[0]-a[n]并得出最小值a[j], 将a[0]与a[j]互换
遍历数组a[1]-a[n]并得出最小值a[j], 将a[1]与a[j]互换
循环直至结束
参考动画去理解 ↓
堆排序核心:将数组构造成二叉堆↓(左侧数组,右侧对应二叉堆)
二叉堆(英语:binary heap)是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆。当父节点的键值总是大于或等于任何一个子节点的键值时为“最大堆”。当父节点的键值总是小于或等于任何一个子节点的键值时为“最小堆”。
思路:
构建二叉堆 (注意如果子节点与父节点交换了位置,则交换位置后的父节点仍需要向下验证)
解构二叉堆为数组(注意二叉堆两个子节点的大小关系是不保证的,需要做比较)
& ...
了解你使用的 Sort ( 实现剖析) - 1
先上图, 本篇文章涉及 插入排序 和 交换排序
基础插入排序思路:
将数组分为已完成排序部分和未完成排序部分,总是左侧为已完成部分
首先第 0 位归为已完成排序部分
将未完成排序部分中最左侧的数字依次与已完成排序部分的进行比较,如果左侧数字更大,则交换两那个数字,直至没有交换,至此已完成排序部分多一位
重复第三步操作直至未完成排序部分清空
参考动画去理解,小方块都绿是每个循环的结束 ↓
Shell 排序 (希尔排序)由于基础插入排序每次都是一个挨着一个数字比较,希尔排序是对数字移动次数减少的一个改进算法。
定义一个正整数 d1 (可以理解为步数)
从第 0 位至 arr.length-d1 位遍历,将当前位 i 与 i+d1 为进行比较,如果第 i 位数大于 第 i+d1 位,则进行交换
再定义一个正整数 d2 (d2 < d1) 执行同2步骤
重复上述操作直至取 di=1,即对整个数组进行一次插入排序
可以理解为为了大概率减少数字间的交换,设计的一种增量逐步减少式的插入排序
一般 d1 选择 arr.length/2, ...
意料之外的排序(Sort "Bug")
数字排序先抛出一个你一定遇到过的问题
当我们对一个数组进行排序的时候,你会发现结果诶??再仔细一看,怎么像是感觉根据字符串排序了,我传入的明明是数字..
★ 所以第一个点,我们要记住compareFunction默认是会转换为字符串按照字符的 Unicode 位点进行排序的
1arr.sort([compareFunction])
数字排序要这样写
12345678arr.sort(function(a, b) { return a - b})// orarr.sort((a, b) => a - b)
中文排序上面提到 compareFunction 默认是按照 Unicode 点位进行比较的,那么中文肯定是不能如图这样排序了
这时候,你需要一个转化为其他字符集来比较的方法 String.localeCompare。
1referenceStr.localeCompare(compareString[, locales[, options]])
实现 ↓
localeCompare 可以指定具体语言进行字符的比较,不过这个目前 ...