|
|
@@ -0,0 +1,186 @@
|
|
|
+<!-- 搜索表单 -->
|
|
|
+<template>
|
|
|
+ <div>
|
|
|
+ <el-popover
|
|
|
+ style="position: fixed; z-index: 2000"
|
|
|
+ width="130"
|
|
|
+ ref="popoverRef"
|
|
|
+ v-model="rightClickShow"
|
|
|
+ @click.native="rightClickShow = false"
|
|
|
+ >
|
|
|
+ <div>
|
|
|
+ <el-button type="primary" @click="addHtml">插入输入框</el-button>
|
|
|
+ </div>
|
|
|
+ </el-popover>
|
|
|
+ <div
|
|
|
+ v-html="form"
|
|
|
+ contenteditable
|
|
|
+ class="contenteditable"
|
|
|
+ :ref="'valueChange'"
|
|
|
+ :id="id"
|
|
|
+ @contextmenu.prevent="onRightClick($event)"
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+ import dictMixins from '@/mixins/dictMixins';
|
|
|
+ import { generateRandomString } from '@/utils/util';
|
|
|
+
|
|
|
+ export default {
|
|
|
+ props: {},
|
|
|
+ mixins: [dictMixins],
|
|
|
+ props: {
|
|
|
+ id: ''
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ form: null,
|
|
|
+ valueObj: {},
|
|
|
+ domId: '',
|
|
|
+ rightClickShow: false
|
|
|
+ };
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ addHtml() {
|
|
|
+ this.insertInput();
|
|
|
+
|
|
|
+ this.objInit();
|
|
|
+ },
|
|
|
+ objInit() {
|
|
|
+ if (Object.keys(this.valueObj).length) {
|
|
|
+ for (let key in this.valueObj) {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ let dom = document.getElementById(key);
|
|
|
+ dom.value = this.valueObj[key];
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ insertInput() {
|
|
|
+ const selection = window.getSelection();
|
|
|
+ if (selection.rangeCount > 0) {
|
|
|
+ const range = selection.getRangeAt(0);
|
|
|
+ console.log(range, 'range');
|
|
|
+ this.getParentID(range.commonAncestorContainer);
|
|
|
+ if (this.getParentID(range.commonAncestorContainer)) {
|
|
|
+ range.setStart(selection.anchorNode, selection.anchorOffset);
|
|
|
+ range.setEnd(selection.focusNode, selection.focusOffset);
|
|
|
+ range.deleteContents(); // 删除选中的内容(如果需要)
|
|
|
+ range.insertNode(this.getInput()); // 插入input元素
|
|
|
+ // 可以设置光标位置在input之后
|
|
|
+ range.selectNodeContents(this.getInput());
|
|
|
+ range.collapse(false); // 光标放在input之后
|
|
|
+ selection.removeAllRanges();
|
|
|
+ selection.addRange(range);
|
|
|
+ }
|
|
|
+
|
|
|
+ // return
|
|
|
+ }
|
|
|
+ },
|
|
|
+ getParentID(data) {
|
|
|
+ if (data.id == this.id) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (data.parentElement) {
|
|
|
+ return this.getParentID(data.parentElement);
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ getInput() {
|
|
|
+ let id = generateRandomString();
|
|
|
+ const inputElement = document.createElement('input');
|
|
|
+ inputElement.setAttribute('type', 'text');
|
|
|
+ inputElement.setAttribute('class', 'templateInput');
|
|
|
+ inputElement.setAttribute('id', id);
|
|
|
+ return inputElement;
|
|
|
+ },
|
|
|
+ getValue() {
|
|
|
+ // this.form = this.$refs['valueChange'].innerHTML;
|
|
|
+ return {
|
|
|
+ form: this.$refs['valueChange'].innerHTML,
|
|
|
+ valueObj: this.valueObj
|
|
|
+ };
|
|
|
+ },
|
|
|
+ init({ form, valueObj }) {
|
|
|
+ this.form = form;
|
|
|
+ this.valueObj = valueObj;
|
|
|
+ this.objInit();
|
|
|
+ },
|
|
|
+ editInputChange(domObj) {
|
|
|
+ let dom = document.getElementById(this.domId);
|
|
|
+ dom.style.width = domObj.width + 'px';
|
|
|
+ if (domObj.readonly == 2) {
|
|
|
+ dom.setAttribute('readonly', 'readonly');
|
|
|
+ } else {
|
|
|
+ dom.removeAttribute('readonly');
|
|
|
+ }
|
|
|
+ delete this.valueObj[dom.id];
|
|
|
+ this.valueObj[domObj.id] = dom.value;
|
|
|
+ dom.id = domObj.id;
|
|
|
+ },
|
|
|
+ onRightClick(PointerEvent) {
|
|
|
+ this.rightClickShow = true;
|
|
|
+ this.$nextTick(() => {
|
|
|
+ let y = PointerEvent.pageY;
|
|
|
+ let x = PointerEvent.pageX + 10;
|
|
|
+ if (PointerEvent.screenY >= PointerEvent.view.innerHeight) {
|
|
|
+ y -= 80;
|
|
|
+ }
|
|
|
+ this.$refs.popoverRef.$el.style.top = y + 'px';
|
|
|
+ this.$refs.popoverRef.$el.style.left = x + 'px';
|
|
|
+ });
|
|
|
+ },
|
|
|
+ inputChange(event) {
|
|
|
+ if (event.target && event.target.className == 'templateInput') {
|
|
|
+ this.valueObj[event.target.id] = event.target.value;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ inputClick(event) {
|
|
|
+ if (event.target && event.target.className == 'templateInput') {
|
|
|
+ this.domId = event.target.id;
|
|
|
+ console.log(event, 'event');
|
|
|
+ // event.getAttribute('class', 'templateInput');
|
|
|
+ this.$emit('editShow', {
|
|
|
+ templateDivRef: 'customTextRef' + this.id,
|
|
|
+ domObj: {
|
|
|
+ width: event.target.offsetWidth,
|
|
|
+ id: event.target.id,
|
|
|
+ readonly: event.target.readOnly ? 2 : 1
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ mounted() {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ console.log(document.getElementById(this.id), 'dsd');
|
|
|
+ document
|
|
|
+ .getElementById(this.id)
|
|
|
+ .addEventListener('change', this.inputChange);
|
|
|
+
|
|
|
+ document
|
|
|
+ .getElementById(this.id)
|
|
|
+ .addEventListener('click', this.inputClick);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ };
|
|
|
+</script>
|
|
|
+<style lang="scss" scoped>
|
|
|
+ :deep(.templateInput) {
|
|
|
+ width: 80px;
|
|
|
+ border: solid 1px #bfbfbf;
|
|
|
+ padding: 1px;
|
|
|
+ margin: 1px;
|
|
|
+ margin-left: 3px;
|
|
|
+ }
|
|
|
+ .contenteditable {
|
|
|
+ // padding: 5px;
|
|
|
+ width: 100%;
|
|
|
+ min-height: 20px;
|
|
|
+ padding-left: 10px;
|
|
|
+ // border: solid 1px #b3b0b0;
|
|
|
+ }
|
|
|
+</style>
|