基于Angular7.1和TypeScript实现

Html代码

                   <div style="padding-left: 0px;">
<div id='contentTem' class='temp-style' contentEditable="true" (drop)="drop($event)" (dragover)="allowDrop($event)">
1</div>
<div>
效果预览
<div class='temp-style' style="min-height: 150px;" id='preview'></div>
</div>
</div>
<div>
<div><a href="javascript:(0)" ng-click='Edit()'>新增自定义参数</a></div>
<div class='temp-style option'>
<div>
<span id='t1' contenteditable="false" draggable="true" (dragstart)="drag($event)">[拖拽]</span>
</div>
<div>
<span id='t2' contenteditable="false" draggable="true" (dragstart)="drag($event)">[拖拽2]</span>
</div>
</div>
</div>

TS代码

   allowDrop = function (ev) {
$("#contentTem")[].focus();
ev.preventDefault();
} drag = function (ev) {
$("#contentTem")[].focus();
var selection = window.getSelection()
// 设置最后光标对象
this.lastEditRange = selection.getRangeAt();
ev.dataTransfer.setData("Text", ev.target.id);
} drop = function (ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("Text");
this.insertHtmlAtCaret($("#" + data).html())
} insertHtmlAtCaret = function (html) {
if (html == undefined) {
return;
}
var selection;
selection = getSelection()
// 设置最后光标对象
this.lastEditRange = selection.getRangeAt();
this.lastEditRange.deleteContents();
//判断是否是拖拽
var htmlData = "";
if (html != undefined) {
htmlData = html;
} else {
htmlData = $("#contentTem").html();
} if (selection.anchorNode.data != undefined && selection.anchorNode.data.indexOf("[Key]") > -) {
htmlData = htmlData.replace(/\[Key]/g, '<span style="color:red" contentEditable="false">[显示内容]</span>');
$("#contentTem").html('');
$("#contentTem")[].focus();
var el = document.createElement("div");
el.innerHTML = htmlData;
var frag = document.createDocumentFragment(), node, lastNode;
while ((node = el.firstChild)) {
lastNode = frag.appendChild(node);
}
//将内容填充进去
this.lastEditRange.insertNode(frag);
if (this.lastEditRange) {
//重新设置光标位置
this.lastEditRange = this.lastEditRange.cloneRange();
this.lastEditRange.setStartAfter(lastNode);
this.lastEditRange.collapse(true);
selection.removeAllRanges();
selection.addRange(this.lastEditRange);
}
} else {
htmlData = '<span style="color:red" contentEditable="false">' + htmlData + '</span>';
var el = document.createElement("div");
el.innerHTML = htmlData;
var frag = document.createDocumentFragment(), node, lastNode;
while ((node = el.firstChild)) {
lastNode = frag.appendChild(node);
}
//将内容填充进去
this.lastEditRange.insertNode(frag);
if (this.lastEditRange) {
//重新设置光标位置
this.lastEditRange = this.lastEditRange.cloneRange();
this.lastEditRange.setStartAfter(lastNode);
this.lastEditRange.collapse(true);
selection.removeAllRanges();
selection.addRange(this.lastEditRange);
}
}
//预览区域
var previewHtml = $("#contentTem").html();
previewHtml = $("#contentTem").html().replace(/\[Key]/g, '显示内容');
$("#preview").html(previewHtml);
}

因为完成的比较匆忙,功能实现的不完美,后续在优化

