前端难点,坑点总结

2023-11-01

前言

最近工作上遇见一些难点和坑,花费了不少时间去解决,所以想着先把这些难点和坑记录下来,方便下次查找。同时希望可以有需要的童鞋。

登录验证码图片显示

后台返回的登录验证码图片是以流的形式返回的。所以这里需要使用到Uint8Array和String.fromCharCode这2个api。Uint8Array表示一个8位无符号整型数组,用来存储返回来的流。String.fromCharCode()根据指定的 Unicode 编码中的序号值来返回一个字符串。这里我是使用axios进行请求的,同是需要指定返回的类型是arraybuffer,代码如下:

axios
    .get(url, {
      responseType: "arraybuffer"
    })
    .then(res => {
      if (res.status == 200) {
        this.captcha =
          "data:image/png;base64," +
          btoa(
            new Uint8Array(res.data).reduce(
              (data, byte) => data + String.fromCharCode(byte),
              ""
            )
          );
      } else {
      }
    })
    .catch(() => {});

post下载文件

出于安全的考虑,后台使用post进行文件下载。这里主要是使用到了FileReader这个文件读取对象和原生的html标签a。大概思路如下:使用FileReader中的readAsDataURL读取后台返回的blob内容,一旦完成,result属性中将包含一个data: URL格式的Base64字符串以表示所读取文件的内容。然后动态生成一个a标签,将Base64字符串挂载到a标签的href属性中,然后添加到网页中,触发a标签的点击事件,最后把a标签移除。这里我使用的是axios进行请求的,同是需要指定返回的类型为blob,代码如下:

axios
    .post(url, params, {
      responseType: "blob"
    })
    .then(res => {
      if (res.status == 200) {
        const fileName = `${new Date()}.xls`;
        let blob = res.data;
        let reader = new FileReader();
        reader.readAsDataURL(blob);
        reader.onload = e => {
          let a = document.createElement("a");
          a.download = fileName;
          a.href = e.target.result;
          document.body.appendChild(a);
          a.click();
          document.body.removeChild(a);
        };
      } else {
      }
    })
    .catch(error => {});

js调用ie浏览器的打印功能打印网页上内容

这里是调用ie浏览器的打印功能,而且还是打印iframe里面的内容。其他浏览器,如谷歌,火狐等等,实现起来很简单。这里就不说其他浏览器了。只说ie。先简单说一下需求吧。首先用户选中一条数据进行打印,然后以弹框的形式显示要打印的内容,确认无误后调用ie的浏览器打印功能进行打印。

要使用e的浏览器打印功能,需要手动开启打印功能。开启步骤如下:
1、点击IE浏览器右上角设置图标选择 Internet选项→安全→internet→自定义级别,对未标记为可安全执行脚本的ActiveX初始化并执行,选择提示
2、点击IE浏览器右上角设置图标选择 Internet选项→安全→受信任的站点→站点→取消勾选对该区域的所有站点要求服务器验证(https:)(s)→添加
3、若以上设置仍无法进行打印,请将“Internet选项→安全→受信任的站点→自定义级别”、 “Internet选项→安全→internet→自定义级别” 处的关于“ActiveX控件和插件”下的内容全部设置为启动

同是需要注意以下2点:
1、你要打印什么内容就显示什么内容,其余的不需要显示,可以使用以下的媒体查询来控制打印的时候显示什么,隐藏什么

@media print {
  .print {
    display: block;
    padding-top: 20px;
  }
  /* 去掉页眉页脚 */
  @page {
    size: auto;
    margin: 0mm;
  }
}

2、背景颜色是不能被打印出来的,但可以打印图片,可以使用图片来代替背景颜色

js调用ie浏览器打印功能代码如下

