基于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. python requests [Errno 104] Connection reset by peer

    有个需求,数据库有个表有将近 几千条 url 记录,每条记录都是一个图片,我需要请求他们拿到每个图片存到本地.一开始我是这么写的(伪代码): import requests for url in ur ...

  2. shell输入输出

    输出 一.echo命令介绍 1.功能:将内容输出到默认显示设备 2.语法:echo [-ne] [字符串] :输出的字符串以空格隔开,默认会加上换行符 3.选项 -n 不要在最后自动换行 -e 如果字 ...

  3. git中设置代理

    说明:在某种原因下,整个网络都是使用代理的情况下,需要使用git clone,这时就需要设置代理了. 在没有设置代理的时候,直接克隆报错  Failed to connect to gitee.com ...

  4. [MongoDB] 使用PHP在MongoDB中搜索的实现

    条件操作符用于比较两个表达式并从mongoDB集合中获取数据.MongoDB中条件操作符有:(>) 大于 - $gt(<) 小于 - $lt(>=) 大于等于 - $gte(< ...

  5. JS高级---案例:验证用户输入的是不是邮箱

    案例:验证用户输入的是不是邮箱 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  6. 如何用python操作XML文件

    备注: 基于python3 背景:在统计覆盖率的时候希望绕属性name为test的节点 具体实现源码如下所示,基本都是基于节点属性操作的,当然也就可以基于tag等其他标签去做,可根据需要调整 from ...

  7. WebRTC 之ICE浅谈

    前言 ICE全称Interactive Connectivity Establishment:交互式连通建立方式. ICE参照RFC5245建议实现,是一组基于offer/answer模式解决NAT穿 ...

  8. 安装python包时遇到"error: Microsoft Visual C++ 9.0 is required"的简答(Python2.7)

    简答 在Windows下用pip安装Scrapy报如下错误, error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall ...

  9. 【AHOI2005】约数研究

    发现luogu的UI改版后AC以后不能给题目评定难度了…… P1403 [AHOI2005]约数研究 类似素数筛的一道题,不过是约数. 先顺手写了个暴力做法,TLE定了~ #include<bi ...

  10. OpenGL基本图元类型

    GL_POINTSGL_LINESGL_LINE_STRIPGL_LINE_LOOPGL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FANGL_QUADSGL_QUA ...