|
|
/**
|
|
|
* 将RGBA颜色值转换为HEX格式(支持透明度)
|
|
|
* @param {string} rgbaStr - RGBA颜色字符串,如 "rgba(255, 0, 0, 0.5)"
|
|
|
* @returns {string} HEX颜色字符串,如 "#ff000080"
|
|
|
*/
|
|
|
function rgbaToHex(rgbaStr) {
|
|
|
// 验证输入格式
|
|
|
if (!rgbaStr || typeof rgbaStr !== 'string') {
|
|
|
return '';
|
|
|
}
|
|
|
|
|
|
// 首先检查是否已经是HEX格式
|
|
|
if (isHexColor(rgbaStr)) {
|
|
|
return rgbaStr;
|
|
|
}
|
|
|
|
|
|
// 提取RGBA值
|
|
|
const rgbaMatch = rgbaStr.match(/^rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*([\d.]+))?\s*\)$/i);
|
|
|
|
|
|
if (!rgbaMatch) {
|
|
|
throw new Error('无效的颜色格式,请使用RGBA或HEX格式');
|
|
|
}
|
|
|
|
|
|
// 解析RGBA值
|
|
|
let r = parseInt(rgbaMatch[1], 10);
|
|
|
let g = parseInt(rgbaMatch[2], 10);
|
|
|
let b = parseInt(rgbaMatch[3], 10);
|
|
|
let a = rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : 1;
|
|
|
|
|
|
// 验证取值范围
|
|
|
if ([r, g, b].some((value) => value < 0 || value > 255)) {
|
|
|
throw new Error('RGB值必须在0-255范围内');
|
|
|
}
|
|
|
|
|
|
if (a < 0 || a > 1) {
|
|
|
throw new Error('透明度值必须在0-1范围内');
|
|
|
}
|
|
|
|
|
|
// 将透明度转换为0-255的整数
|
|
|
const alphaInt = Math.round(a * 255);
|
|
|
|
|
|
// 辅助函数:将十进制转换为两位十六进制
|
|
|
const toHex = (num) => {
|
|
|
const hex = num.toString(16);
|
|
|
return hex.length === 1 ? '0' + hex : hex;
|
|
|
};
|
|
|
|
|
|
// 转换为HEX格式
|
|
|
const hexColor = `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
|
|
|
|
// 如果有透明度且不等于1,则添加透明度值
|
|
|
if (a !== 1) {
|
|
|
return hexColor + toHex(alphaInt);
|
|
|
}
|
|
|
|
|
|
return hexColor;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 检查字符串是否为有效的HEX颜色格式
|
|
|
* @param {string} str - 颜色字符串
|
|
|
* @returns {boolean} 是否为HEX格式
|
|
|
*/
|
|
|
function isHexColor(str) {
|
|
|
// 移除可能存在的空格
|
|
|
const cleanStr = str.trim();
|
|
|
|
|
|
// HEX颜色正则表达式,支持以下格式:
|
|
|
// #rgb, #rgba, #rrggbb, #rrggbbaa
|
|
|
const hexRegex = /^#([0-9A-F]{3,4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;
|
|
|
|
|
|
return hexRegex.test(cleanStr);
|
|
|
}
|
|
|
|
|
|
// 或者将isHexColor作为内部函数,如果只需要在当前函数中使用
|
|
|
function rgbaToHexWithValidation(rgbaStr) {
|
|
|
// 验证输入格式
|
|
|
if (!rgbaStr || typeof rgbaStr !== 'string') {
|
|
|
throw new Error('请输入有效的颜色字符串');
|
|
|
}
|
|
|
|
|
|
// 检查是否已经是HEX格式的内部函数
|
|
|
const isHexColor = (str) => {
|
|
|
const cleanStr = str.trim();
|
|
|
const hexRegex = /^#([0-9A-F]{3,4}|[0-9A-F]{6}|[0-9A-F]{8})$/i;
|
|
|
return hexRegex.test(cleanStr);
|
|
|
};
|
|
|
|
|
|
// 首先检查是否已经是HEX格式
|
|
|
if (isHexColor(rgbaStr)) {
|
|
|
return rgbaStr;
|
|
|
}
|
|
|
|
|
|
// 提取RGBA值
|
|
|
const rgbaMatch = rgbaStr.match(/^rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*([\d.]+))?\s*\)$/i);
|
|
|
|
|
|
if (!rgbaMatch) {
|
|
|
throw new Error(`无效的颜色格式: "${rgbaStr}",请使用RGBA(如 rgba(255,0,0,0.5)) 或 HEX(如 #ff0000) 格式`);
|
|
|
}
|
|
|
|
|
|
// 解析RGBA值
|
|
|
let r = parseInt(rgbaMatch[1], 10);
|
|
|
let g = parseInt(rgbaMatch[2], 10);
|
|
|
let b = parseInt(rgbaMatch[3], 10);
|
|
|
let a = rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : 1;
|
|
|
|
|
|
// 验证取值范围
|
|
|
if ([r, g, b].some((value) => value < 0 || value > 255)) {
|
|
|
throw new Error('RGB值必须在0-255范围内');
|
|
|
}
|
|
|
|
|
|
if (a < 0 || a > 1) {
|
|
|
throw new Error('透明度值必须在0-1范围内');
|
|
|
}
|
|
|
|
|
|
// 将透明度转换为0-255的整数
|
|
|
const alphaInt = Math.round(a * 255);
|
|
|
|
|
|
// 辅助函数:将十进制转换为两位十六进制
|
|
|
const toHex = (num) => {
|
|
|
const hex = num.toString(16);
|
|
|
return hex.length === 1 ? '0' + hex : hex;
|
|
|
};
|
|
|
|
|
|
// 转换为HEX格式
|
|
|
const hexColor = `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
|
|
|
|
// 如果有透明度且不等于1,则添加透明度值
|
|
|
if (a !== 1) {
|
|
|
return hexColor + toHex(alphaInt);
|
|
|
}
|
|
|
|
|
|
return hexColor;
|
|
|
}
|
|
|
|
|
|
var api = {
|
|
|
baseUrl: 'http://www.dtviptvott.com:20018/',
|
|
|
preFix: 'template/',
|
|
|
};
|
|
|
|
|
|
var requestFN = function ({ type = 'GET', url, data = {}, hasPreFix = true }, successCallback, errorCallback) {
|
|
|
$.ajax({
|
|
|
url: `${api.baseUrl}${hasPreFix ? api.preFix : ''}${url}`,
|
|
|
type,
|
|
|
data: type === 'GET' ? data : JSON.stringify(data),
|
|
|
dataType: 'json',
|
|
|
contentType: 'application/json',
|
|
|
success: function (response) {
|
|
|
successCallback && successCallback(response.data);
|
|
|
},
|
|
|
error: function (xhr, status, error) {
|
|
|
errorCallback && errorCallback(error);
|
|
|
},
|
|
|
});
|
|
|
};
|