wsemi 1.9.3 → 1.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/wsemi.umd.js +5 -5
- package/dist/wsemi.umd.js.map +1 -1
- package/docs/-_class.mjs.html +1 -1
- package/docs/-_const.mjs.html +1 -1
- package/docs/ab2blob.mjs.html +1 -1
- package/docs/ab2u8arr.mjs.html +1 -1
- package/docs/addExcelWorksheetFromData.mjs.html +1 -1
- package/docs/addMonth.mjs.html +1 -1
- package/docs/aes2str.mjs.html +1 -1
- package/docs/alive.mjs.html +1 -1
- package/docs/arr2dt.mjs.html +1 -1
- package/docs/arrAccum.mjs.html +1 -1
- package/docs/arrAdd.mjs.html +1 -1
- package/docs/arrAt.mjs.html +1 -1
- package/docs/arrDiff.mjs.html +1 -1
- package/docs/arrFilterByKeywords.mjs.html +1 -1
- package/docs/arrFilterByNum.mjs.html +1 -1
- package/docs/arrFilterByPnum.mjs.html +1 -1
- package/docs/arrFilterByPnumAndToLog.mjs.html +1 -1
- package/docs/arrFind.mjs.html +1 -1
- package/docs/arrGroupByMaxmin.mjs.html +1 -1
- package/docs/arrHas.mjs.html +1 -1
- package/docs/arrInsert.mjs.html +1 -1
- package/docs/arrLookupByMaxmin.mjs.html +1 -1
- package/docs/arrMax.mjs.html +1 -1
- package/docs/arrMin.mjs.html +1 -1
- package/docs/arrMulti.mjs.html +1 -1
- package/docs/arrNorm.mjs.html +1 -1
- package/docs/arrProduct.mjs.html +1 -1
- package/docs/arrPull.mjs.html +1 -1
- package/docs/arrPullAt.mjs.html +1 -1
- package/docs/arrReduce.mjs.html +1 -1
- package/docs/arrReverse.mjs.html +1 -1
- package/docs/arrSep.mjs.html +1 -1
- package/docs/arrSort.mjs.html +1 -1
- package/docs/asind.mjs.html +1 -1
- package/docs/atan2d.mjs.html +1 -1
- package/docs/atand.mjs.html +1 -1
- package/docs/attstr.mjs.html +1 -1
- package/docs/b642obj.mjs.html +1 -1
- package/docs/b642str.mjs.html +1 -1
- package/docs/b642u16arr.mjs.html +1 -1
- package/docs/b642u8arr.mjs.html +1 -1
- package/docs/binstr.mjs.html +1 -1
- package/docs/blob2ab.mjs.html +1 -1
- package/docs/blob2b64.mjs.html +1 -1
- package/docs/blob2str.mjs.html +1 -1
- package/docs/blob2u8arr.mjs.html +1 -1
- package/docs/blobs2b64s.mjs.html +1 -1
- package/docs/blobs2u8arrs.mjs.html +1 -1
- package/docs/bodyLog.mjs.html +1 -1
- package/docs/browserView.mjs.html +1 -1
- package/docs/browserViewFromBlob.mjs.html +1 -1
- package/docs/browserViewFromText.mjs.html +1 -1
- package/docs/browserViewFromU8arr.mjs.html +1 -1
- package/docs/bs2u8arr.mjs.html +1 -1
- package/docs/bufRead.mjs.html +1 -1
- package/docs/bufReadDbl.mjs.html +1 -1
- package/docs/bufWrite.mjs.html +1 -1
- package/docs/bufWriteDbl.mjs.html +1 -1
- package/docs/cache.mjs.html +1 -1
- package/docs/cacheBd.mjs.html +1 -1
- package/docs/cacheSt.mjs.html +1 -1
- package/docs/cbol.mjs.html +1 -1
- package/docs/cdbl.mjs.html +1 -1
- package/docs/ceil.mjs.html +1 -1
- package/docs/cfilesize.mjs.html +1 -1
- package/docs/cfinancial.mjs.html +1 -1
- package/docs/cint.mjs.html +1 -1
- package/docs/clearXSS.mjs.html +1 -1
- package/docs/clearXSSDyn.mjs.html +1 -1
- package/docs/color.mjs.html +1 -1
- package/docs/composeToTree.mjs.html +1 -1
- package/docs/convertToTree.mjs.html +1 -1
- package/docs/copyStrToClipboard.mjs.html +1 -1
- package/docs/cosd.mjs.html +1 -1
- package/docs/cotd.mjs.html +1 -1
- package/docs/createExcelWorkbook.mjs.html +1 -1
- package/docs/cscd.mjs.html +1 -1
- package/docs/cstr.mjs.html +1 -1
- package/docs/day2cht.mjs.html +1 -1
- package/docs/debounce.mjs.html +1 -1
- package/docs/delay.mjs.html +1 -1
- package/docs/dig.mjs.html +1 -1
- package/docs/digExp.mjs.html +1 -1
- package/docs/domAlert.mjs.html +1 -1
- package/docs/domAppend.mjs.html +1 -1
- package/docs/domCancelEvent.mjs.html +1 -1
- package/docs/domCompareText.mjs.html +1 -1
- package/docs/domConvertToPic.mjs.html +1 -1
- package/docs/domConvertToPicDyn.mjs.html +1 -1
- package/docs/domDetect.mjs.html +571 -304
- package/docs/domDrag.mjs.html +1 -1
- package/docs/domDragBarAndScroll.mjs.html +1 -1
- package/docs/domDragPointer.mjs.html +1 -1
- package/docs/domDragPreview.mjs.html +1 -1
- package/docs/domDropFiles.mjs.html +1 -1
- package/docs/domElementsFromPoint.mjs.html +1 -1
- package/docs/domFadeIn.mjs.html +1 -1
- package/docs/domFadeOut.mjs.html +1 -1
- package/docs/domFind.mjs.html +1 -1
- package/docs/domFinds.mjs.html +1 -1
- package/docs/domGetAttr.mjs.html +1 -1
- package/docs/domGetBoudRect.mjs.html +1 -1
- package/docs/domGetBoudRectRefSelf.mjs.html +1 -1
- package/docs/domGetFileAccept.mjs.html +1 -1
- package/docs/domGetFiles.mjs.html +1 -1
- package/docs/domGetParents.mjs.html +1 -1
- package/docs/domGetPointFromEvent.mjs.html +1 -1
- package/docs/domGetScrollableParent.mjs.html +1 -1
- package/docs/domGetWindowSize.mjs.html +1 -1
- package/docs/domIsClientXYIn.mjs.html +1 -1
- package/docs/domIsFocused.mjs.html +1 -1
- package/docs/domIsStable.mjs.html +1 -1
- package/docs/domIsVisible.mjs.html +1 -1
- package/docs/domPrepend.mjs.html +1 -1
- package/docs/domRemove.mjs.html +1 -1
- package/docs/domRenderMarkdownMind.mjs.html +1 -1
- package/docs/domRenderMarkdownMindDyn.mjs.html +1 -1
- package/docs/domRipple.mjs.html +1 -1
- package/docs/domScrollIntoView.mjs.html +1 -1
- package/docs/domScrollTo.mjs.html +1 -1
- package/docs/domSetAttr.mjs.html +1 -1
- package/docs/domShowImages.mjs.html +1 -1
- package/docs/domShowImagesDyn.mjs.html +1 -1
- package/docs/domShowInputAndGetFiles.mjs.html +1 -1
- package/docs/domShowInputAndGetFilesU8Arrs.mjs.html +1 -1
- package/docs/domShowInputDatatime.mjs.html +1 -1
- package/docs/domTooltip.mjs.html +1 -1
- package/docs/domTriggerEvent.mjs.html +1 -1
- package/docs/domVirtualCreate.mjs.html +1 -1
- package/docs/domVirtualCreateQueue.mjs.html +1 -1
- package/docs/downloadExcelFileFromData.mjs.html +1 -1
- package/docs/downloadExcelFileFromDataDyn.mjs.html +1 -1
- package/docs/downloadFileFromB64.mjs.html +1 -1
- package/docs/downloadFileFromBlob.mjs.html +1 -1
- package/docs/downloadFileFromText.mjs.html +1 -1
- package/docs/downloadFileFromU8Arr.mjs.html +1 -1
- package/docs/dtmapping.mjs.html +1 -1
- package/docs/dtpick.mjs.html +1 -1
- package/docs/estimateTicks.mjs.html +1 -1
- package/docs/evEmit.mjs.html +1 -1
- package/docs/evEmitDelay.mjs.html +1 -1
- package/docs/evem.mjs.html +1 -1
- package/docs/examples/ex-blob2b64.html +1 -1
- package/docs/examples/ex-clearXSS.html +1 -1
- package/docs/examples/ex-clearXSSDyn.html +1 -1
- package/docs/examples/ex-colorConverter.html +1 -1
- package/docs/examples/ex-domCompareText.html +1 -1
- package/docs/examples/ex-domConvertToPic.html +1 -1
- package/docs/examples/ex-domDrag.html +1 -1
- package/docs/examples/ex-domDropFiles.html +1 -1
- package/docs/examples/ex-domIsVisible.html +1 -1
- package/docs/examples/ex-domRenderMarkdownMind.html +1 -1
- package/docs/examples/ex-domRenderMarkdownMindDyn.html +1 -1
- package/docs/examples/ex-domRipple.html +1 -1
- package/docs/examples/ex-domScrollIntoView.html +1 -1
- package/docs/examples/ex-domScrollTo.html +1 -1
- package/docs/examples/ex-domShowImages.html +1 -1
- package/docs/examples/ex-domShowImagesDyn.html +1 -1
- package/docs/examples/ex-domShowInputAndGetFiles.html +1 -1
- package/docs/examples/ex-domTooltip.html +1 -1
- package/docs/examples/ex-getFileHash.html +1 -1
- package/docs/examples/ex-getUserAgent.html +1 -1
- package/docs/examples/ex-getUserAgentDyn.html +1 -1
- package/docs/examples/ex-html2str.html +1 -1
- package/docs/examples/ex-obj2u8arr-u8arr2obj.html +1 -1
- package/docs/examples/ex-openLink.html +1 -1
- package/docs/examples/ex-str2aes-aes2str.html +1 -1
- package/docs/examples/ex-str2b64-b642str.html +1 -1
- package/docs/examples/ex-strFindFuzz.html +1 -1
- package/docs/examples/ex-timeTZ2expire-timeTZ2past.html +1 -1
- package/docs/examples/ex-xlsx.html +1 -1
- package/docs/execCli.mjs.html +1 -1
- package/docs/execCliCore.mjs.html +1 -1
- package/docs/execCliJsonRpc.mjs.html +1 -1
- package/docs/execCliSession.mjs.html +1 -1
- package/docs/execJsCode.mjs.html +1 -1
- package/docs/execProcess.mjs.html +1 -1
- package/docs/execProcessKillPid.mjs.html +1 -1
- package/docs/filepathToTree.mjs.html +1 -1
- package/docs/files2data.mjs.html +1 -1
- package/docs/flattenToConn.mjs.html +1 -1
- package/docs/flattenTree.mjs.html +1 -1
- package/docs/floor.mjs.html +1 -1
- package/docs/fsBuildReadStreamText.mjs.html +1 -1
- package/docs/fsBuildWriteStreamText.mjs.html +1 -1
- package/docs/fsCleanFolder.mjs.html +1 -1
- package/docs/fsCleanFolderCore.mjs.html +1 -1
- package/docs/fsCopyFile.mjs.html +1 -1
- package/docs/fsCopyFileCore.mjs.html +1 -1
- package/docs/fsCopyFolder.mjs.html +1 -1
- package/docs/fsCopyFolderCore.mjs.html +1 -1
- package/docs/fsCreateFile.mjs.html +1 -1
- package/docs/fsCreateFileCore.mjs.html +1 -1
- package/docs/fsCreateFolder.mjs.html +1 -1
- package/docs/fsCreateFolderCore.mjs.html +1 -1
- package/docs/fsDeleteFile.mjs.html +1 -1
- package/docs/fsDeleteFileCore.mjs.html +1 -1
- package/docs/fsDeleteFileSafe.mjs.html +1 -1
- package/docs/fsDeleteFileSafeCore.mjs.html +1 -1
- package/docs/fsDeleteFolder.mjs.html +1 -1
- package/docs/fsDeleteFolderCore.mjs.html +1 -1
- package/docs/fsDeleteFolderSafe.mjs.html +1 -1
- package/docs/fsDeleteFolderSafeCore.mjs.html +1 -1
- package/docs/fsDownloadFile.mjs.html +1 -1
- package/docs/fsDownloadFileCore.mjs.html +1 -1
- package/docs/fsEvem.mjs.html +1 -1
- package/docs/fsExists.mjs.html +1 -1
- package/docs/fsExistsCore.mjs.html +1 -1
- package/docs/fsGetFileBasicHash.mjs.html +1 -1
- package/docs/fsGetFileBasicHashCore.mjs.html +1 -1
- package/docs/fsGetFileHash.mjs.html +1 -1
- package/docs/fsGetFileHashCore.mjs.html +1 -1
- package/docs/fsGetFileXxHash.mjs.html +1 -1
- package/docs/fsGetFileXxHashCore.mjs.html +1 -1
- package/docs/fsGetFilesInFolder.mjs.html +1 -1
- package/docs/fsGetFilesInFolderCore.mjs.html +1 -1
- package/docs/fsGetFilesWithHashInFolder.mjs.html +1 -1
- package/docs/fsGetFilesWithHashInFolderCore.mjs.html +1 -1
- package/docs/fsGetFolderBasicHash.mjs.html +1 -1
- package/docs/fsGetFolderBasicHashCore.mjs.html +1 -1
- package/docs/fsGetFoldersInFolder.mjs.html +1 -1
- package/docs/fsGetFoldersInFolderCore.mjs.html +1 -1
- package/docs/fsIsFile.mjs.html +1 -1
- package/docs/fsIsFileCore.mjs.html +1 -1
- package/docs/fsIsFolder.mjs.html +1 -1
- package/docs/fsIsFolderCore.mjs.html +1 -1
- package/docs/fsMergeFiles.mjs.html +1 -1
- package/docs/fsMergeFilesCore.mjs.html +1 -1
- package/docs/fsReadJson.mjs.html +1 -1
- package/docs/fsReadText.mjs.html +1 -1
- package/docs/fsReadTextCore.mjs.html +1 -1
- package/docs/fsRenameFile.mjs.html +1 -1
- package/docs/fsRenameFileCore.mjs.html +1 -1
- package/docs/fsRenameFolder.mjs.html +1 -1
- package/docs/fsRenameFolderCore.mjs.html +1 -1
- package/docs/fsSrlog.mjs.html +1 -1
- package/docs/fsSyncFolder.mjs.html +1 -1
- package/docs/fsSyncFolderCore.mjs.html +1 -1
- package/docs/fsTask.mjs.html +1 -1
- package/docs/fsTaskCp.mjs.html +1 -1
- package/docs/fsTreeFolder.mjs.html +1 -1
- package/docs/fsTreeFolderCore.mjs.html +1 -1
- package/docs/fsTreeFolderWithHash.mjs.html +1 -1
- package/docs/fsTreeFolderWithHashCore.mjs.html +1 -1
- package/docs/fsWatchFile.mjs.html +1 -1
- package/docs/fsWatchFolder.mjs.html +1 -1
- package/docs/fsWriteJson.mjs.html +1 -1
- package/docs/fsWriteText.mjs.html +1 -1
- package/docs/fsWriteTextCore.mjs.html +1 -1
- package/docs/genGradientColor.mjs.html +1 -1
- package/docs/genID.mjs.html +1 -1
- package/docs/genIDSeq.mjs.html +1 -1
- package/docs/genPm.mjs.html +1 -1
- package/docs/getBufferSize.mjs.html +1 -1
- package/docs/getClearPathName.mjs.html +1 -1
- package/docs/getCsvStrFromData.mjs.html +1 -1
- package/docs/getDataFromExcelFileU8Arr.mjs.html +1 -1
- package/docs/getDataFromExcelFileU8ArrDyn.mjs.html +1 -1
- package/docs/getEnv.mjs.html +1 -1
- package/docs/getErrorMessage.mjs.html +1 -1
- package/docs/getExcelU8ArrFromData.mjs.html +1 -1
- package/docs/getExcelU8ArrFromWorkbook.mjs.html +1 -1
- package/docs/getExcelWorkbookFromData.mjs.html +1 -1
- package/docs/getExcelWorkbookFromWorksheet.mjs.html +1 -1
- package/docs/getExcelWorksheetFromData.mjs.html +1 -1
- package/docs/getFileAccept.mjs.html +1 -1
- package/docs/getFileBasicHash.mjs.html +1 -1
- package/docs/getFileHash.mjs.html +1 -1
- package/docs/getFileName.mjs.html +1 -1
- package/docs/getFileNameExt.mjs.html +1 -1
- package/docs/getFileTrueName.mjs.html +1 -1
- package/docs/getFileType.mjs.html +1 -1
- package/docs/getFileXxHash.mjs.html +1 -1
- package/docs/getGlobal.mjs.html +1 -1
- package/docs/getObjSize.mjs.html +1 -1
- package/docs/getPathParent.mjs.html +1 -1
- package/docs/getTimeBetween.mjs.html +1 -1
- package/docs/getTimeFromUnit.mjs.html +1 -1
- package/docs/getTimeHp.mjs.html +1 -1
- package/docs/getTimeObject.mjs.html +1 -1
- package/docs/getTimeRange.mjs.html +1 -1
- package/docs/getUserAgent.mjs.html +1 -1
- package/docs/getUserAgentDyn.mjs.html +1 -1
- package/docs/getltdtkeys.mjs.html +1 -1
- package/docs/global.html +1 -1
- package/docs/haskey.mjs.html +1 -1
- package/docs/html2str.mjs.html +1 -1
- package/docs/htmlDecode.mjs.html +1 -1
- package/docs/htmlEncode.mjs.html +1 -1
- package/docs/importResources.mjs.html +1 -1
- package/docs/index.html +1 -1
- package/docs/interp1.mjs.html +1 -1
- package/docs/isDate.mjs.html +1 -1
- package/docs/isDev.mjs.html +1 -1
- package/docs/isEle.mjs.html +1 -1
- package/docs/isEleExistByID.mjs.html +1 -1
- package/docs/isEmail.mjs.html +1 -1
- package/docs/isErr.mjs.html +1 -1
- package/docs/isIE.mjs.html +1 -1
- package/docs/isNarrow.mjs.html +1 -1
- package/docs/isStrHasCapital.mjs.html +1 -1
- package/docs/isStrHasLetter.mjs.html +1 -1
- package/docs/isStrHasLowerCase.mjs.html +1 -1
- package/docs/isStrHasNumber.mjs.html +1 -1
- package/docs/isStrHasSpace.mjs.html +1 -1
- package/docs/isStrHasSymbol.mjs.html +1 -1
- package/docs/isUserIdentify.mjs.html +1 -1
- package/docs/isUserName.mjs.html +1 -1
- package/docs/isUserPw.mjs.html +1 -1
- package/docs/isWindow.mjs.html +1 -1
- package/docs/isab.mjs.html +1 -1
- package/docs/isarr.mjs.html +1 -1
- package/docs/isarr0.mjs.html +1 -1
- package/docs/isarr1.mjs.html +1 -1
- package/docs/isbigint.mjs.html +1 -1
- package/docs/isblob.mjs.html +1 -1
- package/docs/isbol.mjs.html +1 -1
- package/docs/isday.mjs.html +1 -1
- package/docs/isearr.mjs.html +1 -1
- package/docs/iseobj.mjs.html +1 -1
- package/docs/iser.mjs.html +1 -1
- package/docs/isernot.mjs.html +1 -1
- package/docs/isestr.mjs.html +1 -1
- package/docs/isfile.mjs.html +1 -1
- package/docs/isfun.mjs.html +1 -1
- package/docs/isint.mjs.html +1 -1
- package/docs/ismonth.mjs.html +1 -1
- package/docs/isn0int.mjs.html +1 -1
- package/docs/isn0num.mjs.html +1 -1
- package/docs/isnan.mjs.html +1 -1
- package/docs/isnbr.mjs.html +1 -1
- package/docs/isnint.mjs.html +1 -1
- package/docs/isnnum.mjs.html +1 -1
- package/docs/isnull.mjs.html +1 -1
- package/docs/isnum.mjs.html +1 -1
- package/docs/isobj.mjs.html +1 -1
- package/docs/isobj0.mjs.html +1 -1
- package/docs/isp0int.mjs.html +1 -1
- package/docs/isp0num.mjs.html +1 -1
- package/docs/ispint.mjs.html +1 -1
- package/docs/ispm.mjs.html +1 -1
- package/docs/ispnum.mjs.html +1 -1
- package/docs/isstr.mjs.html +1 -1
- package/docs/isstr0.mjs.html +1 -1
- package/docs/istime.mjs.html +1 -1
- package/docs/istimeTZ.mjs.html +1 -1
- package/docs/istimems.mjs.html +1 -1
- package/docs/istimemsTZ.mjs.html +1 -1
- package/docs/isu16arr.mjs.html +1 -1
- package/docs/isu8arr.mjs.html +1 -1
- package/docs/isundefined.mjs.html +1 -1
- package/docs/j2o.mjs.html +1 -1
- package/docs/judge.mjs.html +1 -1
- package/docs/keysmat2ltdt.mjs.html +1 -1
- package/docs/ltdt2vrtsable.mjs.html +1 -1
- package/docs/ltdtDiff.mjs.html +1 -1
- package/docs/ltdtDiffByKey.mjs.html +1 -1
- package/docs/ltdtkeys2mat.mjs.html +1 -1
- package/docs/ltdtkeysheads2mat.mjs.html +1 -1
- package/docs/ltdtmapping.mjs.html +1 -1
- package/docs/ltdtmerge.mjs.html +1 -1
- package/docs/ltdtpick.mjs.html +1 -1
- package/docs/ltdtpull.mjs.html +1 -1
- package/docs/mat2ltdt.mjs.html +1 -1
- package/docs/matConcat.mjs.html +1 -1
- package/docs/matDiff.mjs.html +1 -1
- package/docs/matat.mjs.html +1 -1
- package/docs/now2str.mjs.html +1 -1
- package/docs/now2strp.mjs.html +1 -1
- package/docs/nowDay2str.mjs.html +1 -1
- package/docs/nowms2str.mjs.html +1 -1
- package/docs/nowms2strp.mjs.html +1 -1
- package/docs/o2j.mjs.html +1 -1
- package/docs/obj2b64.mjs.html +1 -1
- package/docs/obj2pb64.mjs.html +1 -1
- package/docs/obj2str.mjs.html +1 -1
- package/docs/obj2stru8arr.mjs.html +1 -1
- package/docs/obj2u8arr.mjs.html +1 -1
- package/docs/objSortBy.mjs.html +1 -1
- package/docs/objSortByKeys.mjs.html +1 -1
- package/docs/oo.mjs.html +1 -1
- package/docs/openLink.mjs.html +1 -1
- package/docs/pb642obj.mjs.html +1 -1
- package/docs/pmChain.mjs.html +1 -1
- package/docs/pmConvertResolve.mjs.html +1 -1
- package/docs/pmDebounce.mjs.html +1 -1
- package/docs/pmHook.mjs.html +1 -1
- package/docs/pmHookReject.mjs.html +1 -1
- package/docs/pmIni.mjs.html +1 -1
- package/docs/pmInvResolve.mjs.html +1 -1
- package/docs/pmKeyMutex.mjs.html +1 -1
- package/docs/pmMap.mjs.html +1 -1
- package/docs/pmQueue.mjs.html +1 -1
- package/docs/pmSeries.mjs.html +1 -1
- package/docs/pmThrottle.mjs.html +1 -1
- package/docs/pmTimeout.mjs.html +1 -1
- package/docs/preciseNum.mjs.html +1 -1
- package/docs/pseudoRandom.mjs.html +1 -1
- package/docs/pseudoRandomIntRange.mjs.html +1 -1
- package/docs/pseudoRandomIntsNdpRange.mjs.html +1 -1
- package/docs/pseudoRandomIntsRange.mjs.html +1 -1
- package/docs/pseudoRandomRange.mjs.html +1 -1
- package/docs/pseudoRandomsRange.mjs.html +1 -1
- package/docs/queue.mjs.html +1 -1
- package/docs/random.mjs.html +1 -1
- package/docs/randomIntRange.mjs.html +1 -1
- package/docs/randomIntsNdpRange.mjs.html +1 -1
- package/docs/randomIntsRange.mjs.html +1 -1
- package/docs/randomRange.mjs.html +1 -1
- package/docs/randomsRange.mjs.html +1 -1
- package/docs/rang.mjs.html +1 -1
- package/docs/rep.mjs.html +1 -1
- package/docs/repObj.mjs.html +1 -1
- package/docs/replace.mjs.html +1 -1
- package/docs/replaceObj.mjs.html +1 -1
- package/docs/replacePlus.mjs.html +1 -1
- package/docs/round.mjs.html +1 -1
- package/docs/secd.mjs.html +1 -1
- package/docs/sep.mjs.html +1 -1
- package/docs/sepInt.mjs.html +1 -1
- package/docs/setIntervalHp.mjs.html +1 -1
- package/docs/setTimeoutHp.mjs.html +1 -1
- package/docs/sind.mjs.html +1 -1
- package/docs/split.mjs.html +1 -1
- package/docs/str2aes.mjs.html +1 -1
- package/docs/str2b64.mjs.html +1 -1
- package/docs/str2hint.mjs.html +1 -1
- package/docs/str2md5.mjs.html +1 -1
- package/docs/str2obj.mjs.html +1 -1
- package/docs/str2sha.mjs.html +1 -1
- package/docs/str2sha512.mjs.html +1 -1
- package/docs/str2u8arr.mjs.html +1 -1
- package/docs/strCompare.mjs.html +1 -1
- package/docs/strCompareForVersion.mjs.html +1 -1
- package/docs/strDiff.mjs.html +1 -1
- package/docs/strDiffToHtml.mjs.html +1 -1
- package/docs/strFindFuzz.mjs.html +1 -1
- package/docs/strFindSimilar.mjs.html +1 -1
- package/docs/strTruncate.mjs.html +1 -1
- package/docs/strdelleft.mjs.html +1 -1
- package/docs/strdelright.mjs.html +1 -1
- package/docs/strleft.mjs.html +1 -1
- package/docs/strmid.mjs.html +1 -1
- package/docs/strright.mjs.html +1 -1
- package/docs/stru8arr2obj.mjs.html +1 -1
- package/docs/tand.mjs.html +1 -1
- package/docs/time2day.mjs.html +1 -1
- package/docs/time2hour.mjs.html +1 -1
- package/docs/time2min.mjs.html +1 -1
- package/docs/timeTZ2day.mjs.html +1 -1
- package/docs/timeTZ2expire.mjs.html +1 -1
- package/docs/timeTZ2hour.mjs.html +1 -1
- package/docs/timeTZ2min.mjs.html +1 -1
- package/docs/timeTZ2past.mjs.html +1 -1
- package/docs/timems2day.mjs.html +1 -1
- package/docs/timems2hour.mjs.html +1 -1
- package/docs/timems2min.mjs.html +1 -1
- package/docs/timems2time.mjs.html +1 -1
- package/docs/timemsTZ2day.mjs.html +1 -1
- package/docs/timemsTZ2expire.mjs.html +1 -1
- package/docs/timemsTZ2hour.mjs.html +1 -1
- package/docs/timemsTZ2min.mjs.html +1 -1
- package/docs/timemsTZ2past.mjs.html +1 -1
- package/docs/timemsTZ2time.mjs.html +1 -1
- package/docs/treeObj.mjs.html +1 -1
- package/docs/treeToFilepath.mjs.html +1 -1
- package/docs/trim.mjs.html +1 -1
- package/docs/u16arr2b64.mjs.html +1 -1
- package/docs/u16arr2u8arr.mjs.html +1 -1
- package/docs/u8arr2ab.mjs.html +1 -1
- package/docs/u8arr2b64.mjs.html +1 -1
- package/docs/u8arr2blob.mjs.html +1 -1
- package/docs/u8arr2bs.mjs.html +1 -1
- package/docs/u8arr2obj.mjs.html +1 -1
- package/docs/u8arr2str.mjs.html +1 -1
- package/docs/u8arr2u16arr.mjs.html +1 -1
- package/docs/urlParse.mjs.html +1 -1
- package/docs/verifyValue.mjs.html +1 -1
- package/docs/waitFun.mjs.html +1 -1
- package/docs/wsemi.html +218 -10
- package/package.json +1 -1
- package/src/domDetect.mjs +570 -303
- package/test/domDetect.test.mjs +684 -11
- package/toolfp/dist/wsemip.umd.js +1 -1
- package/toolparfor/dist/wpf.umd.js +1 -1
- package/toolparfor/dist/wpf_pmSeries.umd.js +1 -1
package/docs/domDetect.mjs.html
CHANGED
|
@@ -45,309 +45,576 @@
|
|
|
45
45
|
|
|
46
46
|
<section>
|
|
47
47
|
<article>
|
|
48
|
-
<pre class="prettyprint source linenums"><code>import get from 'lodash-es/get.js'
|
|
49
|
-
import
|
|
50
|
-
import
|
|
51
|
-
import evem from './evem.mjs'
|
|
52
|
-
import isfun from './isfun.mjs'
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
//
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
|
|
79
|
-
// //
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
//
|
|
93
|
-
//
|
|
94
|
-
//
|
|
95
|
-
//
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
//
|
|
99
|
-
|
|
100
|
-
//
|
|
101
|
-
//
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
//
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
//
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
//
|
|
111
|
-
//
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
//
|
|
115
|
-
|
|
116
|
-
//
|
|
117
|
-
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
//
|
|
123
|
-
//
|
|
124
|
-
|
|
125
|
-
//
|
|
126
|
-
|
|
127
|
-
//
|
|
128
|
-
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
//
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
|
|
140
|
-
//
|
|
141
|
-
//
|
|
142
|
-
|
|
143
|
-
//
|
|
144
|
-
//
|
|
145
|
-
//
|
|
146
|
-
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
|
|
150
|
-
//
|
|
151
|
-
//
|
|
152
|
-
//
|
|
153
|
-
|
|
154
|
-
//
|
|
155
|
-
//
|
|
156
|
-
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
//
|
|
160
|
-
|
|
161
|
-
//
|
|
162
|
-
//
|
|
163
|
-
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
//
|
|
169
|
-
//
|
|
170
|
-
//
|
|
171
|
-
//
|
|
172
|
-
//
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
//
|
|
176
|
-
//
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
48
|
+
<pre class="prettyprint source linenums"><code>import get from 'lodash-es/get.js'
|
|
49
|
+
import ispint from './ispint.mjs'
|
|
50
|
+
import isp0int from './isp0int.mjs'
|
|
51
|
+
import evem from './evem.mjs'
|
|
52
|
+
import isfun from './isfun.mjs'
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
//2020年曾以IntersectionObserver與ResizeObserver實作(即下方註解舊碼), 因下列實作缺陷致WTextSelect下拉選單不穩而改為輪詢:
|
|
56
|
+
//1.元素尺寸為0(隱藏或移出DOM)時仍發出resize, 使用端讀到高度0而算錯版面
|
|
57
|
+
//2.clear未防空值, 元素尚未取得即clear時拋錯, 且已建立之觀察器與已排定之事件未解除
|
|
58
|
+
//3.觀察器只綁首次取得之元素, 元素被換成新節點後即失去偵測
|
|
59
|
+
//現以ResizeObserver偵測尺寸, 並以共用MutationObserver於[元素取不到、不在頁面中或尺寸為0]時重新取得元素, 逐一對應上述缺陷; 無ResizeObserver或MutationObserver時退回輪詢
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
// function domDetect(f, opt = {}) {
|
|
63
|
+
|
|
64
|
+
//使用IntersectionObserver與ResizeObserver時, 當顯隱頻繁導致元素尚未出現需等待與過快清除時, 會導致WTextSelect下拉選單無法穩定出現內容問題
|
|
65
|
+
|
|
66
|
+
// let ele = null
|
|
67
|
+
// let obInts = null
|
|
68
|
+
// let obRes = null
|
|
69
|
+
|
|
70
|
+
// //tolerancePixel
|
|
71
|
+
// let tolerancePixel = get(opt, 'tolerancePixel', null)
|
|
72
|
+
// if (!ispint(tolerancePixel)) {
|
|
73
|
+
// tolerancePixel = 1
|
|
74
|
+
// }
|
|
75
|
+
|
|
76
|
+
// //ev
|
|
77
|
+
// let ev = evem()
|
|
78
|
+
|
|
79
|
+
// //timer, sold
|
|
80
|
+
// let timer
|
|
81
|
+
// let sold = {
|
|
82
|
+
// offsetWidth: 0,
|
|
83
|
+
// offsetHeight: 0,
|
|
84
|
+
// }
|
|
85
|
+
|
|
86
|
+
// //check
|
|
87
|
+
// if (!isfun(f)) {
|
|
88
|
+
// console.log('invalid f', f)
|
|
89
|
+
// return ev
|
|
90
|
+
// }
|
|
91
|
+
|
|
92
|
+
// //check
|
|
93
|
+
// if (!window.IntersectionObserver) {
|
|
94
|
+
// console.log('invalid IntersectionObserver')
|
|
95
|
+
// return ev
|
|
96
|
+
// }
|
|
97
|
+
|
|
98
|
+
// //check
|
|
99
|
+
// if (!window.ResizeObserver) {
|
|
100
|
+
// console.log('invalid ResizeObserver')
|
|
101
|
+
// return ev
|
|
102
|
+
// }
|
|
103
|
+
|
|
104
|
+
// //setInterval
|
|
105
|
+
// timer = setInterval(() => {
|
|
106
|
+
|
|
107
|
+
// //execute
|
|
108
|
+
// let eleTemp = f()
|
|
109
|
+
|
|
110
|
+
// //check
|
|
111
|
+
// if (eleTemp) {
|
|
112
|
+
|
|
113
|
+
// //save
|
|
114
|
+
// ele = eleTemp
|
|
115
|
+
|
|
116
|
+
// //obInts
|
|
117
|
+
// if (!obInts) {
|
|
118
|
+
// obInts = new window.IntersectionObserver((entries) => {
|
|
119
|
+
// let entry = entries[0]
|
|
120
|
+
|
|
121
|
+
// setTimeout(() => { //emit觸發事件為同步, 用setTimeout脫勾
|
|
122
|
+
// ev.emit('display', { mode: entry.isIntersecting ? 'show' : 'hide', ele })
|
|
123
|
+
// }, 1)
|
|
124
|
+
|
|
125
|
+
// })
|
|
126
|
+
// obInts.observe(ele)
|
|
127
|
+
// }
|
|
128
|
+
|
|
129
|
+
// //obRes
|
|
130
|
+
// if (!obRes) {
|
|
131
|
+
// obRes = new window.ResizeObserver((entries) => {
|
|
132
|
+
// // let entry = entries[0]
|
|
133
|
+
|
|
134
|
+
// //new size
|
|
135
|
+
// let snew = {
|
|
136
|
+
// offsetWidth: ele.offsetWidth,
|
|
137
|
+
// offsetHeight: ele.offsetHeight,
|
|
138
|
+
// }
|
|
139
|
+
|
|
140
|
+
// //save sold
|
|
141
|
+
// let soldt = { ...sold }
|
|
142
|
+
|
|
143
|
+
// //tolerancePixel
|
|
144
|
+
// let bw = Math.abs(sold.offsetWidth - snew.offsetWidth) > tolerancePixel
|
|
145
|
+
// let bh = Math.abs(sold.offsetHeight - snew.offsetHeight) > tolerancePixel
|
|
146
|
+
|
|
147
|
+
// if (bw || bh) {
|
|
148
|
+
// setTimeout(() => { //emit觸發事件為同步, 用setTimeout脫勾
|
|
149
|
+
// ev.emit('resize', { sold: soldt, snew, ele })
|
|
150
|
+
// ev.emit('resizeWithWindow', { sold: soldt, snew, ele, from: 'dom' })
|
|
151
|
+
// }, 1)
|
|
152
|
+
// }
|
|
153
|
+
|
|
154
|
+
// //save
|
|
155
|
+
// sold = snew
|
|
156
|
+
|
|
157
|
+
// })
|
|
158
|
+
// obRes.observe(ele)
|
|
159
|
+
// }
|
|
160
|
+
|
|
161
|
+
// //clearInterval
|
|
162
|
+
// clearInterval(timer)
|
|
163
|
+
|
|
164
|
+
// }
|
|
165
|
+
|
|
166
|
+
// }, 10)
|
|
167
|
+
|
|
168
|
+
// //fWindowResize
|
|
169
|
+
// let fWindowResize = (e) => {
|
|
170
|
+
// ev.emit('resizeWithWindow', { snew: sold, from: 'window' })
|
|
171
|
+
// }
|
|
172
|
+
// window.addEventListener('resize', fWindowResize)
|
|
173
|
+
|
|
174
|
+
// //clear
|
|
175
|
+
// ev.clear = () => {
|
|
176
|
+
// obInts.unobserve(ele)
|
|
177
|
+
// obRes.unobserve(ele)
|
|
178
|
+
// clearInterval(timer) //若一直沒偵測到元素故也需要強制中止timer
|
|
179
|
+
// window.removeEventListener('resize', fWindowResize)
|
|
180
|
+
// }
|
|
181
|
+
|
|
182
|
+
// return ev
|
|
183
|
+
// }
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
//waiting, 等待重新取得元素之偵測器; mo, 共用之MutationObserver, 僅於有偵測器等待時啟用
|
|
187
|
+
let waiting = new Set()
|
|
188
|
+
let mo = null
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
function waitAdd(fn) {
|
|
192
|
+
waiting.add(fn)
|
|
193
|
+
if (!mo) {
|
|
194
|
+
mo = new window.MutationObserver(() => {
|
|
195
|
+
for (let g of Array.from(waiting)) {
|
|
196
|
+
g()
|
|
197
|
+
}
|
|
198
|
+
})
|
|
199
|
+
mo.observe(document.documentElement, { childList: true, subtree: true })
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
function waitRemove(fn) {
|
|
205
|
+
waiting.delete(fn)
|
|
206
|
+
if (waiting.size === 0 && mo) {
|
|
207
|
+
mo.disconnect()
|
|
208
|
+
mo = null
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
function getTimeInterval(opt) {
|
|
214
|
+
let timeInterval = get(opt, 'timeInterval', null)
|
|
215
|
+
if (!ispint(timeInterval)) {
|
|
216
|
+
timeInterval = 20
|
|
217
|
+
}
|
|
218
|
+
return timeInterval
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
function getTolerancePixel(opt) {
|
|
223
|
+
let tolerancePixel = get(opt, 'tolerancePixel', null)
|
|
224
|
+
if (!isp0int(tolerancePixel)) { //可給0, 表示任何變化皆發出
|
|
225
|
+
tolerancePixel = 1
|
|
226
|
+
}
|
|
227
|
+
return tolerancePixel
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
//getEle, f()拋錯或回傳非元素時視為取不到, 不中斷偵測
|
|
232
|
+
function getEle(f) {
|
|
233
|
+
let p = null
|
|
234
|
+
try {
|
|
235
|
+
p = f()
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
p = null
|
|
239
|
+
}
|
|
240
|
+
return (p && p.nodeType === 1) ? p : null
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
function sizeZero() {
|
|
245
|
+
return {
|
|
246
|
+
offsetWidth: 0,
|
|
247
|
+
offsetHeight: 0,
|
|
248
|
+
clientWidth: 0,
|
|
249
|
+
clientHeight: 0,
|
|
250
|
+
windowWidth: 0,
|
|
251
|
+
windowHeight: 0,
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
function measure(p) {
|
|
257
|
+
return {
|
|
258
|
+
offsetWidth: p.offsetWidth,
|
|
259
|
+
offsetHeight: p.offsetHeight,
|
|
260
|
+
clientWidth: p.clientWidth,
|
|
261
|
+
clientHeight: p.clientHeight,
|
|
262
|
+
windowWidth: window.innerWidth,
|
|
263
|
+
windowHeight: window.innerHeight,
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
//createCore, 輪詢與ResizeObserver兩種模式共用之比較、發出、視窗事件與清除, 使兩者之規則只寫一處
|
|
269
|
+
// 比較基準sb為上次發出事件時之尺寸, 差值超過容許誤差才更新; 若每次量測皆更新基準, 緩慢之連續小變化(如逐px拖曳或縮放視窗)永遠不會超過容許誤差, 累積再大也不發出
|
|
270
|
+
// 尺寸為0時差值必超過容許誤差而使基準歸0, 故由隱藏恢復顯示時必發出
|
|
271
|
+
function createCore(ev, opt) {
|
|
272
|
+
|
|
273
|
+
//tolerancePixel
|
|
274
|
+
let tolerancePixel = getTolerancePixel(opt)
|
|
275
|
+
|
|
276
|
+
//sync, 於ResizeObserver回呼內同步發出事件(繪製前), 供須於同一幀更新版面之使用端(例如圖表重繪); 預設以setTimeout脫勾
|
|
277
|
+
let sync = get(opt, 'sync', false) === true
|
|
278
|
+
|
|
279
|
+
//cleared, st, sd, sb, smode, timers
|
|
280
|
+
let cleared = false
|
|
281
|
+
let st = sizeZero() //前次量測
|
|
282
|
+
let sd = sizeZero() //最新量測
|
|
283
|
+
let sb = sizeZero() //比較基準, 上次發出事件時之尺寸
|
|
284
|
+
let smode = {
|
|
285
|
+
width: '',
|
|
286
|
+
height: '',
|
|
287
|
+
}
|
|
288
|
+
let timers = new Set()
|
|
289
|
+
|
|
290
|
+
//emit
|
|
291
|
+
let emit = (sold, snew, sm, p) => {
|
|
292
|
+
|
|
293
|
+
//cleared, clear後不再發出已排定之事件
|
|
294
|
+
if (cleared) {
|
|
295
|
+
return
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
//detect resize, 尺寸為0(隱藏或移出DOM)不發出
|
|
299
|
+
if (snew.offsetWidth > 0 && snew.offsetHeight > 0) {
|
|
300
|
+
ev.emit('resize', {
|
|
301
|
+
sold,
|
|
302
|
+
snew,
|
|
303
|
+
smode: sm,
|
|
304
|
+
ele: p,
|
|
305
|
+
})
|
|
306
|
+
|
|
307
|
+
//cleared, resize之監聽器內可能呼叫clear
|
|
308
|
+
if (cleared) {
|
|
309
|
+
return
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
ev.emit('resizeWithWindow', {
|
|
313
|
+
sold,
|
|
314
|
+
snew,
|
|
315
|
+
smode: sm,
|
|
316
|
+
ele: p,
|
|
317
|
+
from: 'dom',
|
|
318
|
+
})
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
//check, 量測並與比較基準比較
|
|
324
|
+
let check = (p, allowSync) => {
|
|
325
|
+
if (cleared || !p) {
|
|
326
|
+
return
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
//new size
|
|
330
|
+
let snew = measure(p)
|
|
331
|
+
|
|
332
|
+
//dw, dh
|
|
333
|
+
let dw = sb.offsetWidth - snew.offsetWidth
|
|
334
|
+
let dh = sb.offsetHeight - snew.offsetHeight
|
|
335
|
+
|
|
336
|
+
//bw, bh
|
|
337
|
+
let bw = Math.abs(dw) > tolerancePixel
|
|
338
|
+
let bh = Math.abs(dh) > tolerancePixel
|
|
339
|
+
|
|
340
|
+
//smode
|
|
341
|
+
smode = {
|
|
342
|
+
width: dw > 0 ? 'smaller' : (dw < 0 ? 'larger' : ''),
|
|
343
|
+
height: dh > 0 ? 'smaller' : (dh < 0 ? 'larger' : ''),
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
//save
|
|
347
|
+
st = sd
|
|
348
|
+
sd = snew
|
|
349
|
+
|
|
350
|
+
//check
|
|
351
|
+
if (!bw && !bh) {
|
|
352
|
+
return
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
//sold, sb
|
|
356
|
+
let sold = sb
|
|
357
|
+
sb = snew
|
|
358
|
+
let sm = { ...smode }
|
|
359
|
+
|
|
360
|
+
//emit
|
|
361
|
+
if (allowSync && sync) {
|
|
362
|
+
emit(sold, snew, sm, p)
|
|
363
|
+
return
|
|
364
|
+
}
|
|
365
|
+
let t = setTimeout(() => { //emit觸發事件為同步, 用setTimeout脫勾
|
|
366
|
+
timers.delete(t)
|
|
367
|
+
emit(sold, snew, sm, p)
|
|
368
|
+
}, 1)
|
|
369
|
+
timers.add(t)
|
|
370
|
+
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
//fWindowResize, 視窗尺寸取當下值, 否則元素尺寸未變時會一直帶著上次量測時之視窗尺寸
|
|
374
|
+
let fWindowResize = (e) => {
|
|
375
|
+
if (cleared) {
|
|
376
|
+
return
|
|
377
|
+
}
|
|
378
|
+
sd = {
|
|
379
|
+
...sd,
|
|
380
|
+
windowWidth: window.innerWidth,
|
|
381
|
+
windowHeight: window.innerHeight,
|
|
382
|
+
}
|
|
383
|
+
ev.emit('resizeWithWindow', {
|
|
384
|
+
sold: st,
|
|
385
|
+
snew: sd,
|
|
386
|
+
smode,
|
|
387
|
+
from: 'window',
|
|
388
|
+
})
|
|
389
|
+
}
|
|
390
|
+
window.addEventListener('resize', fWindowResize)
|
|
391
|
+
|
|
392
|
+
//clear
|
|
393
|
+
let clear = () => {
|
|
394
|
+
cleared = true
|
|
395
|
+
for (let t of timers) {
|
|
396
|
+
clearTimeout(t)
|
|
397
|
+
}
|
|
398
|
+
timers.clear()
|
|
399
|
+
window.removeEventListener('resize', fWindowResize)
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
return {
|
|
403
|
+
check,
|
|
404
|
+
clear,
|
|
405
|
+
isCleared: () => cleared,
|
|
406
|
+
isVisible: () => sd.offsetWidth > 0 && sd.offsetHeight > 0,
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
function domDetectByPolling(f, opt = {}) {
|
|
412
|
+
|
|
413
|
+
//check
|
|
414
|
+
if (!isfun(f)) {
|
|
415
|
+
console.log('invalid f', f)
|
|
416
|
+
return null
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
//ev, core
|
|
420
|
+
let ev = evem()
|
|
421
|
+
let core = createCore(ev, opt)
|
|
422
|
+
|
|
423
|
+
//setInterval
|
|
424
|
+
let timer = setInterval(() => {
|
|
425
|
+
let p = getEle(f)
|
|
426
|
+
if (p) {
|
|
427
|
+
core.check(p, false)
|
|
428
|
+
}
|
|
429
|
+
}, getTimeInterval(opt))
|
|
430
|
+
|
|
431
|
+
//clear
|
|
432
|
+
ev.clear = () => {
|
|
433
|
+
clearInterval(timer)
|
|
434
|
+
core.clear()
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
return ev
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
function domDetectByObserver(f, opt = {}) {
|
|
442
|
+
|
|
443
|
+
//check
|
|
444
|
+
if (!isfun(f)) {
|
|
445
|
+
console.log('invalid f', f)
|
|
446
|
+
return null
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
//watchIdentity, 元素可見時亦持續於DOM變動時重新取得元素, 供f()可能於舊元素仍可見時改回傳他元素之使用端
|
|
450
|
+
let watchIdentity = get(opt, 'watchIdentity', false) === true
|
|
451
|
+
|
|
452
|
+
//timeInterval, 行內元素改以定期量測時使用
|
|
453
|
+
let timeInterval = getTimeInterval(opt)
|
|
454
|
+
|
|
455
|
+
//ev, core
|
|
456
|
+
let ev = evem()
|
|
457
|
+
let core = createCore(ev, opt)
|
|
458
|
+
|
|
459
|
+
//ele, timerInline, roBorder, roContent
|
|
460
|
+
let ele = null
|
|
461
|
+
let timerInline = null
|
|
462
|
+
let roBorder = null
|
|
463
|
+
let roContent = null
|
|
464
|
+
|
|
465
|
+
//syncInline, 非替換之行內元素ResizeObserver不回報(規範明定), 取得之元素為display:inline時改以定期量測, 不為inline時停止
|
|
466
|
+
let syncInline = () => {
|
|
467
|
+
let inline = false
|
|
468
|
+
if (ele) {
|
|
469
|
+
try {
|
|
470
|
+
inline = window.getComputedStyle(ele).display === 'inline'
|
|
471
|
+
}
|
|
472
|
+
catch (err) {
|
|
473
|
+
inline = false
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
if (inline && timerInline === null) {
|
|
477
|
+
timerInline = setInterval(onResize, timeInterval)
|
|
478
|
+
}
|
|
479
|
+
else if (!inline && timerInline !== null) {
|
|
480
|
+
clearInterval(timerInline)
|
|
481
|
+
timerInline = null
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
//retarget, 重新取得元素: 換成新節點時改觀察新節點, 新節點之首次回報由check比較
|
|
486
|
+
// 同時觀察border-box與content-box: 比較用之offsetWidth即border-box, 只觀察content-box會漏掉只改padding或border之變化; content-box則使捲軸出現或消失時clientWidth保持最新
|
|
487
|
+
let retarget = () => {
|
|
488
|
+
if (core.isCleared()) {
|
|
489
|
+
return
|
|
490
|
+
}
|
|
491
|
+
let p = getEle(f)
|
|
492
|
+
if (p === ele) {
|
|
493
|
+
return
|
|
494
|
+
}
|
|
495
|
+
if (ele) {
|
|
496
|
+
roBorder.unobserve(ele)
|
|
497
|
+
roContent.unobserve(ele)
|
|
498
|
+
}
|
|
499
|
+
ele = p
|
|
500
|
+
if (ele) {
|
|
501
|
+
roBorder.observe(ele, { box: 'border-box' })
|
|
502
|
+
roContent.observe(ele)
|
|
503
|
+
}
|
|
504
|
+
syncInline()
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
//updateWaiting, 元素取不到、不在頁面中或尺寸為0時登記等待DOM變動:
|
|
508
|
+
// 元素消失(移除或換新節點)時ResizeObserver無從得知新節點, 且已隱藏(尺寸0)之元素再被移除時尺寸0→0不會回報, 故尺寸為0時亦須等待
|
|
509
|
+
let updateWaiting = () => {
|
|
510
|
+
if (core.isCleared()) {
|
|
511
|
+
return
|
|
512
|
+
}
|
|
513
|
+
let visible = ele && ele.isConnected && core.isVisible()
|
|
514
|
+
if (visible && !watchIdentity) {
|
|
515
|
+
waitRemove(onDomChange)
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
waitAdd(onDomChange)
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
//onDomChange, 僅重新取得元素不量測, 避免強制重排版; 換新節點後由ResizeObserver之首次回報觸發check
|
|
523
|
+
let onDomChange = () => {
|
|
524
|
+
retarget()
|
|
525
|
+
updateWaiting()
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
//onResize
|
|
529
|
+
let onResize = () => {
|
|
530
|
+
retarget()
|
|
531
|
+
try {
|
|
532
|
+
core.check(ele, true)
|
|
533
|
+
}
|
|
534
|
+
finally {
|
|
535
|
+
//sync模式下監聽器拋錯時仍須更新行內與等待狀態
|
|
536
|
+
syncInline()
|
|
537
|
+
updateWaiting()
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
//roBorder, roContent
|
|
542
|
+
roBorder = new window.ResizeObserver(onResize)
|
|
543
|
+
roContent = new window.ResizeObserver(onResize)
|
|
544
|
+
|
|
545
|
+
//initialize
|
|
546
|
+
retarget()
|
|
547
|
+
updateWaiting()
|
|
548
|
+
|
|
549
|
+
//clear, 可於任何時點呼叫(含元素尚未取得), 並取消已排定之事件
|
|
550
|
+
ev.clear = () => {
|
|
551
|
+
if (core.isCleared()) {
|
|
552
|
+
return
|
|
553
|
+
}
|
|
554
|
+
core.clear()
|
|
555
|
+
waitRemove(onDomChange)
|
|
556
|
+
roBorder.disconnect()
|
|
557
|
+
roContent.disconnect()
|
|
558
|
+
if (timerInline !== null) {
|
|
559
|
+
clearInterval(timerInline)
|
|
560
|
+
timerInline = null
|
|
561
|
+
}
|
|
562
|
+
ele = null
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
return ev
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
/**
|
|
570
|
+
* 前端針對DOM元素監聽resize、resizeWithWindow事件,其中resizeWithWindow為dom resize與window resize皆會觸發的事件
|
|
571
|
+
*
|
|
572
|
+
* 瀏覽器支援ResizeObserver與MutationObserver時以其偵測(即時且閒置時不耗資源),否則退回定期輪詢,兩者之比較規則與事件相同:以offsetWidth、offsetHeight與比較基準之差超過容許誤差即發出,比較基準為上次發出事件時之尺寸,故緩慢之連續小變化累積超過容許誤差亦會發出;尺寸為0(隱藏或移出DOM)不發出,由隱藏恢復顯示時會發出,首次取得非0尺寸時會發出
|
|
573
|
+
*
|
|
574
|
+
* 元素可取不到、中途消失或重建為新節點:取不到、不在頁面中或尺寸為0時,於DOM變動時重新以f取得元素並改觀察之。行內元素(display:inline)ResizeObserver不回報,該偵測器改以定期量測
|
|
575
|
+
*
|
|
576
|
+
* 事件內容:sold為比較基準(上次發出事件時之尺寸),snew為本次量測,smode為寬與高相對比較基準之變化方向('larger'、'smaller'或''),ele為元素;from為'window'之事件其snew為最新量測,其中視窗尺寸取事件當下之值
|
|
577
|
+
*
|
|
578
|
+
* 已知限制:ResizeObserver模式下,僅屬性變化(如class)使f改指他元素、或Shadow DOM內之節點被替換時不會跟隨,此類使用端請用mode:'polling';sync為true時監聽器不得使所監聽元素之尺寸於同一幀內再變,否則瀏覽器回報ResizeObserver loop錯誤;Safari 15.4以前不支援觀察border-box,只改padding或border之變化於該處不會發出
|
|
579
|
+
*
|
|
580
|
+
* Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/domDetect.test.mjs Github}
|
|
581
|
+
* @memberOf wsemi
|
|
582
|
+
* @param {Function} f 輸入取得dom函數,可回傳null表示目前取不到
|
|
583
|
+
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
584
|
+
* @param {String} [opt.mode=''] 輸入偵測模式字串,給'polling'則強制使用定期輪詢,預設''
|
|
585
|
+
* @param {Integer} [opt.timeInterval=20] 輸入定期偵測時間整數,單位毫秒,用於輪詢模式與行內元素,預設20
|
|
586
|
+
* @param {Integer} [opt.tolerancePixel=1] 輸入容許誤差整數,單位px,可給0表示任何變化皆發出,預設1
|
|
587
|
+
* @param {Boolean} [opt.sync=false] 輸入是否於ResizeObserver回呼內同步發出事件布林值,true時使用端可於瀏覽器繪製前更新版面(例如圖表重繪),僅ResizeObserver模式有效,預設false
|
|
588
|
+
* @param {Boolean} [opt.watchIdentity=false] 輸入元素可見時是否仍於DOM變動時重新取得元素布林值,f可能於舊元素仍可見時改回傳另一元素者給true,僅ResizeObserver模式有效,預設false
|
|
589
|
+
* @returns {Object} 回傳物件,可使用on與clear函數,on可監聽resize與resizeWithWindow事件,clear為釋放監聽,可於任何時點呼叫(含元素尚未取得),並取消已排定之事件
|
|
590
|
+
* @example
|
|
591
|
+
* need test in browser
|
|
592
|
+
*
|
|
593
|
+
* //監聽dom
|
|
594
|
+
* let de = domDetect(() => {
|
|
595
|
+
* return document.querySelector('#id')
|
|
596
|
+
* })
|
|
597
|
+
* de.on('resize', (s) => {
|
|
598
|
+
* console.log('resize', s)
|
|
599
|
+
* })
|
|
600
|
+
* de.on('resizeWithWindow', (s) => {
|
|
601
|
+
* console.log('resizeWithWindow', s)
|
|
602
|
+
* })
|
|
603
|
+
*
|
|
604
|
+
* //釋放監聽
|
|
605
|
+
* de.clear()
|
|
606
|
+
*
|
|
607
|
+
*/
|
|
608
|
+
function domDetect(f, opt = {}) {
|
|
609
|
+
let useObserver = typeof window !== 'undefined' && !!window.ResizeObserver && !!window.MutationObserver && get(opt, 'mode', '') !== 'polling'
|
|
610
|
+
if (useObserver) {
|
|
611
|
+
return domDetectByObserver(f, opt)
|
|
612
|
+
}
|
|
613
|
+
return domDetectByPolling(f, opt)
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
|
|
617
|
+
export default domDetect
|
|
351
618
|
</code></pre>
|
|
352
619
|
</article>
|
|
353
620
|
</section>
|
|
@@ -362,7 +629,7 @@ export default domDetect
|
|
|
362
629
|
<br class="clear">
|
|
363
630
|
|
|
364
631
|
<footer>
|
|
365
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
632
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Fri Sep 25 2026 14:59:11 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
366
633
|
</footer>
|
|
367
634
|
|
|
368
635
|
<script>prettyPrint();</script>
|