Manjushaka / blog

3 stars 0 forks source link

javascript常见问题解决 #22

Open Manjushaka opened 6 years ago

Manjushaka commented 6 years ago
  1. 数字格式化:

    function formatNumber(num, precision, separator) {
    var parts;
    // 判断是否为数字
    if (!isNaN(parseFloat(num)) && isFinite(num)) {
        // 把类似 .5, 5. 之类的数据转化成0.5, 5, 为数据精度处理做准, 至于为什么
        // 不在判断中直接写 if (!isNaN(num = parseFloat(num)) && isFinite(num))
        // 是因为parseFloat有一个奇怪的精度问题, 比如 parseFloat(12312312.1234567119)
        // 的值变成了 12312312.123456713
        num = Number(num);
        // 处理小数点位数
        num = (typeof precision !== 'undefined' ? num.toFixed(precision) : num).toString();
        // 分离数字的小数部分和整数部分
        parts = num.split('.');
        // 整数部分加[separator]分隔, 借用一个著名的正则表达式
        parts[0] = parts[0].toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + (separator || ','));
    
        return parts.join('.');
    }
    return NaN;
    }
    formatNumber(10000)
    "10,000"
    formatNumber(10000, 2)
    "10,000.00"
    formatNumber(10000.123456, 2)
    "10,000.12"
    formatNumber(10000.123456, 2, ' ')
    "10 000.12"
    formatNumber(.123456, 2, ' ')
    "0.12"
    formatNumber(56., 2, ' ')
    "56.00"
    formatNumber(56., 0, ' ')
    "56"
    formatNumber('56.')
    "56"
    formatNumber('56.a')
    NaN
  2. 导入文件(react版本):

    html部分:
        <input
          ref={(fileNode) => {
            this.fileNode = fileNode;
          }}
          type="file"
          name="stockList"
          className="stock-file"
          accept=".txt, .csv, .xlsx, .xls"
          onChange={this.handleChangeInputFile}
          onClick={this.handleClickInputFile}
        />
    js部分:
    handleClickUpload = (e) => {
    e.stopPropagation();
    this.fileNode.click();
    };
    
    handleClickInputFile = (e) => {
    e.stopPropagation();
    };
    
    handleChangeInputFile = (e) => {
    e.stopPropagation();
    const formData = new FormData();
    const file = e.currentTarget.files[0];
    const { groupId, onUploadStocksSuccess } = this.props;
    formData.append('stockFile', file, file.name);
    callApi(`/stockGroup/${groupId}/import`, {
      method: 'POST',
      data: formData,
      processData: false,
      contentType: false,
    }).then((response) => {
      this.fileNode.value = '';
      if (response && response.response === true) {
        onUploadStocksSuccess(groupId);
      } else {
        this.props.configMessage();
        message.warning('批量添加股票失败,请稍后重试');
      }
    });
    };
  3. 复制到剪贴板: // 由于document.execCommand('copy')方法仅仅可以用于input textarea等输入标签的选取,所以如果需要剪贴的文字是js字符串,就需要临时构建一个input标签赋值,然后销毁。 参考文章原文链接: JavaScript复制内容到剪贴板的两种常用方法

    handleCopy2Clipboard = record => {
    const { link, id } = record;
    const input = document.createElement('input');
    document.body.appendChild(input);
    // input.setAttribute('readonly', 'readonly');
    input.setAttribute('value', link);
    input.select();
    // input.setSelectionRange(0, 9999);
    if (document.execCommand('copy')) {
      document.execCommand('copy');
    }
    document.body.removeChild(input);
    };

    一些注意点:在Chrome下调试的时候,这个方法时完美运行的。然后到了移动端调试的时候,坑就出来了。ios。(1)点击复制时屏幕下方会出现白屏抖动,仔细看是拉起键盘又瞬间收起。知道了抖动是由于什么产生的就比较好解决了。既然是拉起键盘,那就是聚焦到了输入域,那只要让输入域不可输入就好了,在代码中添加 input.setAttribute('readonly', 'readonly'); 使这个 是只读的,就不会拉起键盘了。(2)无法复制。这个问题是由于 input.select() 在ios下并没有选中全部内容,我们需要使用另一个方法来选中内容,这个方法就是 input.setSelectionRange(0, input.value.length);。

Manjushaka commented 6 years ago
  1. 函数防抖和函数节流:限制回调函数调用频率 简单实现 防抖debounce,在一段时间内,回调函数只会调用一次,即触发事件的最后一次。 实时搜索keyup 拖拽mousemove

节流throttle,在一段时间内,会每隔一段时间调用一次 窗口调整resize 页面滚动scroll 抢购疯狂点击mousedown