Teams用户脚本无效:粘贴Trac工单链接无法格式化显示
Teams网页版用户脚本:粘贴工单链接无法正确显示格式化内容的解决思路
我需要实现一个功能:将工单系统URL粘贴到其他系统时,无需手动格式化就能显示美观的链接。目前在GitHub上已经有一个生效的用户脚本,可以把<rootURL>/ticket/1234这类链接转换为[#1234](<rootURL>/ticket/1234),并被GitHub正常渲染成带编号的链接。
现在想在Teams中实现同样的功能,Windows版Teams虽然有可编程性,但没找到合适的实现方法,所以改用网页版Teams编写新的用户脚本(如果有Teams原生实现方案也欢迎告知)。
GitHub的消息编辑框是textarea,而Teams使用的是动态更新的div。我编写的粘贴处理函数能创建正确的DOM元素,但执行完成后,Teams消息中仍然显示原始未格式化的URL。日志显示逻辑执行正常,但新创建的DOM元素并未在UI中显示,求解决思路。
以下是我的用户脚本:
// ==UserScript== // @name Teams Trac link // @namespace http://tampermonkey.net/ // @version 0.1 // @description Reformat pasted link to Trac ticket to look pretty in Teams // @author Chris Nelson, PE // @match https://teams.microsoft.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=microsoft.com // @grant none // ==/UserScript== // Handle paste event by making custom link, when appropriate. // If handled, suppress the browser handling of the event. function handlePaste(event) { console.log("Handling paste"); var target = event.target; // Get the text that the user is trying to paste var text = (event.clipboardData || window.clipboardData).getData('text'); try { var url = new URL(text); if (url.pathname.startsWith('/trac/ticket')) { console.log("Pasting a Trac ticket link: " + text); var parts = url.pathname.split('/'); var ticketNumber = parts[3]; // Don't let the browser also paste event.preventDefault(); // Create a link var link = document.createElement('a'); link.innerHTML = '#' + ticketNumber; link.href = text; link.title = 'Trac ticket #' + ticketNumber; // FIXME - nothing from here on works to insert the link // Get all divs var divs = Array.from(document.querySelectorAll('div')); // Filter to those with an ID that starts 'new-message-' divs = divs.filter(d => d.id.startsWith('new-message-')); var parent = divs[0]; console.log('Before adding, div has ' + parent.childNodes.length + ' children'); parent.appendChild(link); console.log('After adding, div has ' + parent.childNodes.length + ' children'); } } catch (error) { // Nothing, just let the browser do its thing. } } (function() { console.log("Attaching paste handler"); // Intercept a paste event anywhere on the page but // only handle it if pasting into a new message. document.body.addEventListener('paste', (event) => { var target = event.target; console.log("Got paste event for " + target); if (target.tagName.toLowerCase() == 'br' && target.dataset.ckeFiller == 'true') { handlePaste(event); } }, false); })();
内容的提问来源于stack exchange,提问作者Chris Nelson
相关产品推荐
相关产品推荐

