独书先生 Menu

Viewing all items for tag js

验证码服务 2Captcha 测评 2022 | 原理 用途 入门

原文:https://lwebapp.com/zh/post/2captcha-review

背景

大家对网页验证码肯定不陌生,几乎所有带有登陆功能的网页或者 APP,都有验证码功能。

验证码不一定每一次登陆都会出现,但是当你登陆多次失败的时候就会让你输入验证码问题答案了,主要是为了防止你恶意登陆其他人的账户。或者有的网站更严格,每一次都会弹出验证码窗口,这种验证码通常为了防止机器人登陆,就像以前的 12306 火车票网站,每次买票的时候都会弹出验证码,而且很难校验成功,确实把脚本拦住了,但是把我们正常用户也拦住了。

Continue reading…

js颜色值按深浅排序 支持rgb/hex/hsl

根据颜色深浅排序

需求

最近参照组件库的设计,获取常用的组件颜色,比如这样的一系列灰色值

#fafafc
#f8f8f8
#f5f5f5
#efefef
#e0e0e0
#d9d9d9
#cccccc
#cbcbcb
#bfbfbf

然后要给它们由浅到深排个序,便于使用时知道加深程度,有个对比。

解决方案

将获取到的颜色统一转化为rgb格式,用公式r*0.299 + g*0.587 + b*0.114计算得到每一个颜色的灰度值,从小到大进行由浅到深的排序。

其中还要解决颜色的转化,以支持识别各类颜色。

代码

转换十六进制色值为rgb格式

function hextoRgb(color) {
  color = color.slice(1);
  var rgb = "";
  for (var i = 0; i < color.length; i += 2) {
    var end = i + 2;
    rgb += parseInt(color.slice(i, end), 16).toString() + ",";
  }
  rgb = rgb.slice(0, rgb.length - 1);
  rgb = "rgb(" + rgb + ")";
  return rgb;
}

hsl格式 转rgb

function getMid(str) {
  var left = str.indexOf("(") + 1;
  var right = str.indexOf(")");
  return str.slice(left, right);
}
//  hsl格式 转rgb
function hslToRgb(color) {
  var arr = getMid(color).split(",");
  var r, g, b;
  var h = toNum(arr[0] / 360 + ""),
    s = toNum(arr[1]),
    light = toNum(arr[2]); // h(色相) s(饱和度) l(亮度)
  var temp2, temp1;
  if (s == 0) {
    r = g = b = light;
  } else {
    temp2 = light < 0.5 ? light * (1 + s) : light + s - light * s;
    temp1 = 2 * light - temp2;

    var h2rgb = function (p, q, t) {
      if (t < 0) t += 1;
      if (t > 1) t -= 1;
      if (t < 1 / 6) return p + (q - p) * 6 * t;
      if (t < 1 / 2) return q;
      if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
      return p;
    };
    r = h2rgb(temp1, temp2, h + 1 / 3);
    g = h2rgb(temp1, temp2, h);
    b = h2rgb(temp1, temp2, h - 1 / 3);
  }
  return (
    "rgb(" +
    Math.round(r * 255) +
    "," +
    Math.round(g * 255) +
    "," +
    Math.round(b * 255) +
    ")"
  );
}
function toNum(str) {
  var rex = /[0-9]+/g;
  if (str.indexOf("%") > 0) {
    return str.match(rex)[0] / 100;
  } else {
    if (typeof +str === "number") {
      return +str;
    }
  }
}

获取颜色灰色值

function grayLevel(color) {
  color = isRgb(color)
    ? color
    : isHex(color)
    ? hextoRgb(color)
    : hslToRgb(color);
  var arr = getMid(color).split(",");
  var r = arr[0],
    g = arr[1],
    b = arr[2];
  return r * 0.299 + g * 0.587 + b * 0.114;
}

各类颜色判断

// 是否为rgb颜色值
function isRgb(color) {
  return /^rgb/.test(color);
}
// 是否为十六进制颜色值
function isHex(color) {
  return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(color);
}
// 是否为hsl颜色值
function isHsl(color) {
  return /^hsl/.test(color);
}

工具

小编直接做了一个颜色转换工具,方便直接使用

颜色排序

总结

主要代码也是参照网上大神来做的,小编觉得还有很多优化空间,包括各类颜色的转换,颜色的处理,颜色json的处理等。

参考

js颜色改变深浅 判断浅色自动加深

需求

工作中的需求,动态获取页面中的一个颜色值,应用到另一个元素的背景上,这样保持页面元素的颜色搭配比较统一。

难点

颜色值可以用户任意定义的,但是应用元素的文字字体颜色是固定白色的,这样如果用户定义的是浅色,那么应用元素的背景设置为浅色这个元素的文字就会看不清楚,如下

文字内容

方案

为了白色文字可以看清楚,考虑把浅色背景统一加深处理,已是深色不处理
Continue reading…

精确判断js对象类型的方法

1.区别数组还是对象

var arr = [1, 2, 3];

var obj = {“a”: 3, “b”: 4};

判断数组:typeof arr  == “object” && arr.length != undefined

或者arr instanceof Array == true

注意 :arr instanceof Object == true所以instanceof和typeof一样不能单独使用来判断对象

判断对象:typeof obj== “object” && obj.length == undefined

原理:(1) 数组和对象使用typeof都是object

(2) 对象没有长度

 

2.判断数据类型:

编写数据类型判断的通用函数

function getType(obj){
var toString = Object.prototype.toString;
var map = {
'[object Boolean]' : 'boolean',
'[object Number]' : 'number',
'[object String]' : 'string',
'[object Function]' : 'function',
'[object Array]' : 'array',
'[object Date]' : 'date',
'[object RegExp]' : 'regExp',
'[object Undefined]': 'undefined',
'[object Null]' : 'null',
'[object Object]' : 'object'
};
if(obj instanceof Element) {
return 'element';
}
return map[toString.call(obj)];
}

引用自:sysuzhyupeng 感谢!