拖放事件有的事件在被拖放元素上触发,有的事件则在放置目标上触发。 可拖动元素在某个元素被拖动时,会触发以下事件: dragstart、 drag、dragend 。在按住鼠标键不放并开始移动鼠标的那一刻,被拖动元素上会触发 dragstart 事件。拖动开始时。 dragstart 事件触发后,只要目标还被拖动就会持续触发 drag 事件。当拖动停止时,会触发 dragend 事件。 给一个元素添加 draggable="true" 属性,可以拖动元素。目标元素把元素拖动到一个有效的放置目标上时,会依次触发以下事件: dragenter、dragover、dragleave 或 drop。把元
1,实现在终端同一行输出不同内容import readline form 'readline';
console.clear();
setInterval(() = { //删除光标所在行
readline.clearLine(process.stdout, 0); //移动光标到行首
readline.cursorTo(process.stdout, 0, 0)
process.stdout.write(new Date().toLocaleString(), 'utf-8');
}, 1000);
2, 实现进度条import readline form 'readline
一,过去
跨站请求伪造,也称为CSRF或XSRF, 它源于网站必须向另一个站点发出请求的简单功能。
假设我在 https://a.com 面中嵌入了以下表单。
form action="https://your-bank.com/transfer" method="POST" id="stealMoney"
input type="hidden"name="to"value="Scott Helme"
input type="hidden"name="account"value="14278935"
input type="hidden"name="amount"v
很多视口我们要对横屏和竖屏显示不同的布局,所以我们需要检测在不同的场景下给定不同的样式:1 JavaScript检测横屏window.orientation:获取屏幕旋转方向window.addEventListener("resize", ()= {
if (window.orientation === 180 || window.orientation === 0) {
// 正常方向或屏幕旋转180度
console.log('竖屏');
};
if (window.orientation === 90 || window.orientation === -9
在 JavaScript 中直接输出 0.1 + 0.2 结果是 0.30000000000000004。原因如下:JavaScript 使用 Number类型表示数字(整数和浮点数),计算机遵循IEEE 754标准,所有语言都会有这个问题。通常用64位来表示一个数字:第0位:符号位,0表示正数,1表示负数(s);第1位到第11位:储存指数部分(e);第12位到第63位:储存小数部分(即有效数字)f。十进制转换为二进制方法是,小数本身乘以2,取整数位作为二进制表示位,然后取其小数位参与计算(乘以2),如此循环往复,只至小数位乘以2的结果为零。结果0.1和0.2的二进制,后面无限循环多余的数将会
文章表中,tags 字段存储着一个或者多个标签,标签之间使用“,”隔开,比如,一篇文章的 tags 字段是 “前端,JavaScript,SCSS,HTML”,现在想删除“JavaScript”,变成 “前端,SCSS,HTML”。方法如下:UPDATE tb_article AS a SET a.tags=TRIM(BOTH ',' FROM REPLACE(concat(',',a.`tags`,','), ',JavaScript,', '')) WHERE FIND_IN_SET('JavaScript', a.tags);
核心部分是:UPDATE tb_article AS a S
在浏览器中 RESTful API 执行 delete 返回204无法获取 Body,也就是说执行成功后,只能返回空的。无法获取到返回的 Body 内容。使用 restclient 可以获取到 body。大多数人都认为204是成功删除的良好响应代码,因为通常没有充分的理由在删除某些内容后返回响应正文。所以,如果 delete 操作成功且响应主体为空,则返回204。如果 delete 操作成功且响应主体为非空,则返回200。
update tb_article set created_at=date_add(created_at,interval+600 day);
update wp_posts set post_date=date_add(post_date,interval+600 day);
update wp_posts set post_date_gmt=date_add(post_date_gmt,interval+600 day);
update wp_posts set post_modified=date_add(post_modified,interval+600 day);
update
由于 JavaScript 暂时无法直接编译成可执行的二进制代码,对 JavaScript 代码进行混淆加密,就是 JavaScript 代码保护的正确方法。JavaScript 混淆加密有不少产品可用,有免费开源的,也有商业的。免费的比如uglifyjs 、javascript-obfuscator、商业的比如jscrambler、JShaman,特别值的一提的是jshaman,不但强大,而且是国产的,是具备研发能力,有核心竞争力的国内产品,在js代码保护领域,jscrambler是国际顶级的厂商,而国内的jshaman比它毫不逊色。比如一段js代码:function NewObject(p
阿里巴巴 Java 编程规范,【强制】任何货币金额,均以最小货币单位且为整型类型进行存储。为什么要这样做呢,因为常常出现数据库里的数据获取后,直接返回给前端的。因为在数据传输过程中使用的是2进制,数据在进制转换时会丢失精度。浮点数使用JSON等格式传输数据时,会被转为二进制,二进制下很多浮点数是无限小数,而传输数据时候又不可能把无限制的传输这个数,只能把它截断,当浮点数被截断后,再转回十进制,就不是一个精确值了,所以就会出现接口返回{"a":0.3},但是调用接口实际获得{"a":0.30000000000000004}的问题。参考:https://javascript.net.cn/arti
用 JavaScript 实现数字增加滚动动画方案一: h1 id="numBox" /h1
script
function numRunFun(num, maxNum){
var numBox = document.getElementById("numBox");
var num = num;
var maxNum = maxNum;
var timer = setInterval(function(){
num++;
if(num = maxNum){
numBox.innerHTML = ma
使用 new Date(string) 构造 Date 对象,如果传入非日期格式的字符串,仍然能构造出 Date 对象,输出date,结果为Invalid Date使用typeof判断date的类型,得到结果为“object”使用instanceof检测date是否为Date类型,结果为true。使用Date的getTime()方法,Invalid Date对象返回的是一个NaN,可以利用这点来检查Date对象是否为Invalid Date。 new Date(dateString)参数dateString一个符合 RFC2822 或 ISO 8601 日期格式的字符串(其他格式也许也支持,但
使用 url.parse() 函数转换
'https://www.yuque.com!.evil.com'
'https://www.yuque.com%0a.evil.com'
会变成:
'https://www.yuque.com/!.evil.com'
'https://www.yuque.com/%0a.evil.com'
可以看到 legacy API 并不认为 ! 字符属于域名的一部分,所以原始的 www.yuque.com!.evil.com 域名其实是非法的,而为了不抛异常,legacy API 尝试对它进行了一次转换,把它当成 www.yuque.com/!.ev
代码: p
啦啦啦啦 啦啦 啦啦啦
div 呱呱呱 /div
/p
在浏览器中渲染成了: p 啦啦啦啦 啦啦 啦啦啦 /p
div 呱呱呱 /div
p /p
原因是 p 标签里面不能嵌套 ul、div 等块级元素,只能嵌套行内元素。h1~h6之间也不能相互嵌套。
例子:select
SUBSTRING_INDEX(thumbnail,'/',-1) as file_name,
thumbnail,
SUBSTRING_INDEX(thumbnail,'.',-1) as suffix,
from tb_article where thumbnail != '';
介绍:这里用到 MySQL 的 SUBSTRING_INDEX(str,delim,count) 函数,LENGTH(str) 函数,REPLACE(str,from_str,to_str) 函数,和数据库的一张辅助表help_topic(这张表在默认的mysql库里)。SUBST
JavaScript中的数据类型自动转换时,空数组[]或空对象{}都的布尔类型不是false,而是 true当JavaScript遇到预期为布尔值的地方(比如if语句的条件部分),就会将非布尔值的参数自动转换为布尔值。系统内部会自动调用Boolean函数。因此除了以下六个值,其他都是自动转为true:undefinednull-00或+0NaN''(空字符串)
&::-webkit-scrollbar {
width: 5px;
height: 8px;
background-color: #aaa; /* or add it to the track */
}
&::-webkit-scrollbar-thumb {
background: #000;
}
主要文档:https://developer.mozilla.org/zh-CN/docs/Web/CSS/::-webkit-scrollbar
因为各种现代话框架的流行,SQL 注入的威胁相对已经减少很多。但是在看不见的角落,还是存在SQL注入的威胁。SQL 预处理可以解决绝大部分 SQL 注入问题,但是有些地方不能预处理,或者需要变通的方式处理这些问题。比如表名/列名/排序动态传入的场景,这些地方不能预编译,因此很多人还是直接拼接的,而没有有效过滤。 还有 LIKE语句/IN语句中,因为这两个地方的预编译写法都有些特殊,比如 IN 常常使用 FIND_IN_SET 函数代替。
Node.js 18.x 开始支持内置单元测试
单元测试很重要,很多新兴的编程语言都是会内置对应的能力,但 Node.js 这块一直都是由社区来实现,前端同学耳熟能详的 Test Runner 有 Mocha、Jest。
2022年04月19日正式发布的 Node.js 18.x ,终于,官方支持了 Test 能力。Fetch API 也被集成到这个版本中了。测试 API 接口在一定程度上代替 SuperTest 了。
代码:
import test from 'node:test';
import assert from 'assert/strict';
// 等价于 describe()
MySQL 中,不可直接修改数据库名称。有一种变通的方式如下:如果有一个数据库名称是 “old_database”,想把这个数据库的名字改成 “new_database”;首先创建一个新的数据库 “new_database”create database new_database;
获取所有源库的表名use information_schema;
select table_name from TABLES where TABLE_SCHEMA=’old_database’;
然后按照以下命令一个个修改rename table old_database.[tablename] to new_da
所有标签