如何从零开发一个Tinymce编辑器输入框,下拉框插件

种地的码农 2023-11-18 11:25:00

先看看效果

 

 

 

Tinymce编辑器中插入--input输入框,下拉框

支持下拉选择,支持自定义ID命名,支持自定义Style样式,支持自定义下拉选择提示内容。

直接上所有代码,有问题可以联系我!!!

tinymce.PluginManager.add('jb-input', function (editor, url) {
	const openDialog = function () {
		let selectNode = editor.dom.getParent(editor.selection.getNode(), '[data-jb-input]')
		let initData = initDataFunc(selectNode)
		return editor.windowManager.open({
			title: '输入框配置',
			body: {
				type: 'panel',
				items: [
					{
						type: 'input',
						name: 'id',
						label: '唯一ID'
					},
					{
						type: 'input',
						name: 'width',
						label: '宽度'
					},
					{
						type: 'input',
						name: 'dataList',
						label: '候选词(使用,分隔)'
					}
				]
			},
			buttons: [
				{
					type: 'cancel',
					text: 'Close'
				},
				{
					type: 'submit',
					text: 'Save',
					primary: true
				}
			],
			initialData: initData,
			onSubmit: function (api) {
				const data = api.getData()
				console.log(data)
				// 判断是否是编辑
				if (selectNode) {
					let inputNode = selectNode.getElementsByTagName('input')[0]
					inputNode.style.width = data.width + 'px'
					// 更新dataList
					let dataListNode = selectNode.getElementsByTagName('datalist')[0]
					if (null === dataListNode) {
						dataListNode = document.createElement('datalist')
						dataListNode.id = data.id + '-dataList'
						selectNode.appendChild(dataListNode)
						let dataList = data.dataList.split(',')
						genOption(dataList, dataListNode)
						api.close()
					} else {
						dataListNode.innerHTML = ''
						let dataList = data.dataList.split(',')
						genOption(dataList, dataListNode)
						api.close()
					}
				} else {
					let content = `<span data-jb-input><input id="${data.id}" style="width: ${data.width}px" class="jb-input" list="${data.id}-dataList">`
					let dataList = data.dataList.split(',')
					if (dataList.length > 0) {
						content += `<datalist id="${data.id}-dataList">`
						for (let i = 0; i < dataList.length; i++) {
							content += `<option value="${dataList[i]}">`
						}
						content += `</datalist>`
					}
					content += `</span>`
					// 将输入框内容插入到内容区光标位置
					editor.insertContent(content)
					api.close()
				}
			}
		})
	}
	// 生成option
	const genOption = (dataList, dataListNode) => {
		if (dataList.length > 0) {
			for (let i = 0; i < dataList.length; i++) {
				let optionNode = document.createElement('option')
				optionNode.value = dataList[i]
				dataListNode.appendChild(optionNode)
			}
		}
	}

	// 初始化数据
	const initDataFunc = (selectNode) => {
		if (selectNode) {
			let dataList = []
			if (selectNode) {
				// 遍历所有的option
				let options = selectNode.getElementsByTagName('option')
				for (let i = 0; i < options.length; i++) {
					let option = options[i]
					dataList.push(option.value)
				}
			}
			let inputNode = selectNode.getElementsByTagName('input')[0]
			if (null === inputNode) {
				return {}
			}
			return {
				id: inputNode.id,
				width: parseFloat(inputNode.style.width).toString(),
				dataList: dataList.join(',')
			}
		} else {
			return {}
		}
	}

	// 注册一个工具栏按钮名称
	editor.ui.registry.addButton('jb-input', {
		text: '输入框',
		onAction: function () {
			openDialog()
		}
	})

	// 注册一个菜单项名称 menu/menubar
	editor.ui.registry.addMenuItem('jb-input', {
		text: '输入框',
		onAction: function () {
			openDialog()
		}
	})

	// 删除
	editor.ui.registry.addButton('jb-input-delete', {
		tooltip: 'Delete',
		text: '删除',
		icon: 'table-delete-table',
		onAction: function () {
			editor.execCommand('jbDeleteInput')
		}
	})
	editor.addCommand('jbDeleteInput', function () {
		try {
			editor.dom.getParent(editor.selection.getNode(), '[data-jb-input]').remove() //获得选中节点 删除即可
			editor.focus()
		} catch (error) {
			console.error(error)
		}
	})

	//上下文菜单配置 (已注册的按钮)
	const openurlToolbar = 'jb-input-delete \\| jb-input'
	if (openurlToolbar.length > 0) {
		//判断是否是 Openurl 用于触发上下文菜单
		const isOpen = function (_openurl) {
			return editor.dom.is(_openurl, '[data-jb-input]') && editor.getBody().contains(_openurl)
		}
		//注册上下文菜单
		editor.ui.registry.addContextToolbar('jb-input', {
			predicate: isOpen,
			items: openurlToolbar,
			scope: 'node',
			position: 'node'
		})
	}

	return {
		getMetadata: function () {
			return {
				//插件名和链接会显示在“帮助”→“插件”→“已安装的插件”中
				name: 'jb-input plugin', //插件名称
				url: 'http://exampleplugindocsurl.com' //作者网址
			}
		}
	}
})

 

这个文章写的也不错

制作一个插件 | TinyMCE中文文档中文手册 (ax-z.cn)

如果大家觉得不错,点赞,评论,关注。以后继续分享更多干货。

 

...全文
342 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

145

社区成员

发帖
与我相关
我的任务
社区描述
欢迎来到 Tinymce-plugin 这是一个专注 提供 强大、好用、丰富 的 tinymce 富文本编辑器 插件、扩展 和 技术 的技术社区,方便 交流讨论,分享经验 。
开源github前端 个人社区 四川省·成都市
社区管理员
  • Five-菜鸟级
  • 爱编程的喵喵
  • Jioho_
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎来到 Tinymce-plugin

这是一个专注 提供 强大、好用、丰富 的 tinymce 富文本编辑器 插件、扩展 和 技术 的技术社区,方便 交流讨论,分享经验 。

本社区有多个不错的插件或者项目,也有各种问题求解,经验分享,优质好文,助你解决开发使用中的问题。

 

 

 

试试用AI创作助手写篇文章吧