wsemi 1.9.0 → 1.9.2
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 +4 -4
- 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 +1 -1
- package/docs/domDrag.mjs.html +1 -1
- package/docs/domDragBarAndScroll.mjs.html +476 -333
- 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 +42 -23
- 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 +2 -2
- 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 +66 -11
- package/package.json +1 -1
- package/src/_getDiff2Html.mjs +44 -38
- package/src/domDragBarAndScroll.mjs +475 -332
- package/src/isblob.mjs +41 -22
- package/src/isfile.mjs +1 -1
- package/test/_getDiff2Html.test.mjs +56 -0
- package/test/blob2ab.test.mjs +6 -0
- package/test/domDragBarAndScroll.test.mjs +1163 -11
- package/test/isblob.test.mjs +28 -1
- package/test/isfile.test.mjs +11 -1
- package/toolfp/dist/wsemip.umd.js +2 -2
- package/toolg/gDistRollup.mjs +2 -0
- package/toolparfor/dist/wpf.umd.js +1 -1
- package/toolparfor/dist/wpf_pmSeries.umd.js +1 -1
|
@@ -45,338 +45,481 @@
|
|
|
45
45
|
|
|
46
46
|
<section>
|
|
47
47
|
<article>
|
|
48
|
-
<pre class="prettyprint source linenums"><code>import get from 'lodash-es/get.js'
|
|
49
|
-
import isBoolean from 'lodash-es/isBoolean.js'
|
|
50
|
-
import isFunction from 'lodash-es/isFunction.js'
|
|
51
|
-
import evem from './evem.mjs'
|
|
52
|
-
import domCancelEvent from './domCancelEvent.mjs'
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* 前端針對指定panel與bar的DOM元素監聽滾輪與拖曳bar事件
|
|
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
|
-
let
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
//
|
|
105
|
-
let
|
|
106
|
-
if (!isFunction(
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
//
|
|
111
|
-
let
|
|
112
|
-
if (!
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
//
|
|
117
|
-
let
|
|
118
|
-
if (!isBoolean(
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
//
|
|
123
|
-
let
|
|
124
|
-
if (!isBoolean(
|
|
125
|
-
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
//
|
|
129
|
-
let
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
let
|
|
137
|
-
|
|
138
|
-
//
|
|
139
|
-
let
|
|
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
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
//
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
48
|
+
<pre class="prettyprint source linenums"><code>import get from 'lodash-es/get.js'
|
|
49
|
+
import isBoolean from 'lodash-es/isBoolean.js'
|
|
50
|
+
import isFunction from 'lodash-es/isFunction.js'
|
|
51
|
+
import evem from './evem.mjs'
|
|
52
|
+
import domCancelEvent from './domCancelEvent.mjs'
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 前端針對指定panel與bar的DOM元素監聽滾輪與拖曳bar事件
|
|
57
|
+
*
|
|
58
|
+
* 同時只服務一條通道(bar滑鼠、bar觸控、panel觸控),pressBar與freeBar恆成對,dragBar只出現於兩者之間。bar位於panel之內時,bar上起手之觸控只由bar通道處理,不因冒泡而重複發事件。bar通道發絕對座標,panel觸控通道發經比例縮放之相對位移,兩者語義不同
|
|
59
|
+
*
|
|
60
|
+
* 滑鼠僅主鍵可上鎖;拖出瀏覽器視窗外放開時收不到mouseup,回到視窗內移動時以buttons為0自我解鎖(以`new MouseEvent`合成mousemove時須自行給buttons,其預設值0會被視為已放開)。bar與window之mouseup刻意不判來源與按鍵,作為觸控通道遺失touchend時的最後救援。已上鎖時再按下主鍵視為接手,先替既有之鎖補發freeBar再發pressBar
|
|
61
|
+
*
|
|
62
|
+
* 觸控以起手那一指之identifier鎖定,其餘手指之落下、移動與放開皆不影響本次拖曳,手勢被系統中斷(touchcancel)時只解鎖不定值。起手元素於拖曳途中被移出DOM時(如消費端重繪bar之內容),瀏覽器不再把後續之touchmove與touchend送達bar,鎖因而殘留;下一次touchstart時以touches驗證起手指是否仍在,不在即視為殘鎖,先補發freeBar再重新上鎖。事件未帶足觸點資訊時(合成事件),有identifier者改自touches比對,無identifier者取第一點,無從判斷時一律採解鎖側
|
|
63
|
+
*
|
|
64
|
+
* 呼叫端須自備樣式:bar需`user-select:none`避免拖曳時選取文字,觸控場景另需`touch-action`避免瀏覽器接手捲動。拖曳期間勿重繪或移除bar內之元素,起手元素一旦脫離DOM,當次觸控拖曳即中斷(下一次觸控會自行復原)
|
|
65
|
+
*
|
|
66
|
+
* 已知限制:同一panel掛兩個實例時一次滾輪會各發一次scrollPanel;單指輕點bar時瀏覽器另會補發相容滑鼠事件,故pressBar與freeBar各發兩次;拖曳中呼叫clear只停止而不補發freeBar
|
|
67
|
+
*
|
|
68
|
+
* Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/domDragBarAndScroll.test.mjs Github}
|
|
69
|
+
* @memberOf wsemi
|
|
70
|
+
* @param {HTMLElement} panel 輸入panel元素
|
|
71
|
+
* @param {HTMLElement} bar 輸入bar元素
|
|
72
|
+
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
73
|
+
* @param {Function} [opt.getHeighRatio=()=>1] 輸入取得高度比例函數,因組件本身或內容物可能會調整尺寸, 故需由外部給予函數取得當前heighRatio,預設()=>1
|
|
74
|
+
* @param {Function} [opt.getWidthRatio=()=>1] 輸入取得寬度比例函數,因組件本身或內容物可能會調整尺寸, 故需由外部給予函數取得當前widthRatio,預設()=>1
|
|
75
|
+
* @param {Boolean} [opt.stopScrollPropagationForPanel=false] 輸入是否停用滑鼠捲動事件向上傳遞布林值,預設false
|
|
76
|
+
* @param {Boolean} [opt.stopTouchDragPropagationForPanel=false] 輸入是否停用手機拖曳事件向上傳遞布林值,預設false
|
|
77
|
+
* @param {Boolean} [opt.useTouchDragForPanel=true] 輸入是否使用手機拖曳事件布林值,預設true
|
|
78
|
+
* @returns {Object} 回傳物件,可使用on與clear函數,on可監聽scrollPanel、pressBar、dragBar、freeBar事件,clear為釋放監聽。scrollPanel帶{ratioY,ratioX}為該軸之滾動方向(1、-1或0),pressBar與dragBar帶{clientY,clientX},freeBar不帶參數
|
|
79
|
+
* @example
|
|
80
|
+
* need test in browser
|
|
81
|
+
*
|
|
82
|
+
* //監聽dom
|
|
83
|
+
* let divPanel = document.querySelector('#id_panel')
|
|
84
|
+
* let divBar = document.querySelector('#id_bar')
|
|
85
|
+
* let getHeighRatio = () => 0.9
|
|
86
|
+
* let das = domDragBarAndScroll(divPanel, divBar, { getHeighRatio, stopScrollPropagationForPanel: true, stopTouchDragPropagationForPanel: true })
|
|
87
|
+
* das.on('scrollPanel', () => {})
|
|
88
|
+
* das.on('pressBar', () => {})
|
|
89
|
+
* das.on('dragBar', () => {})
|
|
90
|
+
* das.on('freeBar', () => {})
|
|
91
|
+
*
|
|
92
|
+
* //釋放監聽
|
|
93
|
+
* das.clear()
|
|
94
|
+
*
|
|
95
|
+
*/
|
|
96
|
+
function domDragBarAndScroll(panel, bar, opt = {}) {
|
|
97
|
+
|
|
98
|
+
//getHeighRatio, 因組件本身或內容物可能會調整尺寸, 故需由外部給予函數取得當前heighRatio
|
|
99
|
+
let getHeighRatio = get(opt, 'getHeighRatio', null)
|
|
100
|
+
if (!isFunction(getHeighRatio)) {
|
|
101
|
+
getHeighRatio = () => 1
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
//getWidthRatio, 因組件本身或內容物可能會調整尺寸, 故需由外部給予函數取得當前widthRatio
|
|
105
|
+
let getWidthRatio = get(opt, 'getWidthRatio', null)
|
|
106
|
+
if (!isFunction(getWidthRatio)) {
|
|
107
|
+
getWidthRatio = () => 1
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
//stopScrollPropagationForPanel
|
|
111
|
+
let stopScrollPropagationForPanel = get(opt, 'stopScrollPropagationForPanel', null)
|
|
112
|
+
if (!isBoolean(stopScrollPropagationForPanel)) {
|
|
113
|
+
stopScrollPropagationForPanel = false
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
//stopTouchDragPropagationForPanel
|
|
117
|
+
let stopTouchDragPropagationForPanel = get(opt, 'stopTouchDragPropagationForPanel', null)
|
|
118
|
+
if (!isBoolean(stopTouchDragPropagationForPanel)) {
|
|
119
|
+
stopTouchDragPropagationForPanel = false
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
//useTouchDragForPanel
|
|
123
|
+
let useTouchDragForPanel = get(opt, 'useTouchDragForPanel', null)
|
|
124
|
+
if (!isBoolean(useTouchDragForPanel)) {
|
|
125
|
+
useTouchDragForPanel = true
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
//ele
|
|
129
|
+
let elePanel = panel
|
|
130
|
+
let eleBar = bar
|
|
131
|
+
|
|
132
|
+
//ev
|
|
133
|
+
let ev = evem()
|
|
134
|
+
|
|
135
|
+
//pressFrom, 目前上鎖之通道, 為'barMouse'、'barTouch'、'panelTouch'之一, 未上鎖時為''
|
|
136
|
+
let pressFrom = ''
|
|
137
|
+
|
|
138
|
+
//pressTouchId, 觸控通道之起手指identifier; 滑鼠通道, 或起手事件未帶identifier時為null
|
|
139
|
+
let pressTouchId = null
|
|
140
|
+
|
|
141
|
+
//listeners, 已掛上之監聽, clear時逐一移除, 使掛上與移除天然成對
|
|
142
|
+
let listeners = []
|
|
143
|
+
|
|
144
|
+
//evBarTouchstart, bar通道最近一次收到之touchstart事件, 供panel通道辨識冒泡上來之同一事件
|
|
145
|
+
let evBarTouchstart = null
|
|
146
|
+
|
|
147
|
+
//isLocked
|
|
148
|
+
function isLocked() {
|
|
149
|
+
return pressFrom !== ''
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
//lock, 上鎖之唯一寫法, 全部狀態成套設定
|
|
153
|
+
function lock(from, id) {
|
|
154
|
+
pressFrom = from
|
|
155
|
+
pressTouchId = (id === undefined) ? null : id
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
//unlock, 解鎖之唯一寫法, 全部狀態成套歸零
|
|
159
|
+
// 解鎖規則若手寫於各處, 任一處漏改即造成狀態殘留(如觸控起手後被mouseup打斷, 殘留之identifier會讓滑鼠通道永久失效)
|
|
160
|
+
function unlock() {
|
|
161
|
+
pressFrom = ''
|
|
162
|
+
pressTouchId = null
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
//press, 上鎖並發pressBar之唯一寫法
|
|
166
|
+
// 已上鎖時為接手既有之鎖, 先替該鎖補發freeBar, 使pressBar與freeBar恆成對; 狀態一律先於emit異動, 監聽器拋錯時才不會留下半套狀態
|
|
167
|
+
function press(from, id, msg) {
|
|
168
|
+
let taken = isLocked()
|
|
169
|
+
lock(from, id)
|
|
170
|
+
if (taken) {
|
|
171
|
+
ev.emit('freeBar')
|
|
172
|
+
|
|
173
|
+
//check, freeBar之監聽器內呼叫clear時已解鎖, 不得再發pressBar
|
|
174
|
+
if (!isLocked()) {
|
|
175
|
+
return
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
}
|
|
179
|
+
ev.emit('pressBar', msg)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
//free, 解鎖並發freeBar之唯一寫法
|
|
183
|
+
function free() {
|
|
184
|
+
unlock()
|
|
185
|
+
ev.emit('freeBar')
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
//listen, 掛監聽之唯一寫法, 同步記錄供clear移除
|
|
189
|
+
function listen(target, type, fun, options) {
|
|
190
|
+
target.addEventListener(type, fun, options)
|
|
191
|
+
listeners.push({ target, type, fun })
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
//getSign, 取滾動方向; 不可用delta/Math.abs(delta), 一般滑鼠滾輪之deltaX恆為0, 該式會得NaN
|
|
195
|
+
function getSign(v) {
|
|
196
|
+
if (v > 0) {
|
|
197
|
+
return 1
|
|
198
|
+
}
|
|
199
|
+
if (v < 0) {
|
|
200
|
+
return -1
|
|
201
|
+
}
|
|
202
|
+
return 0
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
//getTouches, 取事件內指定之觸點清單, 無該清單或清單為空時回null
|
|
206
|
+
function getTouches(e, key) {
|
|
207
|
+
let ts = get(e, key, null)
|
|
208
|
+
if (!ts || !(ts.length > 0)) {
|
|
209
|
+
return null
|
|
210
|
+
}
|
|
211
|
+
return ts
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
//findTouch, 自觸點清單取指定identifier者, 無則回null
|
|
215
|
+
function findTouch(ts, id) {
|
|
216
|
+
for (let i = 0; i < ts.length; i++) {
|
|
217
|
+
let t = ts[i]
|
|
218
|
+
if (t && t.identifier === id) {
|
|
219
|
+
return t
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return null
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
//getTouchNew, 取本次新落下之觸點, 無則回null
|
|
226
|
+
// changedTouches為本次變動者, touches為當前全部接觸點, 故起手須取前者; 合成事件可能只帶touches, 此時退而取之
|
|
227
|
+
function getTouchNew(e) {
|
|
228
|
+
let ts = getTouches(e, 'changedTouches')
|
|
229
|
+
if (ts === null) {
|
|
230
|
+
ts = getTouches(e, 'touches')
|
|
231
|
+
}
|
|
232
|
+
if (ts === null) {
|
|
233
|
+
return null
|
|
234
|
+
}
|
|
235
|
+
return ts[0] || null
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
//getTouchOwn, 取起手那一指, 本次事件與該指無關時回null
|
|
239
|
+
// changedTouches有內容時只認它, 不可再退至touches, 否則他指移動時會以起手指之舊座標重複發dragBar
|
|
240
|
+
function getTouchOwn(e) {
|
|
241
|
+
let ts = getTouches(e, 'changedTouches')
|
|
242
|
+
if (ts === null) {
|
|
243
|
+
ts = getTouches(e, 'touches')
|
|
244
|
+
}
|
|
245
|
+
if (ts === null) {
|
|
246
|
+
return null
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
//起手事件未帶identifier時無從比對, 沿用取第一點之行為
|
|
250
|
+
if (pressTouchId === null) {
|
|
251
|
+
return ts[0] || null
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
return findTouch(ts, pressTouchId)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
//isTouchOwnReleased, 本次touchend或touchcancel是否為起手指放開或被取消
|
|
258
|
+
function isTouchOwnReleased(e) {
|
|
259
|
+
|
|
260
|
+
//起手事件未帶identifier時無從比對, 沿用任一touchend皆解鎖之行為
|
|
261
|
+
if (pressTouchId === null) {
|
|
262
|
+
return true
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
//changedTouches為本次放開或被取消者
|
|
266
|
+
let ts = getTouches(e, 'changedTouches')
|
|
267
|
+
if (ts !== null) {
|
|
268
|
+
return findTouch(ts, pressTouchId) !== null
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
//合成事件可能只帶touches(仍在接觸者), 起手指不在其中即已放開
|
|
272
|
+
ts = getTouches(e, 'touches')
|
|
273
|
+
if (ts !== null) {
|
|
274
|
+
return findTouch(ts, pressTouchId) === null
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
//無任何觸點資訊時採安全側, 寧可解鎖也不留殘鎖
|
|
278
|
+
return true
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
//isLockAlive, 觸控起手時既有之鎖是否仍有效; 無從證明有效者一律視為殘留, 寧可重新上鎖也不讓觸控就此失效
|
|
282
|
+
// 起手元素於拖曳途中被移出DOM時, 後續之touchmove與touchend不再送達, 鎖即殘留; 若一律忽略已上鎖時之touchstart, 觸控將無法再拖曳
|
|
283
|
+
function isLockAlive(e, t) {
|
|
284
|
+
|
|
285
|
+
//滑鼠之鎖無從由觸控事件驗證, 視為有效; 其殘留另由mousemove之buttons、mouseup與再次mousedown處理
|
|
286
|
+
if (pressFrom === 'barMouse') {
|
|
287
|
+
return true
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
//起手事件未帶identifier, 無從比對
|
|
291
|
+
if (pressTouchId === null) {
|
|
292
|
+
return false
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
//新落下者與起手指同identifier: 同時接觸之手指其identifier不重複, 故原起手指早已離開(Chrome與Firefox之identifier自0起重用)
|
|
296
|
+
if (t.identifier === pressTouchId) {
|
|
297
|
+
return false
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
//touches為當前全部接觸點, 起手指仍在其中才是有效之鎖(iOS之identifier不重用, 須靠此判定)
|
|
301
|
+
let ts = getTouches(e, 'touches')
|
|
302
|
+
if (ts === null) {
|
|
303
|
+
return false
|
|
304
|
+
}
|
|
305
|
+
return findTouch(ts, pressTouchId) !== null
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
//addMouseChannel, bar之滑鼠通道
|
|
309
|
+
function addMouseChannel() {
|
|
310
|
+
|
|
311
|
+
//mousedown
|
|
312
|
+
listen(eleBar, 'mousedown', (e) => {
|
|
313
|
+
|
|
314
|
+
//check, 只處理主鍵, 中鍵與右鍵不得上鎖; 以'button' in e判定使無button屬性之合成事件維持原本可上鎖之行為
|
|
315
|
+
if ('button' in e && e.button !== 0) {
|
|
316
|
+
return
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
//press, 已上鎖時亦接手: 滑鼠之鎖此時必為殘留(mouseup遺失且其間無mousemove), 觸控之鎖則以滑鼠為其救援通道
|
|
320
|
+
press('barMouse', null, { clientY: e.clientY, clientX: e.clientX }) //寬版bar, 上鎖與紀錄點擊y座標
|
|
321
|
+
|
|
322
|
+
})
|
|
323
|
+
|
|
324
|
+
//mouseup, 可由window之mouseup自動解鎖, 不過若嵌入panel有攔截mouseup事件(例如popup)會導致外面window收不到mouseup事件, 故bar的mouseup事件仍需要監聽處理解鎖行為
|
|
325
|
+
// 刻意不判來源與按鍵: 此為觸控通道遺失touchend時的最後救援, 與split.js、MUI之終止側作法一致
|
|
326
|
+
listen(eleBar, 'mouseup', () => {
|
|
327
|
+
if (isLocked()) {
|
|
328
|
+
free() //窄版bar, 解鎖
|
|
329
|
+
}
|
|
330
|
+
})
|
|
331
|
+
|
|
332
|
+
//mousemove
|
|
333
|
+
listen(window, 'mousemove', (e) => {
|
|
334
|
+
|
|
335
|
+
//check, 僅服務滑鼠通道; 觸控上鎖時不得以絕對座標發dragBar, 否則會污染panel通道之縮放座標語義
|
|
336
|
+
if (pressFrom !== 'barMouse') {
|
|
337
|
+
return
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
//check, 拖出瀏覽器視窗外放開時收不到mouseup, 回到視窗內移動時以buttons為0自我解鎖
|
|
341
|
+
if (e.buttons === 0) {
|
|
342
|
+
free()
|
|
343
|
+
return
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
//emit
|
|
347
|
+
ev.emit('dragBar', { clientY: e.clientY, clientX: e.clientX }) //寬版bar, 用鎖與滑動距離拖曳bar
|
|
348
|
+
|
|
349
|
+
})
|
|
350
|
+
|
|
351
|
+
//mouseup, 刻意不判來源與按鍵, 理由同bar之mouseup
|
|
352
|
+
listen(window, 'mouseup', (e) => {
|
|
353
|
+
if (!isLocked()) {
|
|
354
|
+
return
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
//cancel, 須先於emit, 否則監聽器拋錯時本行不會執行而漏擋
|
|
358
|
+
if (stopScrollPropagationForPanel) {
|
|
359
|
+
domCancelEvent(e) //要禁止回傳否則會連外部body捲軸一起移動畫面
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
free() //寬版bar, 解鎖
|
|
363
|
+
|
|
364
|
+
})
|
|
365
|
+
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
//addWheelChannel, panel之滾輪通道
|
|
369
|
+
// window與document之scroll與wheel不掛監聽: 曾嘗試於上鎖時取消該二者, 以避免手機拖曳觸底時連帶捲動外層頁面, 但其於該處無法取消(cancelable=false), 即便使用passive=false亦然
|
|
370
|
+
// 且Chrome對掛於window與document之wheel監聽預設視為passive以加速捲動, 明確給passive:false反會放棄該處理
|
|
371
|
+
function addWheelChannel() {
|
|
372
|
+
listen(elePanel, 'wheel', (e) => {
|
|
373
|
+
|
|
374
|
+
//cancel, 須先於emit, 否則監聽器拋錯時本行不會執行而漏擋
|
|
375
|
+
if (stopScrollPropagationForPanel) {
|
|
376
|
+
domCancelEvent(e) //要禁止外部元素如body被滑鼠捲動
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
//emit
|
|
380
|
+
ev.emit('scrollPanel', { ratioY: getSign(e.deltaY), ratioX: getSign(e.deltaX) }) //寬版頁面, 用滾輪上下捲動, 實際是傳移動方向給bar
|
|
381
|
+
|
|
382
|
+
})
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
//addTouchChannel, bar與panel之觸控通道除元素、座標語義與擋預設行為之時機外規則完全相同, 故共用同一組處理器, 每條規則只寫一處
|
|
386
|
+
function addTouchChannel(ele, from, getMsg, cancel) {
|
|
387
|
+
|
|
388
|
+
//touchstart
|
|
389
|
+
listen(ele, 'touchstart', (e) => {
|
|
390
|
+
|
|
391
|
+
//check, bar上起手之觸控只由bar通道處理; bar位於panel之內, bar上之touchstart會冒泡至panel, 若不擋則同一次觸控會發兩次pressBar且第二次為縮放座標
|
|
392
|
+
// 不可改以「已上鎖即忽略」判定: identifier重用時, 冒泡上來之同一事件與殘鎖後之新觸控無從區分
|
|
393
|
+
if (from === 'barTouch') {
|
|
394
|
+
evBarTouchstart = e
|
|
395
|
+
}
|
|
396
|
+
else if (e === evBarTouchstart) {
|
|
397
|
+
evBarTouchstart = null
|
|
398
|
+
return
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
//t, 無觸點時忽略, 不可直接取用而拋錯
|
|
402
|
+
let t = getTouchNew(e)
|
|
403
|
+
if (t === null) {
|
|
404
|
+
return
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
//check, 已上鎖且該鎖仍有效者為他指落下, 不得重新定錨; 該鎖為殘留者則由press接手
|
|
408
|
+
if (isLocked() && isLockAlive(e, t)) {
|
|
409
|
+
return
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
//cancel, 須先於getMsg與emit, 否則比例函數或監聽器拋錯時本行不會執行而漏擋
|
|
413
|
+
if (cancel.start) {
|
|
414
|
+
domCancelEvent(e)
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
//press
|
|
418
|
+
press(from, t.identifier, getMsg(t))
|
|
419
|
+
|
|
420
|
+
})
|
|
421
|
+
|
|
422
|
+
//touchmove
|
|
423
|
+
listen(ele, 'touchmove', (e) => {
|
|
424
|
+
|
|
425
|
+
//check, 通道互斥須為顯式判定, 不可依賴domCancelEvent之stopPropagation副作用(事件不可取消時該副作用不會發生)
|
|
426
|
+
if (pressFrom !== from) {
|
|
427
|
+
return
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
//cancel, 須先於起手指判定與emit, 否則他指移動或監聽器拋錯時本行不會執行, 拖曳期間頁面即可被捲動
|
|
431
|
+
if (cancel.move) {
|
|
432
|
+
domCancelEvent(e) //要禁止外部元素如body被拖曳移動畫面
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
//t, 非起手指之移動不得搶值
|
|
436
|
+
let t = getTouchOwn(e)
|
|
437
|
+
if (t === null) {
|
|
438
|
+
return
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
//emit
|
|
442
|
+
ev.emit('dragBar', getMsg(t))
|
|
443
|
+
|
|
444
|
+
}, { passive: false }) //必須使用passive=false否則無法cancel
|
|
445
|
+
|
|
446
|
+
//touchend與touchcancel共用, 兩者皆只解鎖不定值; touchcancel為手勢被系統中斷(如瀏覽器接手捲動、長按選單), 其座標不可信
|
|
447
|
+
// touchcancel依規範不可取消, domCancelEvent對其無作用
|
|
448
|
+
let funTouchend = (e) => {
|
|
449
|
+
|
|
450
|
+
//check
|
|
451
|
+
if (pressFrom !== from) {
|
|
452
|
+
return
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
//check, 非起手指放開或被取消不終止本次拖曳
|
|
456
|
+
if (!isTouchOwnReleased(e)) {
|
|
457
|
+
return
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
//cancel
|
|
461
|
+
if (cancel.end) {
|
|
462
|
+
domCancelEvent(e)
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
free()
|
|
466
|
+
|
|
467
|
+
}
|
|
468
|
+
listen(ele, 'touchend', funTouchend)
|
|
469
|
+
listen(ele, 'touchcancel', funTouchend)
|
|
470
|
+
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
function add() {
|
|
474
|
+
|
|
475
|
+
//addMouseChannel
|
|
476
|
+
addMouseChannel()
|
|
477
|
+
|
|
478
|
+
//addWheelChannel
|
|
479
|
+
addWheelChannel()
|
|
480
|
+
|
|
481
|
+
//addTouchChannel, 窄版bar, 發絕對座標; 拖曳期間一律禁止頁面被拖曳捲動, touchstart與touchend不擋, 否則輕點bar後瀏覽器不再產生click
|
|
482
|
+
addTouchChannel(eleBar, 'barTouch', (t) => {
|
|
483
|
+
return { clientY: t.clientY, clientX: t.clientX }
|
|
484
|
+
}, { start: false, move: true, end: false })
|
|
485
|
+
|
|
486
|
+
//addTouchChannel, 窄版頁面, 用滑動距離拖曳頁面, 實際是傳移動距離給bar, 僅取起手觸擊點座標, 另需被heighRatio與widthRatio修正比例
|
|
487
|
+
// 是否擋預設行為由旗標控制, 因擋下會導致無法左右拖曳元素(開啟overflow-x:auto者無法使用)
|
|
488
|
+
// 停用時不掛監聽, 避免panel平白多一個passive:false之touchmove監聽
|
|
489
|
+
if (useTouchDragForPanel) {
|
|
490
|
+
let b = stopTouchDragPropagationForPanel
|
|
491
|
+
addTouchChannel(elePanel, 'panelTouch', (t) => {
|
|
492
|
+
return { clientY: -t.clientY * getHeighRatio(), clientX: -t.clientX * getWidthRatio() }
|
|
493
|
+
}, { start: b, move: b, end: b })
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
function clear() {
|
|
499
|
+
|
|
500
|
+
//unlock, 釋放監聽時一併歸零狀態; 拖曳中呼叫時只停止, 不補發freeBar
|
|
501
|
+
unlock()
|
|
502
|
+
evBarTouchstart = null
|
|
503
|
+
|
|
504
|
+
//removeEventListener
|
|
505
|
+
for (let l of listeners) {
|
|
506
|
+
l.target.removeEventListener(l.type, l.fun)
|
|
507
|
+
}
|
|
508
|
+
listeners = []
|
|
509
|
+
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
//add
|
|
513
|
+
add()
|
|
514
|
+
|
|
515
|
+
//save
|
|
516
|
+
ev.clear = clear
|
|
517
|
+
|
|
518
|
+
return ev
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
export default domDragBarAndScroll
|
|
380
523
|
</code></pre>
|
|
381
524
|
</article>
|
|
382
525
|
</section>
|
|
@@ -391,7 +534,7 @@ export default domDragBarAndScroll
|
|
|
391
534
|
<br class="clear">
|
|
392
535
|
|
|
393
536
|
<footer>
|
|
394
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on
|
|
537
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Tue Sep 22 2026 10:23:34 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
395
538
|
</footer>
|
|
396
539
|
|
|
397
540
|
<script>prettyPrint();</script>
|