http://classjs.com/2013/03/05/js%E8%8E%B7%E5%8F%96%E7%B2%98%E8%B4%B4%E5%86%85%E5%AE%B9/

思路:在编辑环境中,粘贴时先记录光标在编辑器中的位置,再创建一个空的div,并且设置为可编辑的(contenteditable=”true”),让光标聚焦其中,聚焦的技巧是div.focus(),此时光标粘贴操作是在刚才新创建的那个div里,那内容自然也就在该div里,利用setTimeout取到div的内容,最后重新定位光标到粘贴前位置并插入内容。

哈哈,这种思路挺讨巧的,不过其中的技巧并不是那么容易发现的。比如div.focus和setTimeout的技巧,但是我试了下,在iframe模式下是无效的,被卡在了focus那一步,因为iframe下的body是一个contenteditable=”true”环境,即focus状态,它的子元素也是处于这样一种状态,所以没法再次focus();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
onBeforePaste: function(target, e)
    {
        // ie浏览器下,如果选中了文字,则不执行粘贴前处理;保证鼠标右键的正确行为。
        if (__BROWSER.msie)
        {
            var range = document.selection.createRange();
            if (range.text.length >0)
            {
                return true;
            }
        }
         
        var self = this;
         
        // 记住容器滚动条位置
        target.style.position = "static";
        this.saveScrollTop();
         
        // 光标占位
        var caretHolder = __addCaretHolder(target);
        var tmpDiv = document.createElement("div");
        tmpDiv.contentEditable = true;
        tmpDiv.style.position = "absolute";
        tmpDiv.style.top = caretHolder.offsetTop + "px";
        tmpDiv.style.left = caretHolder.offsetLeft + "px";
        tmpDiv.style.width = "1px";
        tmpDiv.style.height = "1px";
        tmpDiv.style.overflow = "hidden";
        this.container.appendChild(tmpDiv);
        tmpDiv.focus();
        // 执行粘贴操作
        __setTimeoutEx(0, function(){
            var txt = tmpDiv.innerHTML;
           
            caretHolder.innerHTML = txt;
            __setCaret(caretHolder, -1);
            __removeCaretHolder();
            if (tmpDiv.parentNode)
            {
                tmpDiv.parentNode.removeChild(tmpDiv);
            }
             
            // 粘贴时容器的滚动条会自动滚动,此处需要复原
            target.style.position = "relative";
            self.restoreScrollTop();   
        });
         
        return true;
    },

JS获取粘贴内容的更多相关文章

  1. JS获取标签内容的方法

    JS获取标签内容的方法 测试代码 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  2. JS获取元素内容属性以及修改

    1.通过document对象

  3. js获取浏览器内容宽高(小计)

    <SCRIPT LANGUAGE="JavaScript">var  s = "";s += "\r\n网页可见区域宽:"+ d ...

  4. js获取上传文件内容(未完待续)

    js 获取上传文件的字节数及内容 <div> 上传文件 : <input type="file" name = "file" id = &qu ...

  5. 为什么不能用 JS 获取剪贴板上的内容?

    为什么不能用 JS 获取剪贴板上的内容? 为什么不能用 JS 获取剪贴板上的内容? 发一串口令给朋友朋友复制这串口令,然后访问你的网站你在网站上用 JS 读取朋友剪贴板上的口令根据不同的口令,显示不同 ...

  6. js获取select选中的内容

    ### 获取select选中的内容 js获取select标签选中的值 var obj = document.getElementById("selectId");//获取selec ...

  7. JQ和Js获取span标签的内容

    JQ和Js获取span标签的内容 html: 1 <span id="content">‘我是span标签的内容’</span> javascript获取: ...

  8. js获取子节点和修改input的文本框内容

    js获取子节点和修改input的文本框内容 js获取子节点: $("#"+defaultPVItemId).children().eq(3); //获取某个选择器下的第四个子节点 ...

  9. JS正则表达式获取分组内容实例

    JS正则表达式获取分组内容. 支持多次匹配的方式: var testStr = "now test001 test002"; var re = /test(\d+)/ig; var ...

随机推荐

  1. 目标&计划

    目标 感觉起来NOIP还是能考到一个比较好的分数的吧 550+? 现在可能还不大行,但是过3个月或许还是能考到的 所以先订下NOIP保底500争取550+吧 至于省选... 前面有一群巨佬挡着,感觉想 ...

  2. usb被占用时,可以用这些方法进行adb无线调试

    转自: http://www.cnblogs.com/shangdawei/p/4480278.html 可用wifi.网口. 1.先要获取root权限 如果手机没有命令行工具,请先在手机端安装终端模 ...

  3. JAVA线程操作常见面试题 包括不使用内部类对多个线程加减1

    class ManyThreads2 { private int j = 0; public synchronized void inc() { j++; System.out.println(Thr ...

  4. 关于在@Controller所返回的视图的css,js文件404问题

    本人在使用layui打开一个请求后台的页面时,页面成功由controller重定向到了正确的位置,然而几乎所有的js文件和css文件都报404,并且确定这些css文件还有js文件的引入的路径都是正确的 ...

  5. 洛谷P2770 航空路线问题(费用流)

    题意 $n$个点从左向右依次排列,有$m$条双向道路 问从起点到终点,再从终点回到起点,在经过的点不同的情况下最多能经过几个点 Sol 首先,问题可以转化为求两条互不相交的路径,使得点数最多 为了满足 ...

  6. SQL中的SELECT_简单查询语句总结

    --以scott用户下的dept和emp表为例 --注意:如果scott用户不能使用,请使用system用户登录--解锁scott用户ALTER USER SCOTT ACCOUNT UNLOCK;- ...

  7. Eclipse项目转Android Studio

    刚来某公司的时候,发现Android开发仍然还在使用Eclipse,编码无规范,渠道打包竟然手动,svn版本主干分支管理混乱,总之各种low... 对于有强迫症的我来说,属实不可忍.但无奈,新人一个, ...

  8. 记 thoughtworks 的一次面试

    2015年的1月30号,星期五.我将要去thoughtworks面试. 最早听说thoughtworks是在学校听同学说起的.一句不经意间的引导可能会改变我的整个人生. 实话说,我之前对thought ...

  9. MyBatis学习(四)

    前言 最近比较松懈,下班回家后也懒得学习了.今晚实在是看不下去了,争取时间学习.社会上有这么多的资源,就看谁能抢的多吧.今天就说说MyBatis的动态SQL吧 正文 动态 SQL 通常要做的事情是有条 ...

  10. Java JDK装配置

     1- 介绍 本文章介绍JAVA开发环境安装是基于:  Java8(JDK8) 2- 下载JDK http://www.oracle.com/technetwork/java/javase/dow ...