Angular 2.0 文本拖拽的更多相关文章

  1. 使用angular帮你实现拖拽

    拖拽有多种写法,在这里就看一看angular版的拖拽. <!DOCTYPE html> <html ng-app="myApp"> <head> ...

  2. Android4.0 Launcher拖拽原理分析

    在Android4.0源码自带的Launcher中,拖拽是由DragController进行控制的. 1) 先来看看类之间的继承关系 2)再来看看Launcher拖拽流程的时序图   1.基本流程: ...

  3. ajax2.0之拖拽上传

    index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...

  4. [ActionScript 3.0] AS3 拖拽混动效果之一

    package { import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; impor ...

  5. JD . 简单的网站构成、引入图标、去除 图片间距/加粗/倾斜/下划线/蓝色外边框 禁止文本拖拽、文字居中、做logo、模拟鼠标 、不使用hover外部css样式实现hover鼠标悬停改变样式

    模拟京东案例准备: 截图(效果图PSD文件) 搭建项目环境     (结构样式行为分离)   HTML 核心文件     index.html CSS       控制样式 base.css(基础样式 ...

  6. as3文本框的动态拖拽和编辑

    如今非常多软件都支持了编辑界面的文本拖拽和点击编辑来直接改动数值, 这样便于操作, 并且体验性也好, 抛砖引玉吧 于是就用好久没编写的as3来写了一下: 由于用的flash ide写的没有提示, 就临 ...

  7. html5 Sortable.js 拖拽排序源码分析

    最近公司项目经常用到一个拖拽 Sortable.js插件,所以有空的时候看了 Sortable.js 源码,总共1300多行这样,写的挺完美的.   本帖属于原创,转载请出名出处. 官网http:// ...

  8. jsDOM编程-拖拽层

    页面样式代码: <!doctype html><html><head><meta http-equiv="content-type" co ...

  9. 这交互炸了(四) :一分钟让你拥有微信拖拽透明返回PhotoView

    本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发 <交互炸了>或许是一系列高端特效教程, 文中会介绍一些比较炫酷的特效,以及实现的思路.特效实现本身也许不会有太大的难度 ...

随机推荐

  1. 《深入理解java虚拟机》读书笔记一——第二章

    第二章 Java内存区域与内存溢出异常 1.运行时数据区域 程序计数器: 当前线程所执行的字节码的行号指示器,用于存放下一条需要运行的指令. 运行速度最快位于处理器内部. 线程私有. 虚拟机栈: 描述 ...

  2. centos7搭建天兔

    如果新系统尚未安装工具pip,可通过以下三步快速安装pip              1.  yum -y install epel-release               2.  yum -y ...

  3. nvm —— Node版本管理工具

    nvm下载 下载地址 下载nvm-setup.zip文件 nvm安装 1.以管理员身份运行install.cmd文件,设置文件路径 root: C:\Users\Administrator\AppDa ...

  4. Oracle 中的 Incarnation 到底是个什么?概念理解篇

    高中时候,我深深“爱”上了一位女孩子.那个年纪确实不懂什么是真正的“爱”,反正每天满脑子都是她,只要见到她就会紧张和激动,确切的说是深深的喜欢.你告诉我这叫初恋?不,我的初恋应该是小学3年级,三六班. ...

  5. 1级迁移类Q101-Oracle ASM 迁移文件系统(File System)非公

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  6. 0120 springboot集成Mybatis和代码生成器

    在日常开发中,数据持久技术使用的架子使用频率最高的有3个,即spring-jdbc , spring-jpa, spring-mybatis.详情可以看我之前的一篇文章spring操作数据库的3个架子 ...

  7. join方法,wait()和sleep()

    join方法解释:方法x.join()的作用是使所属线程x 正常执行run()中的方法,而使得调用x.join()的线程处于无限期阻塞状态,等待x线程销毁后再继续执行线程z后面的代码. 1.方法joi ...

  8. php header的使用

    // okheader('HTTP/1.1 200 OK'); //设置一个404头:header('HTTP/1.1 404 Not Found'); //设置地址被永久的重定向header('HT ...

  9. CentOS7下升级PHP版本为7.2

    yum provides php #自带的只有5.4版本 rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm #更新源 rpm ...

  10. PCB主线布线规范—高速线之DDR2

    一.DDR2时钟线走线规则a)时钟线包括 MEM_CLKOUT#0.MEM_CLKOUT0.MEM_CLKOUT#1.MEM_CLKOUT1,MEM_CLKOUT#2.MEM_CLKOUT2: MEM ...