44 lines
1.4 KiB
JavaScript
44 lines
1.4 KiB
JavaScript
const scriptPromises = new Map()
|
|
|
|
function normalizeBaseUrl(value) {
|
|
return String(value || '').replace(/\/$/, '')
|
|
}
|
|
|
|
export function buildOnlyOfficeScriptUrl(documentServerUrl) {
|
|
return `${normalizeBaseUrl(documentServerUrl)}/web-apps/apps/api/documents/api.js`
|
|
}
|
|
|
|
export function loadOnlyOfficeApi(documentServerUrl) {
|
|
const scriptUrl = buildOnlyOfficeScriptUrl(documentServerUrl)
|
|
if (typeof window === 'undefined') {
|
|
return Promise.reject(new Error('ONLYOFFICE 只能在浏览器环境中加载。'))
|
|
}
|
|
|
|
if (window.DocsAPI?.DocEditor) {
|
|
return Promise.resolve(window.DocsAPI)
|
|
}
|
|
|
|
if (scriptPromises.has(scriptUrl)) {
|
|
return scriptPromises.get(scriptUrl)
|
|
}
|
|
|
|
const promise = new Promise((resolve, reject) => {
|
|
const existing = document.querySelector(`script[src="${scriptUrl}"]`)
|
|
if (existing) {
|
|
existing.addEventListener('load', () => resolve(window.DocsAPI), { once: true })
|
|
existing.addEventListener('error', () => reject(new Error('ONLYOFFICE 脚本加载失败。')), { once: true })
|
|
return
|
|
}
|
|
|
|
const script = document.createElement('script')
|
|
script.src = scriptUrl
|
|
script.async = true
|
|
script.onload = () => resolve(window.DocsAPI)
|
|
script.onerror = () => reject(new Error('ONLYOFFICE 脚本加载失败。'))
|
|
document.head.appendChild(script)
|
|
})
|
|
|
|
scriptPromises.set(scriptUrl, promise)
|
|
return promise
|
|
}
|