|
发表于 2025-5-2 23:38:36
|
显示全部楼层
本帖最后由 coult3 于 2025-5-2 23:42 编辑
又更新了一下,8楼的脚本有个小bug:假如当前输入框有一些文字,但是光标在这些文字的中间,这时粘贴,会发现插入的链接在文本末尾而不是光标之后,所以需要处理一下。
另外加入了一个新变量 textTest 对剪贴板原内容进行预处理,这样就可以更好地判断剪贴板中是不是链接或者特定协议了。
预处理也解决了协议名里有很长的空格 以及 : 和 / / 之间有空格的情况。😎
- (function () {
- document.addEventListener('paste', evt => {
- const clipboardData = evt.clipboardData;
- if (clipboardData) {
- const target = document.activeElement;
- if (target && (target.tagName === 'INPUT' || target?.tagName === 'TEXTAREA')) {
- let text = clipboardData.getData('text/plain');
- // 先不管三七二十一,先把剪贴板中的文本去除空格,然后将其赋值给变量 textTest
- let textTest = text.replace(/\s+/g, '');
- // 然后检查 textTest 的前12个字符是否包含 :// 或者 textTest 整个文本是否以mailto:或magnet:或javascript: 开头,因为mailto/magnet/javascript 链接没有双斜杠。
- // 如果 textTest 满足要求,则说明剪贴板中的文本是链接或者特定协议,然后就可以处理 【原剪贴板】中的文本。
- // 这里的特定协议可以自定义
- let Regex = /^(mailto|magnet|javascript):/;
- if ( textTest.substring(0, 12).includes('://') || Regex.test(textTest) ) {
- evt.preventDefault();
- // 获取光标位置
- const cursorPos = target.selectionStart;
- // 获取光标前后的文本
- const beforeText = target.value.substring(0, cursorPos);
- const afterText = target.value.substring(cursorPos);
- // 定义要插入的文本,把 【原剪贴板】中的文本 去掉空格
- const insertText = text.replace(/\s+/g, '');
- // 拼接成新的文本字符串
- const newValue = beforeText + insertText + afterText;
- // 更新输入框的值
- target.value = newValue;
- // 更新光标位置到插入文本的后面
- const newCursorPos = cursorPos + insertText.length;
- target.setSelectionRange(newCursorPos, newCursorPos);
- }
- }
- }
- }, true);
- })();
复制代码 参考:
javascript 插入文本到光标位置
https://developer.mozilla.org/en ... I/Reference/Schemes
https://developer.mozilla.org/zh-CN/docs/Web/URI
https://learn.microsoft.com/zh-c ... tform-apis/aa767739(v=vs.85)
https://learn.microsoft.com/zh-c ... sources/uri-schemes
https://learn.microsoft.com/en-u ... /launch-default-app
|
|