之前和人聊天的时候,因为某个平板事件(传送门:逆向分析防沉迷平板后,终于看到抄代码的恶果…),说到:CSDN 就是依托答辩。
但自己还是认为,大功能(上百行)可能确实就是答辩。
如果只是一二十行的小功能,总不会运气还这么差吧?
吧?
………………………………
好家伙,结果几天真让我遇到了这么一坨……
本来是想去抄一下通过 marked 来高亮代码的,找到了 CSDN 中某篇帖子,一看,似乎还挺靠谱,就粘贴复制。
结果嘛……
先把人家的代码贴在这里,齐文共欣赏。
代码看完了吧,看完了开始分析一下这段代码。
对了,如果你把上面的代码直接粘贴复制到自己的代码里,会报语法错误。
为啥捏?
因为作者没有把最后一行的})
给贴上来。
所以,呵呵……
这还算是开胃菜,接下来开始正式分析代码。
首先,第 14 行,作者你告诉我,你这里塞个 i 进去干嘛?
这样一来,输出的不就变成了下面这样了么?
哦,对了,我差点忘了问,作者你的 i 为啥从 1 开始?
如果是为了避免拿到第一行,那你最后为啥又不在 rowCount 上剪1,去掉最后一行呢?
当然,可以说这就是为了展示一下 ol 列效果而已,最后的替换要自己干云云,那我也就认了吧……
但请作者你看一下你 22 行写的代码。
appendChild?
appendChild?
appendChild?
这么做的结果就是把整理好的 ol 整个附加到之前 pre code
的后面,变成下面这样子。
等吐掉一口血后,开始改代码,然后发现了第 17 行的问题。
这位作者,你知道 outerHTML 是什么意思么?
假设有如下代码;
<div id="box">
<div class="code">123</div>
</div>
我们的目的是要取 <div class="code">123</div>
这段内容。
在 #box 上用 outerHTML ,就是取到把上面所显示的所有的代码本。
但我们要取的是 <div class="code">123</div>
这段内容,刚好多了最外层的 #box 自己的 html 代码。
所以,这里不能用 outerHTMl
,而应该用 innerHTML
。
或许之前猜人家的 i 从 1开始真是因为要取到最外面的那层 html 结构?
等把这里的代码改完,一刷新页面,你就会很开心的发现,代码变成了下面这个样子。
一口老血吐出……
接下来,就懒得再去吐槽了,直接贴上改过之后的代码:
//封装成一个指令,highlight是指令的名称
Vue.directive('highlight', (el) => {
let blocks = el.querySelectorAll('pre code');
blocks.forEach((block) => {
// 创建ol标签元素
let ol = document.createElement("ol");
// 2.根据换行符获取行数,根据获取的行数生成行号
const partList = block.innerHTML.split('\n');
for (const part of partList) {
// let rowCount = html.split('\n').length;
// for(let i=1;i < rowCount;i++){
// 创建li标签元素
let li = document.createElement("li");
// 将生成的行号添加到li标签中
li.innerHTML = part;
// li.appendChild(text);
// 将li标签添加到ol标签中
hljs.highlightBlock(li);
ol.appendChild(li);
}
block.innerHTML = ol.outerHTML;
});
});
吐槽完了,看点小电影回回血。