function IsBlackLabel(text) { if (text === null || text === undefined) return true; var trimmed = String(text).replace(/^\s+|\s+$/g, ''); return trimmed === ''; } var MBFLAGS = { MB_OK: 0x00000000, MB_OKCANCEL: 0x00000001, MB_ABORTRETRYIGNORE: 0x00000002, MB_YESNOCANCEL: 0x00000003, MB_YESNO: 0x00000004, MB_RETRYCANCEL: 0x00000005, MB_CANCELTRYCONTINUE: 0x00000006, MB_HELP: 0x00004000, MB_DEFBUTTON1: 0x00000000, MB_DEFBUTTON2: 0x00000100, MB_DEFBUTTON3: 0x00000200, MB_DEFBUTTON4: 0x00000300, MB_ICONERROR: 0x00000010, MB_ICONWARNING: 0x00000030, MB_ICONINFORMATION: 0x00000040 }; var MBRET = { IDOK: 1, IDCANCEL: 2, IDABORT: 3, IDRETRY: 4, IDIGNORE: 5, IDYES: 6, IDNO: 7, IDCLOSE: 8, IDHELP: 9, IDTRYAGAIN: 10, IDCONTINUE: 11 }; Object.freeze(MBFLAGS); Object.freeze(MBRET); (function(global) { try { var storage = Bridge.External.Storage; var path = storage.path; var root = path.getDir(path.program); var respath = path.combine(root, "reslib.dll"); var res = Bridge.Resources; global.respath = respath; global.getPublicRes = function(resId) { return res.fromfile(respath, resId); } } catch (e) {} })(this); function GetLocaleStringFromResId(resId) { try { return getPublicRes(resId); } catch (e) {} } var msgboxResult = {}; function MessageBox(_lpText, _lpCaption, _uType, _objColor) { var id = MessageBoxForJS(_lpText, _lpCaption, _uType, _objColor, function(valueReturn) { getRes = valueReturn; msgboxResult[id] = valueReturn; }); return id; } function GetMessageBoxResult(msgboxId) { var result = msgboxResult[msgboxId]; if (result === undefined || result === null) return null; msgboxResult[msgboxId] = null; return result; } function ClearAllMessageBoxResults() { msgboxResult = null; msgboxResult = {}; } // 注意:callback 函数无返回值,传入参数:整数型 按下的按钮值。 /* 使用示例: MessageBoxForJS("请选择一个按钮", "", MBFLAGS.MB_OKCANCEL, "#0078d7", function(value) { console.log("MessageBoxForJS callback value: " + value); }) */ function MessageBoxForJS(_lpText, _lpCaption, _uType, _objColor, _callback) { var msgbox = document.createElement("div"); msgbox.classList.add("notice-back"); msgbox.classList.add("win-ui-dark"); var uniqueId = "msgbox_" + new Date().getTime(); msgbox.id = uniqueId; var msgbody = document.createElement("div"); msgbody.classList.add("notice-body"); if (!IsBlackLabel(_objColor)) { msgbody.style.backgroundColor = _objColor; } msgbox.appendChild(msgbody); var msgcontainter = document.createElement("div"); msgcontainter.style.height = "100%"; msgcontainter.style.width = "100%"; msgcontainter.style.maxHeight = "100%"; msgcontainter.style.minHeight = "0px"; msgcontainter.style.boxSizing = "border-box"; msgbody.appendChild(msgcontainter); var msgcaption = document.createElement("div"); msgcontainter.appendChild(msgcaption); msgcontainter.style.display = "flex"; msgcontainter.style.flexDirection = "column"; var msgcontent = document.createElement("div"); msgcontent.style.flex = "1 1 auto"; msgcontent.style.marginRight = "3px"; msgcontent.style.overflowX = "hidden"; msgcontent.style.overflowY = "auto"; msgcontent.style.minHeight = "0px"; msgcontainter.appendChild(msgcontent); if (_lpCaption instanceof HTMLElement) { msgcaption.appendChild(_lpCaption); msgcaption.classList.add("notice-title"); } else { if (!IsBlackLabel(_lpCaption)) { var msgtitle = document.createElement("h2"); msgtitle.textContent = _lpCaption; msgtitle.classList.add("notice-title"); msgcaption.appendChild(msgtitle); } else { var msgtitle = document.createElement("h2"); msgtitle.textContent = ""; msgtitle.classList.add("notice-title"); msgcaption.appendChild(msgtitle); } } if (_lpText instanceof HTMLElement || _lpText instanceof HTMLDivElement || typeof _lpText !== "string") { try { _lpText.classList.add("notice-text"); msgcontent.appendChild(_lpText); } catch (e) { if (!IsBlackLabel(_lpText)) { var msgtext = document.createElement("p"); msgtext.textContent = _lpText; msgtext.classList.add("notice-text"); if (IsBlackLabel(_lpCaption)) { msgtext.style.marginTop = "0"; } msgcontent.appendChild(msgtext); } else { var msgtext = document.createElement("p"); msgtext.innerText = ""; msgtext.classList.add("notice-text"); if (IsBlackLabel(_lpCaption)) { msgtext.style.marginTop = "0"; } msgcontent.appendChild(msgtext); } } } else { if (!IsBlackLabel(_lpText)) { var msgtext = document.createElement("p"); msgtext.textContent = _lpText; msgtext.classList.add("notice-text"); if (IsBlackLabel(_lpCaption)) { msgtext.style.marginTop = "0"; } msgcontent.appendChild(msgtext); } else { var msgtext = document.createElement("p"); msgtext.innerText = ""; msgtext.classList.add("notice-text"); if (IsBlackLabel(_lpCaption)) { msgtext.style.marginTop = "0"; } msgcontent.appendChild(msgtext); } } var msgctrls = document.createElement("div"); msgctrls.classList.add("notice-controls"); msgcontainter.appendChild(msgctrls); var cnt = 0; var cbFuncPress = function(valueReturn) { getRes = valueReturn; msgbox.style.opacity = 0; setTimeout(function() { document.body.removeChild(msgbox); }, 500); if (_callback) { _callback(valueReturn); } }; var pfCreateButton = function(displayNameResId, valueReturn) { var btn = document.createElement("button"); btn.innerHTML = GetLocaleStringFromResId(displayNameResId); btn.classList.add("notice-btn"); btn.addEventListener("click", function() { cbFuncPress(valueReturn); }); msgctrls.appendChild(btn); }; if ((_uType & MBFLAGS.MB_HELP) === MBFLAGS.MB_HELP) { pfCreateButton(808, MBRET.IDHELP); } for (cnt = 0; cnt <= MBFLAGS.MB_RETRYCANCEL; cnt++) { if ((_uType & 0xF) === cnt) { switch (cnt) { case MBFLAGS.MB_OK: { pfCreateButton(800, MBRET.IDOK); } break; case MBFLAGS.MB_OKCANCEL: { pfCreateButton(800, MBRET.IDOK); pfCreateButton(801, MBRET.IDCANCEL); } break; case MBFLAGS.MB_ABORTRETRYIGNORE: { pfCreateButton(802, MBRET.IDABORT); pfCreateButton(803, MBRET.IDRETRY); pfCreateButton(804, MBRET.IDIGNORE); } break; case MBFLAGS.MB_YESNOCANCEL: { pfCreateButton(805, MBRET.IDYES); pfCreateButton(806, MBRET.IDNO); pfCreateButton(801, MBRET.IDCANCEL); } break; case MBFLAGS.MB_YESNO: { pfCreateButton(805, MBRET.IDYES); pfCreateButton(806, MBRET.IDNO); } break; case MBFLAGS.MB_RETRYCANCEL: { pfCreateButton(803, MBRET.IDRETRY); pfCreateButton(801, MBRET.IDCANCEL); } break; case MBFLAGS.MB_CANCELTRYCONTINUE: { pfCreateButton(801, MBRET.IDCANCEL); pfCreateButton(803, MBRET.IDRETRY); pfCreateButton(810, MBRET.IDCONTINUE); } break; } } } var btns = msgctrls.querySelectorAll("button"); var defaultBtnCnt = 0; if ((_uType & MBFLAGS.MB_DEFBUTTON1) === MBFLAGS.MB_DEFBUTTON1) defaultBtnCnt = 0; if ((_uType & MBFLAGS.MB_DEFBUTTON2) === MBFLAGS.MB_DEFBUTTON2) defaultBtnCnt = 1; if ((_uType & MBFLAGS.MB_DEFBUTTON3) === MBFLAGS.MB_DEFBUTTON3) defaultBtnCnt = 2; if ((_uType & MBFLAGS.MB_DEFBUTTON4) === MBFLAGS.MB_DEFBUTTON4) defaultBtnCnt = 3; for (cnt = 0; cnt < btns.length; cnt++) { if (cnt === defaultBtnCnt) { btns[cnt].focus(); break; } } document.body.appendChild(msgbox); setTimeout(function() { msgbox.style.opacity = 1; }, 1); return msgbox.id; } function MsgBoxObj() { this.elementId = ""; this.callback = null; this.type = MBFLAGS.MB_OK; this._boundCallback = this._internalCallback.bind(this); this._text = ""; this._title = ""; this._color = "#0078d7"; this.show = function() { this.elementId = MessageBoxForJS( this._text, this._title, this.type, this._color, this._boundCallback ); setTimeout(function() { var element = document.getElementById(this.elementId); if (element) { var bodyElement = element.querySelector(".notice-body"); if (bodyElement) { bodyElement.style.transition = "all 0.5s linear"; } } }.bind(this), 100); } Object.defineProperty(this, "text", { get: function() { return this._text; }, set: function(value) { this._text = value; if (this.elementId) { var element = document.getElementById(this.elementId); if (element) { var textElement = element.querySelector(".notice-text"); if (textElement) { if (value instanceof HTMLElement) { value.classList.add("notice-text"); textElement.parentNode.replaceChild(value, textElement); } else { textElement.innerHTML = value; } } } } } }); Object.defineProperty(this, "title", { get: function() { return this._title; }, set: function(value) { this._title = value; if (this.elementId) { var element = document.getElementById(this.elementId); if (element) { var titleElement = element.querySelector(".notice-title"); if (titleElement) { titleElement.innerHTML = value; } } } } }); Object.defineProperty(this, "color", { get: function() { return this._color; }, set: function(value) { this._color = value; if (this.elementId) { var element = document.getElementById(this.elementId); if (element) { var bodyElement = element.querySelector(".notice-body"); if (bodyElement) { bodyElement.style.backgroundColor = value; } } } } }); this.getElement = function() { return document.getElementById(this.elementId); }; } MsgBoxObj.prototype._internalCallback = function(returnValue) { if (typeof this.callback === "function") { this.callback(returnValue); } }; /** * 异步显示消息框,返回一个 Promise 对象。 * @param {string | HTMLElement} swText 内容 * @param {string} swTitle 标题 * @param {MBFLAGS} uType 标志,使用 MBFLAGS 常量 * @param {string} swColor 背景颜色文本。 * @returns {Promise} */ function messageBoxAsync(swText, swTitle, uType, swColor, pfCallback) { if (typeof Promise === "undefined") { console.error("Promise is not supported in this environment."); MessageBoxForJS(swText, swTitle, uType, swColor, pfCallback); } return new Promise(function(resolve, reject) { try { MessageBoxForJS(swText, swTitle, uType, swColor, function(valueReturn) { if (resolve) resolve(valueReturn); }); } catch (ex) { if (reject) reject(ex); } }); } function MessageBoxButton(swDisplayName, nValueReturn) { this.displayName = swDisplayName; this.value = nValueReturn; } function messageBoxAdvance(swText, swCaption, aCommands, swColor, pfCallback) { var _lpText = swText; var _lpCaption = swCaption; var msgbox = document.createElement("div"); msgbox.classList.add("notice-back"); msgbox.classList.add("win-ui-dark"); var uniqueId = "msgbox_" + new Date().getTime(); msgbox.id = uniqueId; var msgbody = document.createElement("div"); msgbody.classList.add("notice-body"); if (!IsBlackLabel(swColor)) { msgbody.style.backgroundColor = swColor; } msgbox.appendChild(msgbody); var msgcontainter = document.createElement("div"); msgcontainter.style.height = "100%"; msgcontainter.style.width = "100%"; msgcontainter.style.maxHeight = "100%"; msgcontainter.style.minHeight = "0px"; msgcontainter.style.boxSizing = "border-box"; msgbody.appendChild(msgcontainter); var msgcaption = document.createElement("div"); msgcontainter.appendChild(msgcaption); msgcontainter.style.display = "flex"; msgcontainter.style.flexDirection = "column"; var msgcontent = document.createElement("div"); msgcontent.style.flex = "1 1 auto"; msgcontent.style.marginRight = "3px"; msgcontent.style.overflowX = "hidden"; msgcontent.style.overflowY = "auto"; msgcontent.style.minHeight = "0px"; msgcontainter.appendChild(msgcontent); if (_lpCaption instanceof HTMLElement) { msgcaption.appendChild(_lpCaption); msgcaption.classList.add("notice-title"); } else { if (!IsBlackLabel(_lpCaption)) { var msgtitle = document.createElement("h2"); msgtitle.textContent = _lpCaption; msgtitle.classList.add("notice-title"); msgcaption.appendChild(msgtitle); } else { var msgtitle = document.createElement("h2"); msgtitle.textContent = ""; msgtitle.classList.add("notice-title"); msgcaption.appendChild(msgtitle); } } if (_lpText instanceof HTMLElement || _lpText instanceof HTMLDivElement || typeof _lpText !== "string") { try { _lpText.classList.add("notice-text"); msgcontent.appendChild(_lpText); } catch (e) { if (!IsBlackLabel(_lpText)) { var msgtext = document.createElement("p"); msgtext.textContent = _lpText; msgtext.classList.add("notice-text"); if (IsBlackLabel(_lpCaption)) { msgtext.style.marginTop = "0"; } msgcontent.appendChild(msgtext); } else { var msgtext = document.createElement("p"); msgtext.innerText = ""; msgtext.classList.add("notice-text"); if (IsBlackLabel(_lpCaption)) { msgtext.style.marginTop = "0"; } msgcontent.appendChild(msgtext); } } } else { if (!IsBlackLabel(_lpText)) { var msgtext = document.createElement("p"); msgtext.textContent = _lpText; msgtext.classList.add("notice-text"); if (IsBlackLabel(_lpCaption)) { msgtext.style.marginTop = "0"; } msgcontent.appendChild(msgtext); } else { var msgtext = document.createElement("p"); msgtext.innerText = ""; msgtext.classList.add("notice-text"); if (IsBlackLabel(_lpCaption)) { msgtext.style.marginTop = "0"; } msgcontent.appendChild(msgtext); } } var msgctrls = document.createElement("div"); msgctrls.classList.add("notice-controls"); msgcontainter.appendChild(msgctrls); if (aCommands.length <= 0) { aCommands.push(new MessageBoxButton(GetLocaleStringFromResId(800) || "OK", MBRET.IDOK)); } for (var i = 0; i < aCommands.length; i++) { var cmd = aCommands[i]; var btn = document.createElement("button"); btn.textContent = cmd.displayName; btn.setAttribute("data-msgbox-value", cmd.value); Windows.UI.Event.Util.addEvent(btn, "click", function(event) { var btns = this.parentNode.querySelectorAll("button"); var lastbtnstatus = []; for (var j = 0; j < btns.length; j++) { lastbtnstatus.push(btns[j].disabled); btns[j].disabled = true; } try { pfCallback(this.getAttribute("data-msgbox-value")); } catch (e) {} msgbox.style.opacity = 0; setTimeout(function(nodes, laststatus) { for (var k = 0; k < nodes.length; k++) { nodes[k].disabled = laststatus[k]; } document.body.removeChild(msgbox); }, 500, btns, lastbtnstatus); }); msgctrls.appendChild(btn); } document.body.appendChild(msgbox); setTimeout(function() { msgbox.style.opacity = 1; }, 1); return msgbox.id; } function messageBoxAdvanceAsync(swText, swCaption, aCommands, swColor) { if (typeof Promise === "undefined") { console.error("Promise is not supported in this environment."); messageBoxAdvance(swText, swCaption, aCommands, swColor); } return new Promise(function(resolve, reject) { try { messageBoxAdvance(swText, swCaption, aCommands, swColor, function(valueReturn) { if (resolve) resolve(valueReturn); }); } catch (ex) { if (reject) reject(ex); } }); }