1. addEventListener中的事件如果移除(removeEventListener)的话不能在事件中执行bind(this)否则会移除无效!
  2. // selectCurrent()
    // copy("example...") // function sleep (ms) {
    // return new Promise((resolve) => {
    // setTimeout(() => {
    // resolve('sleep for ' + ms + ' ms');
    // }, ms);
    // });
    // }
    // async function selectCurrent () {
    // var reselectPrevious // await sleep(2000)
    // reselectPrevious = deselectCurrent();
    // console.log("first") // await sleep(2000)
    // reselectPrevious()
    // console.log("last")
    // } var defaultMessage = "Copy to clipboard: #{key}, Enter"; function format(message) {
    var copyKey = (/mac os x/i.test(navigator.userAgent) ? "⌘" : "Ctrl") + "+C";
    return message.replace(/#{\s*key\s*}/g, copyKey);
    } /**
    * interface Options {
    * debug?: boolean;
    * message?: string;
    * }
    * @param {string} text
    * @param {Options} options
    */
    function copy(text, options) {
    var debug,
    message,
    reselectPrevious,
    range,
    selection,
    mark,
    success = false;
    if (!options) {
    options = {};
    }
    debug = options.debug || false; try {
    reselectPrevious = deselectCurrent(); range = document.createRange();
    selection = document.getSelection(); mark = document.createElement("span");
    mark.textContent = text;
    // reset user styles for span element
    mark.style.all = "unset";
    // prevents scrolling to the end of the page
    mark.style.position = "fixed";
    mark.style.top = 0;
    mark.style.clip = "rect(0, 0, 0, 0)";
    // used to preserve spaces and line breaks
    mark.style.whiteSpace = "pre";
    // do not inherit user-select (it may be `none`)
    mark.style.webkitUserSelect = "text";
    mark.style.MozUserSelect = "text";
    mark.style.msUserSelect = "text";
    mark.style.userSelect = "text";
    mark.addEventListener("copy", function (e) {
    e.stopPropagation();
    }); document.body.appendChild(mark); range.selectNodeContents(mark);
    selection.addRange(range); var successful = document.execCommand("copy");
    if (!successful) {
    throw new Error("copy command was unsuccessful");
    }
    success = true;
    } catch (err) {
    debug && console.error("unable to copy using execCommand: ", err);
    debug && console.warn("trying IE specific stuff");
    try {
    window.clipboardData.setData("text", text);
    success = true;
    } catch (err) {
    debug && console.error("unable to copy using clipboardData: ", err);
    debug && console.error("falling back to prompt");
    message = format("message" in options ? options.message : defaultMessage);
    window.prompt(message, text);
    }
    } finally {
    if (selection) {
    if (typeof selection.removeRange == "function") {
    selection.removeRange(range);
    } else {
    selection.removeAllRanges();
    }
    } if (mark) {
    document.body.removeChild(mark);
    }
    reselectPrevious();
    } return success;
    } // 取消选择当前浏览器选择并返回恢复选择的功能。 toggleSelection
    function deselectCurrent () {
    // 返回一个Selection对象,该对象表示用户选择的文本范围或插入符的当前位置。
    var selection = document.getSelection();
    if (!selection.rangeCount) {
    return function () {};
    }
    var active = document.activeElement; var ranges = [];
    for (var i=0; i<selection.rangeCount; i++) {
    ranges.push(selection.getRangeAt(i));
    } switch (active.tagName.toUpperCase()) { // .toUpperCase handles XHTML
    case 'INPUT':
    case 'TEXTAREA':
    active.blur();
    break;
    default:
    active = null;
    break;
    } selection.removeAllRanges();
    return function () {
    selection.type === 'Caret' && selection.removeAllRanges() if (!selection.rangeCount) {
    ranges.forEach(function(range) {
    selection.addRange(range);
    });
    } active && active.focus();
    }
    }

    点击复制事件封装代码:

  3. document.body.addEventListener(
    'touchmove',
    function(e) {
    if (e._isScroller) return
    // 阻止默认事件
    e.preventDefault()
    },
    {
    passive: false
    }
    )

    iOS上拉边界下拉出现空白解决方案:

  4. window.addEventListener('resize', function() {
    if (
    document.activeElement.tagName === 'INPUT' ||
    document.activeElement.tagName === 'TEXTAREA'
    ) {
    window.setTimeout(function() {
    if ('scrollIntoView' in document.activeElement) {
    document.activeElement.scrollIntoView(false)
    } else {
    document.activeElement.scrollIntoViewIfNeeded(false)
    }
    }, 0)
    }
    })

    IOS 键盘弹起挡住原来的视图:

  5. FastClick.prototype.focus = function(targetElement) {
    var length
    if (
    deviceIsIOS &&
    targetElement.setSelectionRange &&
    targetElement.type.indexOf('date') !== 0 &&
    targetElement.type !== 'time' &&
    targetElement.type !== 'month'
    ) {
    length = targetElement.value.length
    targetElement.setSelectionRange(length, length)
    targetElement.focus()
    } else {
    targetElement.focus()
    }
    }

    IOS12 输入框难以点击获取焦点,弹不出软键盘(fastclick.js 对 IOS12 的兼容性,可在 fastclick.js 源码或者 main.js 做以下修改):