if (!!window.ActiveXObject || "ActiveXObject" in window) {
        try {
          var HKEY_Root, HKEY_Path, HKEY_Key;
          HKEY_Root = "HKEY_CURRENT_USER";
          HKEY_Path = "\\Software\\Microsoft\\Internet Explorer\\PageSetup\\";
          var Wsh = new ActiveXObject("WScript.Shell");
          HKEY_Key = "header";
          //设置页眉(为空)
          Wsh.RegWrite(HKEY_Root + HKEY_Path + HKEY_Key, "");
          HKEY_Key = "footer";
          //设置页脚(为空)
          Wsh.RegWrite(HKEY_Root + HKEY_Path + HKEY_Key, "");
          //设置下页边距(0)
          HKEY_Key = "margin_bottom";
          Wsh.RegWrite(HKEY_Root + HKEY_Path + HKEY_Key, "0");
          HKEY_Key = "margin_left";
          //设置左页边距(0)
          Wsh.RegWrite(HKEY_Root + HKEY_Path + HKEY_Key, "0");
          HKEY_Key = "margin_right";
          //设置右页边距(0)
          Wsh.RegWrite(HKEY_Root + HKEY_Path + HKEY_Key, "0");
          HKEY_Key = "margin_top";
          //设置上页边距(8)
          Wsh.RegWrite(HKEY_Root + HKEY_Path + HKEY_Key, "0");
          document.body.className += " ext-ie";
          document.execCommand("print", false, null);
        } catch (error) {
        }
      } else {
      }

移动端适配不同的屏幕

移动端采用的是rem+flex布局的,设计稿的基准是以375为基准的。
1、根据不同的屏幕修改根元素html的字体大小。代码如下:

document.addEventListener('DOMContentLoaded', () => {
  let fontSize = window.innerWidth / 10
  fontSize = fontSize > 50 ? 50 : fontSize
  const html = document.querySelector('html')
  html.style.fontSize = fontSize + 'px'
})

2、提供2个方法进行px和rem之间的换算,代码如下


function realPx(px) {
  const maxWidth = window.innerWidth > 500 ? 500 : window.innerWidth
  return px * (maxWidth / 375)
}

function px2rem(px) {
  const ratio = 375 / 10
  return px / ratio
}

3、css换算单位,这里使用的是sass,代码如下

$ratio: 375 / 10;

@function px2rem($px) {
  @return $px / $ratio + rem;
}

4、重置样式,这个目的是为了网页在不同的浏览器中表现出来的效果一致

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
  margin: 0;
  padding: 0;
  border: 0;
  font-size: 100%;
  font: inherit;
  vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
  display: block;
}
body {
  line-height: 1;
}
ol, ul {
  list-style: none;
}
blockquote, q {
  quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
  content: '';
  content: none;
}
table {
  border-collapse: collapse;
  border-spacing: 0;
}
a {
  text-decoration: none;
  -webkit-backface-visibility: hidden;
}
li {
  list-style: none;
}

