基于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. 0002 PyCharm设置

    1 设置编码格式 File/Settings/Editor/File Encodings 2 设置字体 File/Settings/Editor/Font 3 鼠标滚轮改变编辑器字体大小 File/S ...

  2. P问题,NP问题,NPC问题学习笔记

    参考:https://www.luogu.org/blog/styx-ferryman/chu-sai-bei-kao-gan-huo-p-wen-ti-np-wen-ti-npc-wen-ti-sh ...

  3. java的开发步骤----

    首先老师给了一个 视频给我:叫我理解java的简单开发步骤: 上两张图: 然后我就理解成了这样::: 简述java开发步骤:第一步: 编写源代码,把源代码写好 :第二部:源代码通过编译器编译成字节码c ...

  4. PP: DeepAR: probabilistic forecasting with autoregressive recurrent networks

    FROM Amazon research Germany PROBLEM probabilistic forecasting: estimate the probability distributio ...

  5. window.resizeTo

    概述 动态调整窗口的大小. 语法 window.resizeTo(aWidth, aHeight) 参数 aWidth 是一个整数,表示新的 outerWidth(单位:像素)(包括滚动条.窗口边框等 ...

  6. xmlns:android="http://schemas.android.com/apk/res/android 这句话的作用

    xmlns:android="http://schemas.android.com/apk/res/android 有了这句话,你就可以alt+/作为提示,提示你输入什么,不该输入什么,什么 ...

  7. js前端模块化的前世今生

    前言: <!DOCTYPE html> <html> <head> <title></title> </head> <sc ...

  8. Centos7 入门几个操作

    http://www.wallcopper.com/linux/1650.html 创建文件软连接 ln -s 源路径 目标路径 查看软连接ls -il 服务操作:systemctl start fo ...

  9. 压缩包安装mysql8.0

    在使用django的时候遇到一个错误,就是用脚本改变数据库的时候,发现mysql的版本不够,需要的版本应该大于5.8,而我的只有5.5,就很烦,恰好我之前有8.0的压缩包.(mysql重装已经不下十次 ...

  10. 解决无法将“babel”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

    错误截图: 第一反应想到的是环境变量没有配置好,再仔细检查一下,并没有错误 在cmd窗口运行命令“ babel --version ”,如果出现对应的版本号,那就说明环境变量是正确的 解决方案: 用管 ...