ps-tcplayer
Version:
Tencent Cloud Player component with Vue2/Vue3 compatibility
169 lines (160 loc) • 4.38 kB
JavaScript
/**
* 加载外部资源(JS、CSS)
* @param {Array} sources - 资源URL数组
* @param {Function} cb - 加载完成回调
*/
export function loadResource(sources, cb) {
let arr = [...sources]
if (!arr.length) {
cb && cb()
console.log('resource loaded')
return false
}
let item = arr.shift()
if (!item) {
loadResource(arr, cb)
return false
}
if (item.endsWith('.js')) {
getJS(item, () => {
loadResource(arr, cb)
})
} else if (item.endsWith('.css')) {
getCss(item, () => {
loadResource(arr, cb)
})
} else {
console.warn('unsupported resource:', item)
loadResource(arr, cb)
}
}
/**
* 加载JS文件
* @param {String} url - JS文件URL
* @param {Function} callback - 加载完成回调
*/
function getJS(url, callback) {
if(document.querySelector(`script[src="${url}"]`)) {
console.log(url, ': already loaded')
callback && callback();
return false
}
var script = document.createElement('script'),
fn = callback || function(){};
script.type = 'text/javascript'
// IE
if(script.readyState) {
script.onreadystatechange = function() {
if(script.readyState == 'loaded' || script.readyState == 'complete') {
script.onreadystatechange = null;
fn();
} else {
script.onreadystatechange = null;
fn();
}
};
} else {
// 其他浏览器
script.onload = function() {
fn();
};
script.onerror = function(err) {
fn();
console.log(err)
};
}
script.src = url;
document.querySelector('body').appendChild(script)
}
/**
* 加载CSS文件
* @param {String} url - CSS文件URL
* @param {Function} callback - 加载完成回调
*/
function getCss(url, callback) {
if(document.querySelector(`link[href="${url}"]`)) {
console.log(url, ': already loaded')
callback && callback();
return false
}
var css = document.createElement('link'),
fn = callback || function(){};
css.rel = 'stylesheet';
// IE
if(css.readyState) {
css.onreadystatechange = function() {
if(css.readyState == 'loaded' || css.readyState == 'complete') {
css.onreadystatechange = null;
fn();
} else {
css.onreadystatechange = null;
fn();
}
};
} else {
// 其他浏览器
css.onload = function() {
fn();
};
css.onerror = function(err) {
fn();
console.log(err)
};
}
css.href = url;
document.querySelector('head').appendChild(css)
}
/**
* 解析DOM字符串为DOM元素
* @param {String} html - HTML字符串
* @returns {Node} - DOM节点
*/
export function parseDom(html) {
let ele = document.createElement('div')
ele.innerHTML = html.trim()
return ele.childNodes[0]
}
/**
* 在目标元素之后插入新元素
* @param {Element} newElement - 要插入的新元素
* @param {Element} targetElement - 目标元素
*/
export function afterinsert(newElement, targetElement) {
const parent = targetElement.parentNode;
if (parent.lastChild === targetElement) {
parent.appendChild(newElement);
} else {
parent.insertBefore(newElement, targetElement.nextSibling);
}
}
/**
* 判断是否为DOM元素
* @param {any} node - 要检查的节点
* @returns {Boolean} - 是否为元素
*/
export function isElement(node) {
return node instanceof Element || node instanceof HTMLDocument
}
export const STORAGE_KEYS = {
VOLUME: 'cto_ali_player_vol',
RATE: 'cto_video_Rate',
}
// 本地存储工具函数
export const localStore = {
get(key, defaultVal) {
try {
const val = localStorage.getItem(key)
return val !== null ? JSON.parse(val) : defaultVal
} catch (e) {
console.error('获取本地存储失败:', e)
return defaultVal
}
},
set(key, val) {
try {
localStorage.setItem(key, JSON.stringify(val))
} catch (e) {
console.error('设置本地存储失败:', e)
}
}
}