JS 手札记的更多相关文章

  1. 原生js手动轮播图

    手动轮播图,为轮播图中的一种,轮播图主要有无缝轮播,手动轮播,延迟轮播,切换轮播等等... 轮播图主要用于展现图片,新出商品,词条,又能美观网页.給网页中增加动态效果. 手动轮播,是小编认为最简单的一 ...

  2. 原生html、js手写 radio与checkbox 美化

    原生html.js手写 radio与checkbox   美化 html <!DOCTYPE html> <html> <head> <meta charse ...

  3. 常见的JS手写函数汇总(代码注释、持续更新)

    最近在复习面试中常见的JS手写函数,顺便进行代码注释和总结,方便自己回顾也加深记,内容也会陆陆续续进行补充和改善. 一.手写深拷贝 <script> const obj1 = { name ...

  4. touch.js 手机端的操作手势

    使用原生的touchstart总是单击.长按有冒泡冲突事件,发现百度在几年开源的touch.js库,放在现在来解决手机端的操作手势,仍然很好用.

  5. 五四青年节,今天要学习。汇总5道难度不高但可能遇到的JS手写编程题

    壹 ❀ 引 时间一晃,今天已是五一假期最后一天了,没有出门,没有太多惊喜与意外.今天五四青年节,脑子里突然想起鲁迅先生以及悲欢并不相通的话,我的五一经历了什么呢,忍不住想说那大概是,父母教育孩子大声嚷 ...

  6. 浅谈时钟的生成(js手写代码)

    在生成时钟的过程中自己想到布置表盘的写法由这么几种: 当然利用那种模式都可以实现,所以我们要用一个最好理解,代码有相对简便的方法实现 1.利用三角函数 用js在三角函数布置表盘的过程中有遇见到这种情况 ...

  7. [js开源组件开发]js手机端浮层控件,并有多种弹出小提示,兼容pc端浏览器

    js dialog组件,包含alert和confirm的实现 本组件所有的资源均在github上可以查看源代码 GitHub 本dialog的组件的例子请在这里查看 demo dialog js di ...

  8. 轮播图--JS手写

    轮播图基本每个网站都会有,也有很多的JQuery插件可以用,这里是用JS代码写的. @{ Layout = null; } <!DOCTYPE html> <html> < ...

  9. js手写图片查看器(图片的缩放、旋转、拖拽)

    在做一次代码编辑任务中,要查看图片器.在时间允许的条件下,放弃了已经封装好的图片jq插件,现在自己手写js实现图片的缩放.旋转.推拽功能! 具体代码如下: <!DOCTYPE html> ...

随机推荐

  1. poj2112 最大流

    我用Dinic写的.G++ 1800ms 很慢,c++直接超时.优化后的 141ms,很快! 对于此题,建图方法很巧妙,通常想到求距离,那就会朝距离的方向建图,但是这题根据牛个数来建图,然后二分距离. ...

  2. Flutter SDK path为空导致工程打开后不显示iOS模拟器的问题

    说明下问题场景,面向git编程时下载了个开源的Flutter项目 Mac系统下AndroidStudio打开工程后,发现顶部不展示iPhone模拟器 根据ide浅黄色提示提示,判断是FlutterSD ...

  3. BZOJ 4034 洛谷3178 树上操作题解

    一个很裸的树链剖分模板.注意一下数据范围,有的地方要开longlong,这就是唯一的陷阱了. # include<iostream> # include<cstdio> # i ...

  4. LeetCode120 Triangle

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  5. keep-alive vue组件缓存避免多次加载相应的组件

    keep-alive vue组件缓存避免多次加载相应的组件

  6. LeetCode54 Spiral Matrix

    题目: Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spira ...

  7. Python中多线程与多进程的恩恩怨怨

    概念: 并发:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运 ...

  8. 上传图片如何对图片进行压缩canvas

    前言:哈喽,朋友们,最近一直在马不停蹄地赶项目,很久没有写博客了.今天我们来看一下前端上传图片地时候如何对图片进行压缩 1.图片上传 我近期写项目都是使用的VUE,这里上传图片使用了Element-u ...

  9. 洛谷 1372 又是毕业季I

    题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定 ...

  10. angularJS 初始化

    AngularJS 启动有两种方式 1.绑定初始化,自动加载 通过绑定来进行angular的初始化,会把js代码侵入到html中. ng-app是angular的一个指令,代表一个angular应用( ...