# 设备相关

工作中遇到的各种验证

# 生成 UUID


const UUIDGeneratorBrowser = () =>
  ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
    (
      c ^
      (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))
    ).toString(16)
  );

UUIDGeneratorBrowser(); // '7982fcfe-5721-4632-bede-6000885be57d'

# 判断手机是 Andoird 还是 IOS


/** 
 * 1: ios
 * 2: android
 * 3: 其它
 */
export const getOSType=() => {
  let u = navigator.userAgent, app = navigator.appVersion;
  let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;
  let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
  if (isIOS) {
    return 1;
  }
  if (isAndroid) {
    return 2;
  }
  return 3;
}

# 查看设备是否支持触摸事件


const supportsTouchEvents = () =>
  window && 'ontouchstart' in window;

supportsTouchEvents(); // true

# 查看用户偏好的配色方案


const prefersDarkColorScheme = () =>
  window &&
  window.matchMedia &&
  window.matchMedia('(prefers-color-scheme: dark)').matches;

prefersDarkColorScheme(); // true

# 查看当前用户的首选语言


const detectLanguage = (defaultLang = 'en-US') =>
  navigator.language ||
  (Array.isArray(navigator.languages) && navigator.languages[0]) ||
  defaultLang;

detectLanguage(); // 'nl-NL'

# 检测 Caps Lock 是否开启



= "="" data-textnode-index-1665284257729="153" data-index-1665284257729="1161" class="character">"username "="" data-textnode-index-1665284257729="153" data-index-1665284257729="1170" class="character">">Username: = "="" data-textnode-index-1665284257729="156" data-index-1665284257729="1201" class="character">"username "="" data-textnode-index-1665284257729="156" data-index-1665284257729="1210" class="character">" name= "="" data-textnode-index-1665284257729="158" data-index-1665284257729="1217" class="character">"username "="" data-textnode-index-1665284257729="158" data-index-1665284257729="1226" class="character">"> = "="" data-textnode-index-1665284257729="163" data-index-1665284257729="1241" class="character">"password "="" data-textnode-index-1665284257729="163" data-index-1665284257729="1250" class="character">">Password: = "="" data-textnode-index-1665284257729="166" data-index-1665284257729="1281" class="character">"password "="" data-textnode-index-1665284257729="166" data-index-1665284257729="1290" class="character">" name= "="" data-textnode-index-1665284257729="168" data-index-1665284257729="1297" class="character">"password "="" data-textnode-index-1665284257729="168" data-index-1665284257729="1306" class="character">" type= "="" data-textnode-index-1665284257729="170" data-index-1665284257729="1313" class="character">"password "="" data-textnode-index-1665284257729="170" data-index-1665284257729="1322" class="character">"> = "="" data-textnode-index-1665284257729="173" data-index-1665284257729="1335" class="character">"password-message "="" data-textnode-index-1665284257729="173" data-index-1665284257729="1352" class="character">" style= "="" data-textnode-index-1665284257729="175" data-index-1665284257729="1360" class="character">"display: none "="" data-textnode-index-1665284257729="175" data-index-1665284257729="1374" class="character">">Caps Lock is on
const el = document.getElementById('password'); const msg = document.getElementById('password-message'); el.addEventListener('keyup', e => { msg.style = e.getModifierState('CapsLock') ? 'display: block' : 'display: none'; });

# 检测暗模式

在某些情况下,我们可能希望在激活暗模式时做一些额外的事情,使用这段代码来检查暗模式是打开还是关闭。


const isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
console.log(isDarkMode)

# 华氏到摄氏温度转换


const celsiusToFahrenheit = (celsius) => celsius * 9/5 + 32;
const fahrenheitToCelsius = (fahrenheit) => (fahrenheit — 32) * 5/9;
celsiusToFahrenheit(15); // 59
celsiusToFahrenheit(0); // 32
celsiusToFahrenheit(-20); // -4
fahrenheitToCelsius(59); // 15
fahrenheitToCelsius(32); // 0

# 确定设备类型


const isMobile = () => {
  return !!navigator.userAgent.match(
    /(iPhone|iPod|Android|ios|iOS|iPad|Backerry|WebOS|Symbian|Windows Phone|Phone)/i
  );
};

判断是移动还是 PC 设备


export const isMobile = () => {
  if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iOS|iPad|Backerry|WebOS|Symbian|Windows Phone|Phone)/i))) {
  return 'mobile';
  }
  return 'desktop';
}

# 校验是否为 IPv6 地址


export const isIPv6 = (str) => {
    return Boolean(str.match(/:/g)?str.match(/:/g).length<=7:false && /::/.test(str)?/^([\da-f]{1,4}(:|::)){1,6}[\da-f]{1,4}$/i.test(str):/^([\da-f]{1,4}:){7}[\da-f]{1,4}$/i.test(str));
}

# 半角全角互转

半角转换为全角


export const toDBC = (str) => {
  let result =  "="" data-textnode-index-1665284257729="341" data-index-1665284257729="2753" class="character">" "="" data-textnode-index-1665284257729="341" data-index-1665284257729="2754" class="character">";
  for (let i = 0; i < str.length; i++) {
    code = str.charCodeAt(i);
    if (code >= 33 && code <= 126) {
      result += String.fromCharCode(str.charCodeAt(i) + 65248);
    } else if (code == 32) {
      result += String.fromCharCode(str.charCodeAt(i) + 12288 - 32);
    } else {
      result += str.charAt(i);
    }
  }
  return result;
}

全角转换为半角


export const toCDB = (str) => {
  let result =  "="" data-textnode-index-1665284257729="399" data-index-1665284257729="3141" class="character">" "="" data-textnode-index-1665284257729="399" data-index-1665284257729="3142" class="character">";
  for (let i = 0; i < str.length; i++) {
    code = str.charCodeAt(i);
    if (code >= 65281 && code <= 65374) {
      result += String.fromCharCode(str.charCodeAt(i) - 65248);
    } else if (code == 12288) {
      result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32);
    } else {
      result += str.charAt(i);
    }
  }
  return result;
}
知识汇总   |