以下为低代码MK开发的一点小知识笔记
1. 使用案例(明细表字段添加跳转链接)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
function onLoad_3() { if (MKXFORM.viewStatus == 'view') { const fieldPrefix = "mk_payment_request_detail.fd_col_contract~"; const tables = MKXFORM.getValue("mk_payment_request_detail").values;
if (tables && Array.isArray(tables) && tables.length > 0) { for (let i = 0; i < tables.length; i++) { const field_contract = fieldPrefix + tables[i].key; const contract = tables[i]["fd_col_contract"];
if (contract && Array.isArray(contract) && contract.length > 0 && contract[0].fdId) {
MKXFORM.callTic({ interfaceCode: "function_6f73n7dgw6vr7xi5", param: { "fdId": contract[0].fdId } }, function (error, res) { if (res && res.data && res.data.fdSourceId) { const targetUrl = 'https://xxx.xxx/xxx/view/' + res.data.fdSourceId; window.MKXFORM.GLOBALJS.setA2Target(field_contract, targetUrl);
let retryCount = 0; const maxRetry = 5; const timer = setInterval(() => { const fieldReplace = window.MKXFORM.GLOBALJS.escapeFieldForSelector(field_contract); const allCus = document.querySelectorAll('.custom-parent-a-' + fieldReplace);
if (allCus.length > 0) { clearInterval(timer); } else if (retryCount >= maxRetry) { clearInterval(timer); console.warn("设置a标签超时,目标元素未找到", { field: field_contract }); } else { window.MKXFORM.GLOBALJS.setA2Target(field_contract, targetUrl); retryCount++; } }, 1000);
} else { console.error("onLoad_3:查询流程ID失败,未获取到有效fdSourceId", { error, res, field: field_contract }); } }); } else { console.warn("onLoad_3:未获取到有效项目ID,无需调用接口", { contract, field: field_contract }); } } } } }
|
2. 关键代码:setA2Target(为元素包裹 a 标签)
为目标字段的文本元素添加<a>标签父元素,实现跳转功能,其他标签(如 div、span)可参考此逻辑修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
function setA2Target(field, url) { try { const fieldReplace = window.MKXFORM.GLOBALJS.escapeFieldForSelector(field); const targetEl = document.querySelector("[data-name='" + field + "'] span.ele-item-text");
if (!targetEl) { console.warn("setA2Target:未找到目标元素", { field, targetSelector: "[data-name='" + field + "'] span.ele-item-text" }); return; }
const existingA = targetEl.closest('.custom-parent-a-' + fieldReplace); if (existingA) { existingA.href = url; return; }
const parentWrap = document.createElement('a'); parentWrap.className = 'custom-parent-a-' + fieldReplace; parentWrap.setAttribute('href', url); parentWrap.setAttribute('target', '_blank'); parentWrap.setAttribute('rel', 'noopener noreferrer');
targetEl.parentNode.insertBefore(parentWrap, targetEl); parentWrap.appendChild(targetEl);
} catch (e) { console.error("设置a元素失败", { field, url, error: e.message, stack: e.stack }); } }
|
3. 关键代码:escapeFieldForSelector(字段标识转义工具)
处理字段标识中的 CSS 特殊字符(如 . 、 ~ 、 $ 等),避免生成无效的 CSS 选择器,导致元素查询失败。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
function escapeFieldForSelector(field) { if (!field) return ''; return field .replace(/\./g, '\\.') .replace(/~/g, '\\~') .replace(/\$/g, '\\$') .replace(/^(\d)/, '\\3$1 ') .replace(/__(\d)/, '__\\3$1 '); }
|