diff --git a/src/core/view/components/rich-text/index.vue b/src/core/view/components/rich-text/index.vue index cada876025ac8e9f0b852706ba8ac23c7666ca56..85c1c18543c20f185ef284b25d72b5a21178746d 100644 --- a/src/core/view/components/rich-text/index.vue +++ b/src/core/view/components/rich-text/index.vue @@ -32,13 +32,22 @@ export default { }, methods: { _renderNodes (nodes) { + let scopeId = '' + let $vm = this + while ($vm) { + !scopeId && (scopeId = $vm.$options._scopeId) + $vm = $vm.$parent + } + + const hasItemClick = !!this.$listeners.itemclick + if (!this._isMounted) { return } if (typeof nodes === 'string') { nodes = parseHtml(nodes) } - const nodeList = parseNodes(nodes, document.createDocumentFragment(), this) + const nodeList = parseNodes(nodes, document.createDocumentFragment(), scopeId, hasItemClick && this.triggerItemClick) nodeList.appendChild(this.$refs.sensor.$el) const content = this.$refs.content content.innerHTML = '' @@ -46,6 +55,9 @@ export default { }, _updateView () { window.dispatchEvent(new CustomEvent('updateview')) + }, + triggerItemClick (e, detail = {}) { + this.$trigger('itemclick', e, detail) } } } diff --git a/src/core/view/components/rich-text/nodes-parser.js b/src/core/view/components/rich-text/nodes-parser.js index 57c2d45208e92c25ec33fcecf34137aeba70fc73..e9533aaba907750f625243c55c1c8c17f73d349b 100644 --- a/src/core/view/components/rich-text/nodes-parser.js +++ b/src/core/view/components/rich-text/nodes-parser.js @@ -102,13 +102,7 @@ function normlizeValue (tagName, name, value) { return value } -export default function parseNodes (nodes, parentNode, $vm) { - let scopeId = '' - while ($vm) { - !scopeId && (scopeId = $vm.$options._scopeId) - $vm = $vm.$parent - } - +export default function parseNodes (nodes, parentNode, scopeId, triggerItemClick) { nodes.forEach(function (node) { if (!isPlainObject(node)) { return @@ -146,9 +140,11 @@ export default function parseNodes (nodes, parentNode, $vm) { }) } + processClickEvent(node, elem, triggerItemClick) + const children = node.children if (Array.isArray(children) && children.length) { - parseNodes(node.children, elem) + parseNodes(node.children, elem, scopeId, triggerItemClick) } parentNode.appendChild(elem) @@ -160,3 +156,13 @@ export default function parseNodes (nodes, parentNode, $vm) { }) return parentNode } + +function processClickEvent (node, elem, triggerItemClick) { + if (['a', 'img'].includes(node.name) && triggerItemClick) { + elem.setAttribute('onClick', 'return false;') + elem.addEventListener('click', (e) => { + triggerItemClick(e, { node }) + e.stopPropagation() + }, true) + } +}