收集项目中用到的工具函数

这篇具有很好参考价值的文章主要介绍了收集项目中用到的工具函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

工具函数

收集项目中常用的工具函数,以备后用,使用 TS 编写。

1. 时间格式化

/**
 * 格式化时间格式
 * @param {*} value 传入时间(单位秒)
 * @returns 返回时间格式 XX 天 XX 小时 XX 分钟 XX 秒
 */
export const formatSecond = function (value: number): string {
  value = value ?? 0;
  let secondTime = parseInt(value); // 秒
  let minuteTime = 0; // 分
  let hourTime = 0; // 小时
  let dayTime = 0; // 天
  let result = '';
  //如果秒数不小于 60,将秒数转换成整数
  if (secondTime >= 60) {
    //获取分钟,除以 60 取整数,得到整数分钟
    minuteTime = parseInt(secondTime / 60);
    //获取秒数,秒数取佘,得到整数秒数
    secondTime = parseInt(secondTime % 60);
    //如果分钟不小于 60,将分钟转换成小时
    if (minuteTime >= 60) {
      //获取小时,获取分钟除以 60,得到整数小时
      hourTime = parseInt(minuteTime / 60);
      //获取小时后取佘的分,获取分钟除以 60 取佘的分
      minuteTime = parseInt(minuteTime % 60);
      //如果小时数不小于 24,将小时转换成天
      if (hourTime >= 24) {
        //获取天,获取小时除以 24,得到整数天
        dayTime = parseInt(hourTime / 24);
        //获取天后取佘的小时
        hourTime = parseInt(hourTime % 24);
      }
    }
  }
  if (secondTime > 0) {
    result = `${parseInt(secondTime)} 秒`;
  }
  if (minuteTime > 0) {
    result = `${parseInt(minuteTime)} 分 ${result}`;
  }
  if (hourTime > 0) {
    result = `${parseInt(hourTime)} 时 ${result}`;
  }
  if (dayTime > 0) {
    result = `${parseInt(dayTime)} 天 ${result}`;
  }
  return result;
};

2. 系统、环境和浏览器

/**
 * 判断是否 PC
 */
export const isPC = (): boolean => {
  const userAgentInfo = navigator.userAgent;
  const Agents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod'];
  let flag = true;
  for (let v = 0; v < Agents.length; v++) {
    if (userAgentInfo.indexOf(Agents[v]) > 0) {
      flag = false;
      break;
    }
  }
  return flag;
};

/**
 * 判断是否微信环境(微信app,桌面微信软件等)
 */
export const isWechat = (): boolean => {
  return /MicroMessenger/i.test(window.navigator.userAgent);
};

/**
 * 判断是否 IOS 系统
 */
export const isIOS = (): boolean => {
  const u = navigator.userAgent;
  return !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
};

/**
 * 判断是否 Android 系统
 */
export const isAndroid = (): boolean => {
  const u = navigator.userAgent;
  return u.indexOf('Android') > -1 || u.indexOf('Adr') > -1;
};

/**
 * 浏览器
 */
export const getBrowser = () => {
  let explorer = navigator.userAgent.toLowerCase();
  let browser = "";
  if (
    explorer.indexOf("msie") > -1 ||
    !!window.ActiveXObject ||
    "ActiveXObject" in window
  ) {
    browser = "IE";
  } else if (explorer.indexOf("chrome") > -1) {
    browser = "chrome";
  } else if (explorer.indexOf("firefox") > -1) {
    browser = "firefox";
  } else if (explorer.indexOf("safari") > -1) {
    browser = "safari";
  } else if (explorer.indexOf("opera") > -1) {
    browser = "opera";
  }
  return browser;
}

3. 获取富文本内容中的图片

/**
 * 获取富文本内容中的图片
 */
export const getImgList = (richText: string): string[] => {
  // 如果富文本内容为空,则没有图片
  if (!richText) {
    return [];
  }

  const regex = /<img/g;
  const imgTags: string[] = richText.match(regex)!;
  let imgLen = 0;
  if (imgTags === null) {
    return [];
  } else {
    imgLen = imgTags.length;
  }

  // 没有找到图片
  if (imgLen === 0) {
    return [];
  }

  const imgElementList: string[] = [];
  const imgSrcList: string[] = [];

  richText.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/g, (match: string, capture: string): string => {
    imgSrcList.push(capture);
    imgElementList.push(match);
    return capture;
  });

  console.log('imgElementList', imgElementList); // 图片标签列表
  console.log('imgSrcList', imgSrcList); // 图片 src 属性值列表

  return imgSrcList;
};

4. 数字映射字母

// 数字映射字母,如:{1 => "A"}、{2 => "B"}
const relationArr: Array<Array<string | number>> = [];
for (let i = 0; i < 26; i++) {
  const symbol: string = String.fromCharCode(65 + i);
  relationArr.push([i + 1, `${symbol}`]);
}
const indexSymbolRelationMap = new Map();
relationArr.forEach(([key, value]) => indexSymbolRelationMap.set(key, value));

// 使用
indexSymbolRelationMap.get(index + 1);  // index = 1, => A

5. 复制到剪切板,兼容 IOS 设备、兼容微信浏览器

