2024-10-31 01:32:52 +08:00
|
|
|
|
"use strict";
|
|
|
|
|
import {MyBiz} from './biz/MyBiz.js'
|
|
|
|
|
import {MyUtils} from './common/MyUtils.js'
|
|
|
|
|
import {MyEventListener} from "./event/MyEventListener.js";
|
|
|
|
|
|
2024-10-31 15:07:34 +08:00
|
|
|
|
(function () {
|
2024-11-01 13:53:56 +08:00
|
|
|
|
// 获取 User-Agent 字符串
|
|
|
|
|
const userAgent = window.navigator.userAgent;
|
|
|
|
|
// 获取屏幕宽度
|
|
|
|
|
// const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
|
2024-11-03 19:09:22 +08:00
|
|
|
|
const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
|
2024-11-01 13:53:56 +08:00
|
|
|
|
// 判断是否是手机
|
|
|
|
|
const isMobile = /mobi|android|iphone|ipad|ipod/i.test(userAgent.toLocaleLowerCase()) || screenWidth < 768;
|
|
|
|
|
const isIOS = /iphone|ipad|ipod/i.test(userAgent.toLocaleLowerCase()) || screenWidth < 768;
|
|
|
|
|
const isAndroid = /android/i.test(userAgent.toLocaleLowerCase()) || screenWidth < 768;
|
|
|
|
|
// 判断是否是平板电脑
|
|
|
|
|
const isTablet = /tablet/i.test(userAgent.toLocaleLowerCase()) || (screenWidth >= 768 && screenWidth < 1024);
|
2024-10-31 01:32:52 +08:00
|
|
|
|
//init
|
|
|
|
|
window.myEdit = {
|
|
|
|
|
/**
|
|
|
|
|
* 优先初始化 工具
|
|
|
|
|
*/
|
|
|
|
|
utils: new MyUtils(),
|
2024-10-31 15:07:34 +08:00
|
|
|
|
|
2024-10-31 01:32:52 +08:00
|
|
|
|
/**
|
|
|
|
|
* 其次初始化 事件监听
|
|
|
|
|
*/
|
2024-10-31 15:07:34 +08:00
|
|
|
|
eventListener: new MyEventListener(),
|
2024-10-31 01:32:52 +08:00
|
|
|
|
|
2024-10-31 15:07:34 +08:00
|
|
|
|
/**
|
|
|
|
|
* ctx
|
|
|
|
|
*/
|
2024-10-31 01:32:52 +08:00
|
|
|
|
ctx: {
|
2024-10-31 21:07:42 +08:00
|
|
|
|
/**
|
|
|
|
|
* 是否是手机端
|
|
|
|
|
*/
|
2024-11-01 13:53:56 +08:00
|
|
|
|
isMobile: isMobile,
|
|
|
|
|
isIOS: isIOS,
|
|
|
|
|
isAndroid: isAndroid,
|
|
|
|
|
//判断是否是平板电脑
|
|
|
|
|
isTablet: isTablet,
|
2024-11-03 19:09:22 +08:00
|
|
|
|
screenWidth: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
|
2024-10-31 21:12:13 +08:00
|
|
|
|
//高度 for android
|
2024-11-03 19:09:22 +08:00
|
|
|
|
screenHeight: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight,
|
2024-10-31 15:07:34 +08:00
|
|
|
|
/**
|
|
|
|
|
* 默认body front-size 单位px
|
|
|
|
|
*/
|
2024-11-01 11:18:21 +08:00
|
|
|
|
editFrontSize: 16,
|
2024-10-31 15:07:34 +08:00
|
|
|
|
/**
|
|
|
|
|
* 设计稿宽度 375
|
|
|
|
|
*/
|
2024-11-01 09:52:52 +08:00
|
|
|
|
designWith: 375,
|
2024-10-31 01:32:52 +08:00
|
|
|
|
/**
|
|
|
|
|
* 文档的根节点
|
|
|
|
|
*/
|
2024-10-31 15:07:34 +08:00
|
|
|
|
MyRoot: null,
|
2024-10-31 01:32:52 +08:00
|
|
|
|
/**
|
|
|
|
|
* 文档的结构树
|
|
|
|
|
*/
|
|
|
|
|
MyDocMap: new Map(),
|
|
|
|
|
|
|
|
|
|
getMapItem: function (orderNo) {
|
|
|
|
|
return this.MyDocMap.get(orderNo);
|
|
|
|
|
},
|
|
|
|
|
/**
|
|
|
|
|
* 最新修改的元素. 当前只支持撤销一次
|
|
|
|
|
*/
|
|
|
|
|
latestOpDoc: null,
|
|
|
|
|
/**
|
|
|
|
|
* 行增加记录。 行号
|
|
|
|
|
*/
|
|
|
|
|
rowNo: 0,
|
|
|
|
|
|
|
|
|
|
incrementNumThenReturn: function () {
|
|
|
|
|
return this.rowNo++;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 是否开始输入中文
|
|
|
|
|
*/
|
|
|
|
|
inCompositionEvent: false,
|
|
|
|
|
|
|
|
|
|
showTestText: function () {
|
|
|
|
|
//显示用户的输入内容
|
|
|
|
|
let userInput = document.getElementById("testInput");
|
|
|
|
|
if (userInput) {
|
|
|
|
|
let obj = {}
|
|
|
|
|
for (let [k, v] of this.MyDocMap.entries()) {
|
|
|
|
|
if (v["data-hidden"] && v["data-hidden"] === true) {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
obj[k] = v
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// console.log("userInput : ", userInput)
|
|
|
|
|
userInput.innerText = JSON.stringify(obj)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
2024-10-31 15:07:34 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 业务处理
|
|
|
|
|
*/
|
|
|
|
|
biz: new MyBiz()
|
2024-10-31 01:32:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-10-31 19:01:59 +08:00
|
|
|
|
// 直接调用工具函数获取 A4 纸的像素尺寸
|
|
|
|
|
let a4_size = window.myEdit.utils.A4SizeInPixels();
|
|
|
|
|
window.myEdit.ctx.designWith = a4_size.width;
|
|
|
|
|
|
2024-10-31 01:32:52 +08:00
|
|
|
|
/**
|
|
|
|
|
* 业务处理
|
|
|
|
|
*/
|
|
|
|
|
window.myEdit.biz = new MyBiz();
|
|
|
|
|
|
2024-10-31 15:07:34 +08:00
|
|
|
|
/**
|
|
|
|
|
* 窗口重载&文档重载事件 for 响应式
|
|
|
|
|
*/
|
|
|
|
|
window.myEdit.utils.RefreshRootFrontSize();
|
2024-10-31 20:22:46 +08:00
|
|
|
|
window.myEdit.utils.RefreshEditFrontSize();
|
2024-11-01 13:53:56 +08:00
|
|
|
|
document.addEventListener('DOMContentLoaded', window.myEdit.eventListener.RefreshRootFrontSize);
|
|
|
|
|
document.addEventListener('DOMContentLoaded', window.myEdit.eventListener.RefreshEditFrontSize);
|
2024-10-31 15:07:34 +08:00
|
|
|
|
window.addEventListener('pageshow', function (e) {
|
|
|
|
|
if (e.persisted) {
|
|
|
|
|
window.myEdit.utils.RefreshRootFrontSize();
|
2024-10-31 20:22:46 +08:00
|
|
|
|
window.myEdit.utils.RefreshEditFrontSize();
|
2024-10-31 15:07:34 +08:00
|
|
|
|
}
|
|
|
|
|
});
|
2024-11-01 13:53:56 +08:00
|
|
|
|
window.addEventListener('resize', window.myEdit.eventListener.RefreshRootFrontSize);
|
|
|
|
|
window.addEventListener('resize', window.myEdit.eventListener.RefreshEditFrontSize);
|
2024-10-31 15:07:34 +08:00
|
|
|
|
/**
|
2024-10-31 19:28:20 +08:00
|
|
|
|
* 窗口撤销事件.
|
|
|
|
|
* js中的键盘事件只有三种:keydown、keyup、keypress。它们触发的顺序是:keydown -> keypress -> keyup。当按下一个键不放开,一般会重复地触发 keydown+keypress,直到放开后触发一个 keyup 事件。
|
|
|
|
|
*
|
2024-10-31 15:07:34 +08:00
|
|
|
|
*/
|
2024-10-31 20:22:46 +08:00
|
|
|
|
window.addEventListener('keydown', window.myEdit.eventListener.WindowsKeydownOrTouchendHandle, true);
|
2024-10-31 15:07:34 +08:00
|
|
|
|
}());
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 加载完成后执行
|
|
|
|
|
*/
|
|
|
|
|
window.onload = function () {
|
|
|
|
|
//样式事件监听
|
|
|
|
|
let styleList = document.getElementsByClassName("fixStyleInnerSpan");
|
2024-10-31 19:01:59 +08:00
|
|
|
|
// console.log("styleList : ", styleList);
|
2024-10-31 15:07:34 +08:00
|
|
|
|
if (styleList && styleList.length > 0) {
|
|
|
|
|
for (let i = 0; i < styleList.length; i++) {
|
2024-10-31 19:01:59 +08:00
|
|
|
|
// console.log(styleList[i]);
|
2024-10-31 15:07:34 +08:00
|
|
|
|
styleList[i].addEventListener('click', window.myEdit.eventListener.SurroundContentsByStyleListener, true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//ctx
|
|
|
|
|
window.myEdit.ctx.MyRoot = document.getElementById("noteshare");
|
|
|
|
|
// 初始化第一个输入框
|
|
|
|
|
let newParagraph = document.createElement("p");
|
|
|
|
|
newParagraph.setAttribute("contenteditable", "true");
|
|
|
|
|
let uuid = window.myEdit.utils.Uuid()
|
|
|
|
|
let curOrder = window.myEdit.ctx.incrementNumThenReturn();
|
|
|
|
|
newParagraph.setAttribute("data-id", uuid)
|
|
|
|
|
newParagraph.setAttribute("id", uuid)
|
|
|
|
|
newParagraph.setAttribute("data-order", curOrder)
|
2024-10-31 19:28:20 +08:00
|
|
|
|
newParagraph.onkeyup = window.myEdit.eventListener.KeydownListener
|
2024-11-03 19:09:22 +08:00
|
|
|
|
newParagraph.innerHTML = "<br>"
|
2024-10-31 15:07:34 +08:00
|
|
|
|
//添加一行
|
|
|
|
|
window.myEdit.utils.AddNewParagraph(newParagraph);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 输入事件
|
|
|
|
|
*/
|
|
|
|
|
window.myEdit.eventListener.RegisterEventHandle('input', window.myEdit.eventListener.InputListener);
|
|
|
|
|
window.myEdit.eventListener.RegisterEventHandle('compositionstart', window.myEdit.eventListener.CompositionstartListener);
|
|
|
|
|
window.myEdit.eventListener.RegisterEventHandle('compositionend', window.myEdit.eventListener.CompositionendListener);
|
|
|
|
|
|
2024-10-31 01:32:52 +08:00
|
|
|
|
|
|
|
|
|
//监听鼠标抬起事件
|
2024-10-31 20:22:46 +08:00
|
|
|
|
document.getElementById("noteshare").addEventListener("mouseup", window.myEdit.eventListener.MouseUpOrTouchend, true);
|
2024-10-31 15:52:17 +08:00
|
|
|
|
//这里监听鼠标按下事件
|
|
|
|
|
document.getElementById("_style_utils").addEventListener("mousedown", function (e) {
|
|
|
|
|
const event = window.myEdit.utils.ParseEvent(e);
|
|
|
|
|
console.log("mousedown: ", event)
|
|
|
|
|
window.myEdit.utils.ProhibitDefaultEvent(event);
|
|
|
|
|
}, false);
|
2024-10-31 21:07:42 +08:00
|
|
|
|
|
2024-11-01 13:53:56 +08:00
|
|
|
|
// 阻止双击放大
|
|
|
|
|
var lastTouchEnd = 0;
|
|
|
|
|
document.addEventListener('touchstart', function (event) {
|
|
|
|
|
if (event.touches.length > 1) {
|
|
|
|
|
event.preventDefault();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
document.addEventListener('touchend', function (event) {
|
|
|
|
|
let now = (new Date()).getTime();
|
|
|
|
|
if (now - lastTouchEnd <= 300) {
|
|
|
|
|
event.preventDefault();
|
|
|
|
|
}
|
|
|
|
|
lastTouchEnd = now;
|
|
|
|
|
}, false);
|
|
|
|
|
// 阻止双指放大
|
|
|
|
|
document.addEventListener('gesturestart', function (event) {
|
|
|
|
|
event.preventDefault();
|
|
|
|
|
});
|
2024-10-31 21:07:42 +08:00
|
|
|
|
|
|
|
|
|
/**
|
2024-11-01 09:59:05 +08:00
|
|
|
|
* 使用说明
|
2024-10-31 21:07:42 +08:00
|
|
|
|
*/
|
2024-11-01 09:59:05 +08:00
|
|
|
|
let testDiv = document.getElementById("testDevice");
|
2024-11-01 11:18:21 +08:00
|
|
|
|
testDiv.innerText += "\n\n ### info ###" +
|
2024-11-01 10:28:33 +08:00
|
|
|
|
"\n'#空格': h1" +
|
|
|
|
|
"\n'##空格': h2" +
|
|
|
|
|
"\n'###空格': h3" +
|
|
|
|
|
"\n'####空格': h4" +
|
|
|
|
|
"\n'#####空格': h5" +
|
|
|
|
|
"\n'######空格': h6" +
|
|
|
|
|
"\n'-空格': 无序列表" +
|
|
|
|
|
"\n'1.空格': 有序序列表 形如 1. "
|
2024-10-31 01:32:52 +08:00
|
|
|
|
}
|
|
|
|
|
|