html, body {
  width: 100%;
  height: 100%;
  overflow: hidden;
  user-select: none;
}
body {
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
html, body {
  font-family: 'PingFangSC-Light', 'PingFang SC', 'STHeitiSC-Light', 'Helvetica-Light', 'Arial', 'sans-serif';
}

ie9浏览器异步上传文件

ie9是不支持使用ajax进行异步上传文件的,这里借助了jquery.js和jquery.form.js,原理方面大家可以上网百度一下,主要是借助了iframe。
这里有一点需要切记的是,后台必须返回json字符串,不能直接返回json,否则ie9会误认为返回的是什么json文件,然后出现下载的弹框提示。

html代码如下

<form
      style="display:inline-block;"
      action="/sisp/cardInfoService/version/upload"
      id="ajaxForm"
      method="POST"
    >
      <label class="label" for="file" id="label">上传控件</label>
      <input
        style="display:none;"
        @change="change"
        type="file"
        name="file"
        id="file"
      />
    </form>

js代码

      let self = this;
      var ajaxFormOption = {
        resetForm: true,
        success: function(res) {
         
        },
        error: function(e) {
         
        }
      };
      $("#ajaxForm").ajaxSubmit(ajaxFormOption);

ie浏览器 input标签会出现ie自带叉号

ie10以上可以通过css样式清除input里面叉号,css代码如下:

::-ms-clear, ::-ms-reveal{display: none;}

但是ie9通过css样式是清除不了input里面的叉号,但是可以给input设置宽度,从而隐藏自带的叉号。宽度的临界值是137px,超过137px叉号是不能消失的,小于或者等于137px就可以隐藏叉号。至于为什么是临界值是137px,那是因为那个叉号就是出现在距离input标签左侧137px的位置。所以当input标签宽度小于137px的时候,叉号并不是真正的清除,而是相当于overflow: hidden被隐藏了

使用flex布局,文字超出部分变省略号

使用flex布局的时候,子元素使用了flex:1这个属性来占满剩下的宽度,但是超出部分的文字不能变成省略号,而是把元素给撑开了。这是因为如果没有设置width,当内部元素的内容大小超过平均分配的剩余空间时,元素的宽度等于内容大小。所以宽度要设置成0,直接设置width为0可以保证元素宽度平分父元素宽度

	overflow: hidden;/*超出部分隐藏*/
    text-overflow:ellipsis;/* 超出部分显示省略号 */
    white-space: nowrap;/*规定段落中的文本不进行换行 */
	flex:1;
	width:0

移动端1px边框实现

使用css3的媒体查询+transform的scale
-webkit-device-pixel-ratio 指的是像素比

/* 实现1px边框 */
  .scale-1px {
    position: relative;
    border: none;
  }
  @media only screen and (-webkit-device-pixel-ratio:2){
  .scale-1px:after {
    content: '';
    position: absolute;
    height: 1px;
    width: 100%;
    bottom: 0;
    left: 0;
    -webkit-transform: scaleY(0.5);
    transform: scaleY(0.5);
    -webkit-transform-origin: 0 0;
    transform-origin: 0 0;
  }
  }
  @media only screen and (-webkit-device-pixel-ratio:3){
  .scale-1px:after {
    content: '';
    position: absolute;
    height: 1px;
    width: 100%;
    bottom: 0;
    left: 0;
    -webkit-transform: scaleY(0.333);
    transform: scaleY(0.333);
    -webkit-transform-origin: 0 0;
    transform-origin: 0 0;
  }
  }
  

总结

目前就遇见这些相对比较难,坑的问题,后续要是遇见其他的问题,我会更新这篇文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端难点,坑点总结 的相关文章

随机推荐

  • 操作系统系列(三)——编译和链接

    往期地址 操作系统系列一 操作系统概述 操作系统系列二 进程 本期主题 编译和链接 文章目录 1 被隐藏了的过程 1 1 预编译 1 2 编译 1 3 汇编 1 4 链接 1 模块拼接 静态链接 2 空间地址与分配 3 符号解析和重定位 核
  • Tempter of the Bone【DFS+奇偶剪枝】scanf会WA!!!

    题目链接HDU1010 多好的一道题 交scanf会WA cin一发过 我WA了30 次 惊是这样的BUG 我就说我推的公式怎会错呢 如果有字体缩小的方式 我要把上面那行缩小些 先看大家WA 可真是一道有趣的题目 首先 有这样的图推出奇偶剪
  • spark 基本概念解析

    spark 基本概念解析 1 Application 用户在 spark 上构建的程序 包含了 driver 程序以及在集群上运行的程序代码 物理机器上涉及了 driver master worker 三个节点 2 Driver Progr
  • 4.22/23实习总结:iptables

    文章目录 iptables 是Linux上常用的防火墙管理工具 是netfilter项目的一部分 实现包过滤 NAT功能 1 iptables的四表五链 2 iptables语法 iptables 选项 参数 3 iptables的策略 允
  • ubuntu apt-get 时遇到waiting for headers ——解决方法

    不知为何 当用到apt get 时总是waiting for headers 上网搜寻了解决方法 在这里记录一下 方便自己 方便别人 找到 var cache apt archives partial 目录 进去之后删除里面的东东即可 然后
  • 项目 迁移到新的服务器上,项目迁移到云服务器

    项目迁移到云服务器 内容精选 换一换 源端服务器迁移至华为云后 最终将迁移到弹性云服务器上 因此在迁移前 您需要在华为云中创建一个或多个弹性云服务器 进入 弹性云服务器 页面 关于参数的详细信息 请参见购买弹性云服务器 Windows系统的
  • 多态的基本概念

    多态 多态是指一种事物表现得多种形态 多态分为静态多态和动态多态 多态的特点 1 当父类类型的引用指向子类类型的对象时 父类类型的引用可以直接调用父类独有的方法 Fu fu new Zi int f fu fushow System out
  • 教你做一个属于自己的平衡小车,用STM32F103单片机实现(硬件篇)

    平衡小车软件篇 平衡小车代码篇 目录 一 电机 二 电机驱动 三 陀螺仪 四 OLED显示屏 五 STM单片机 六 其它 七 效果展示 一 电机 如果要做平衡小车不仅需要电机输出PWM来控制小车的行走 还应该适用带编码器的电机 因为要得到小
  • MFC编程实验(二):GDI绘图

    一 实验要求 以窗口中心点为原点 绘制y x2的函数曲线 并在曲线旁边用文字描述 绘制一个红色的圆 并绘制该圆的外切正方形 该正方形填充颜色为蓝色 边线颜色为绿色 二 实验过程 一 绘制y x2的函数曲线 1 利用MFC新建一个基于对单文档
  • unity中Input.GetAxis()用法

    using System Collections using System Collections Generic using UnityEngine public class TransformPointTest MonoBehaviou
  • ElementPlus 修改主题色和暗黑模式切换

    本文讲述根本ElementPlus官方教程配置项目的自定义主题色的两种方法和暗黑模式切换 一 主题配置 方案1 动态设置setProperty 这个方案比较简单 适用于由用户根据颜色面板自行设定各种颜色主题 1 首先定义一个全局的方法 ex
  • 与karma、angular的第一次亲密接触

    首先要了解什么是karma karma干嘛用的 它的好朋友jasmine又是啥 这些文章可以帮助你 karma干嘛的 angular与karma1 angular与karma2 看了以上几篇文章之后 我们基本上就可以启动我们最简单的一个ka
  • H264 NALU 使用PS封装 RTP发送

    最近由于项目平台需求 要将H264 NALU封装为PS再用RTP发送 PS封装按照ISO DEC 13818 1标准 一个PS包包含PS Header PES Header PS system header PS system map等 针
  • VS2019 带参数启动调式程序

    有一些程序需要通过argv传入相应的参数 这类程序在vs中debug的方式为 参数是在 工程属性 调试 命令参数 设置的 默认是空 没有参数 想要加上 如下图所示
  • Anaconda常用命令小结

    在服务器上面使用Anaconda 经常会涉及一些命令 在各种任务之间徘徊 有时会忘记一些命令行 经常也会百度查一下 不如做一个小结 给自己蹭一下流量 1 检验是否安装以及当前conda的版本 conda V 2 创建python虚拟环境 c
  • Tomcat8 WEB-INF更改class后 用manager实现reload

    Tomcat8 更改WEB INF 下的class后 用自带manager实现reload 解决了困扰很长时间的问题 1 适用场景 2 解决思路之一 用tomcat自带manager工具 3 详细步骤 4 官网文档地址 5 不适用情况 解决
  • Vue键盘事件

    键盘事件
  • Fastjson

    Fastjson 是一个java类库 可以被用来把Java对象转换成Json方式 也可以把Json字符串转换成对应的Java对象 Fastjson可以作用于任何Java对象 包含没有源代码已存在的对象 目标 在服务器端或是adroid提供一
  • AtCoder Beginner Contest 286—C—Rotate and Palindrome

    题目链接 题意 给我一个长度为N的字符串S 你可以执行以下两种操作 0次或者更多次 以任意的顺序执行 1 支付A元 移动S的最左边的字符到最右边 换句话说 就是 S1 S2 Sn gt S2 Sn S1 2 支付B元 在 1 n之间选择一个
  • 前端难点,坑点总结

    问题总结 前言 登录验证码图片显示 post下载文件 js调用ie浏览器的打印功能打印网页上内容 移动端适配不同的屏幕 ie9浏览器异步上传文件 ie浏览器 input标签会出现ie自带叉号 使用flex布局 文字超出部分变省略号 移动端1