export const copyText = (text: string) => {
  // 数字没有 .length 不能执行 selectText 需要转化成字符串
  const textString = text.toString();
  const input = document.createElement('input');
  input.id = 'copy-input';
  input.readOnly = true; // 防止 ios 聚焦触发键盘事件
  input.style.position = 'absolute';
  input.style.left = '-1000px';
  input.style.zIndex = '-1000';
  document.body.appendChild(input);
  input.value = textString;

  // ios 必须先选中文字且不支持 input.select();
  selectText(input, 0, textString.length);

  input.blur();
  document.body.removeChild(input);

  // input 自带的 select() 方法在苹果端无法进行选择,所以需要自己去写一个类似的方法
  // 选择文本。createTextRange(setSelectionRange)是input方法
  function selectText(textBox, startIndex: number, stopIndex: number) {
    if (textBox.createTextRange) {
      //ie
      const range = textBox.createTextRange();
      range.collapse(true);
      range.moveStart('character', startIndex); //起始光标
      range.moveEnd('character', stopIndex - startIndex); //结束光标
      range.select(); //不兼容苹果
    } else {
      //firefox/chrome
      textBox.setSelectionRange(startIndex, stopIndex);
      textBox.focus();
    }
  }

  console.log(document.execCommand('copy'), 'execCommand');
  if (document.execCommand('copy')) {
    document.execCommand('copy');
    // showSuccessToast('复制成功');
    console.log("复制成功");
  }
};

document.execCommand 已被弃用,但是想要兼容微信浏览器、兼容 IOS 设备还不得不使用它。`。

还有一个兼容性问题,在微信浏览器中,IOS 设备如果想要复制到剪切板,需要有一个点击操作,比如点击一个按钮。再将一个需要复制到剪切板的内容调用 copyText 函数。直接调用将内容传给该函数调用,复制不成功。需要有一个点击操作。文章来源地址https://www.toymoban.com/news/detail-427923.html

到了这里,关于收集项目中用到的工具函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • git常见使用 --实习中用到的

    1.正常的上传和提交 2.git rebase 当存在多个commit的提交节点时,统一成一次提交。 3.版本回退 git reset --hard :把head指向之前的某次提交。hard是强制回退,不保存中间提交的内容。 git revert -n 版本号 : 不会丢失现有版本的提交记录,生成一个新版本 4.查看分支+切换分支 git b

    2024年02月07日
    浏览(38)
  • 谈谈:你在工作中用到的设计模式!

    Hello 大家龙年好! 春节的假期转眼间过去,我们也要回归往日的节奏 因为最近和小伙伴们聊天发现,我们普遍在面试中,对被问起 设计模式 在工作中的应用,既有点熟悉,又有点陌生, 在网上看吧,又感觉 鸡肋 (为啥?不能解燃煤之急啊! 哈哈),所以,为了打破这一尴尬的窘境,我亲自针

    2024年02月20日
    浏览(36)
  • 实际问题中用到的算法——递归算法确定插帧顺序

    现在需要给一个视频序列插帧,插帧算法要求每次只能由两帧输入插值得到其中间帧。如果现在需要给一个视频做 4 倍(或者更高的 8,16 倍等类似)的插帧,则一个插帧的思路是当前视频每相邻帧之间插入 3 帧,即:假设插帧前视频帧序号是 0,4,8,12… ,则插帧时补充相邻帧跨

    2023年04月18日
    浏览(45)
  • 设计模式的分类及Spring中用到的设计模式

    在《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书中,提出了 23 种设计模式,通常称为 GoF(Gang of Four)设计模式。这些设计模式被分为以下三种类型: 创建型模式(Creational Patterns): 工厂方法模式(Factory Method Pattern) 抽象

    2024年02月22日
    浏览(44)
  • 1902_野火FreeRTOS教程内核在STM32中用到的2个中断PENDSV和SYSTICK

    全部学习汇总:  g_FreeRTOS: FreeRTOS学习笔记 (gitee.com) 上面是涉及到的源代码,而这次需要分析的就是78、79行的两个中断。首先,需要确认NVIC_SYSPRI2寄存器的作用。 进一步看里面相关的定义,从这里看这个注释与代码出现了不一致的地方。也就是这个 0xe000ed20地址究竟是哪一

    2024年02月21日
    浏览(39)
  • Unity中常用到的基础函数

    Awake() :当前控制脚本实例被装载的时候调用,常用于初始化; start() :当前控制脚本第一次执行 Update() 前调用; Update() :每帧执行一次; FixedUpdate() :每固定帧绘制时执行一次,和 Update() 的不同之处在于 FixedUpdate() 是渲染帧执行,如果渲染效率低下的时候,FixedUpdate() 的调

    2023年04月14日
    浏览(42)
  • 个人可能会用到的工具集

    Odin 完整的本地化系统工具 - I2 Localization 游戏互动叙事工具 - articy:draft 3 功能强大的对话系统 - Dialogue System 游戏音频解决方案 - Master Audio 2022 高品质寻路系统 - A* Pathfinding Project Pro 场景优化工具 - Mesh Baker 游戏输入控制器 - Rewired 优质触控控制插件 - Lean Touch+ 防破解!代码混

    2024年02月15日
    浏览(53)
  • 整理一下最近了解到的AIGC工具

    好久没有写csdn博客了,突然不知道写点什么,最近AIGC真的很火,有一种三天不看就跟不上发展趋势的感觉,让人又激动又有点慌😂。这里我简单整理一下最近看到的AIGC的一些内容,后续如果有需要我详细描述一下如何使用。 AIGC现在发展可以说是‘坐地日行八万里’了,总

    2024年02月12日
    浏览(76)
  • idea中用git上传项目失败

    在idea中使用git去将项目上传到仓库的时候,上传失败并且右下角弹出黄色的警告框显示上传失败,查看日志后报错如下: 问题原因: 出现这种问题的原因是因为本地仓库刚建立,没有远程仓库的README.md文件,所以导致的上传失败. 解决方法: 使用下面的命令将文件从远程仓

    2024年02月15日
    浏览(44)
  • 在IDEA中用Git拉取项目

    2024年02月11日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包