site.js 에 호환성문제가 있는것으로 추정되어 롤백

This commit is contained in:
iyak 2025-04-03 06:07:29 +00:00
parent 3526c0ff85
commit 46fd22fb87
2 changed files with 124 additions and 370 deletions

View File

@ -346,94 +346,6 @@ function rcchange(s) {
eval($(s).attr("data-scmethod")); eval($(s).attr("data-scmethod"));
} }
} }
/** 로딩이미지 보여주기 */
function showLoadingImage() {
// 이미 존재하는 경우 중복 생성 방지
if (document.getElementById('custom-loading-overlay')) {
return;
}
// 로딩 이미지 요소 생성
const loadingDiv = document.createElement('div');
loadingDiv.id = 'custom-loading-overlay';
// 인라인 스타일 대신 클래스 사용을 위한 스타일 추가
const style = document.createElement('style');
style.textContent = `
#custom-loading-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 9999;
}
#custom-loading-spinner {
width: 40px;
height: 40px;
background-color: #fff;
border-radius: 100%;
-webkit-animation: sk-scaleout 1.0s infinite ease-in-out;
animation: sk-scaleout 1.0s infinite ease-in-out;
}
@-webkit-keyframes sk-scaleout {
0% { -webkit-transform: scale(0) }
100% { -webkit-transform: scale(1.0); opacity: 0; }
}
@keyframes sk-scaleout {
0% { transform: scale(0); -webkit-transform: scale(0); }
100% { transform: scale(1.0); -webkit-transform: scale(1.0); opacity: 0; }
}
/* 애니메이션 미지원 브라우저용 대체 스타일 */
.no-animation #custom-loading-spinner {
background-color: #3498db;
border: 5px solid #f3f3f3;
}
`;
document.head.appendChild(style);
// 브라우저 애니메이션 지원 확인
const supportsAnimation = 'AnimationEvent' in window ||
'WebKitAnimationEvent' in window ||
'MozAnimationEvent' in window ||
'msAnimationEvent' in window ||
'OAnimationEvent' in window;
// 기본 로딩 스피너
const spinnerDiv = document.createElement('div');
spinnerDiv.id = 'custom-loading-spinner';
// 애니메이션을 지원하지 않는 브라우저에는 정적 스타일 적용
if (!supportsAnimation) {
loadingDiv.className = 'no-animation';
}
loadingDiv.appendChild(spinnerDiv);
document.body.appendChild(loadingDiv);
}
/** 로딩이미지 제거 */
function hideLoadingImage() {
const loadingDiv = document.getElementById('custom-loading-overlay');
if (loadingDiv) {
// 스타일 요소도 정리
const style = document.querySelector('style[id^="custom-loading-style"]');
if (style) {
document.head.removeChild(style);
}
document.body.removeChild(loadingDiv);
}
}
function ajaxing(tf) { function ajaxing(tf) {
if (!_jsislayer2) { if (!_jsislayer2) {
bglayer(false); bglayer(false);
@ -870,208 +782,105 @@ function prg(id) {
function prgstop() { function prgstop() {
$("#bglayer .progress, #bglayer2 .progress").hide(); $("#bglayer .progress, #bglayer2 .progress").hide();
} }
function capfile(url, data, callback, noeval, setBG, jsislayer2) { function capfile(url, data, callback, noeval, setBG, jsislayer2, abscaller) {
// 로딩바 표시 추가
showLoadingImage();
noeval = noeval || false; noeval = noeval || false;
_abscaller = abscaller || false;
_jsislayer2 = jsislayer2 || false; _jsislayer2 = jsislayer2 || false;
_setBG = setBG || false; _setBG = setBG || false;
// 백그라운드 레이어 표시 capfilecallback = callback;
if (_setBG) { if (_setBG) {
prg('');
bglayer(); bglayer();
} }
if (_jsislayer2) { if (_jsislayer2) {
prg('2');
bglayer2(); bglayer2();
} }
// iOS 호환성을 위한 처리
// FormData 객체 확인 및 필요시 수정
if (data instanceof FormData) {
// iOS에서 FormData 디버깅을 위한 로그 (개발 중에만 사용)
console.log("FormData 항목 수:", [...data.entries()].length);
}
// 콜백 함수 실행 헬퍼
function executeCallback(result) {
// 로딩바 숨김 추가
hideLoadingImage();
if (_setBG) {
$("#bglayer").hide();
}
if (noeval) {
// 함수 객체로 직접 호출
if (typeof callback === 'function') {
callback(result);
}
}
else {
// 기존 방식 유지 (eval 사용)
// 보안상 권장되지 않지만 기존 코드 호환성 유지
try {
window.capResult = result; // 전역 변수로 결과 저장
if (typeof callback === 'string') {
if (callback.substr(callback.length - 1, 1) == ")") {
eval(callback);
} else {
eval(callback + "()");
}
}
} catch (e) {
console.error("콜백 실행 오류:", e);
}
}
}
var ajaxRequest = $.ajax({ var ajaxRequest = $.ajax({
type: "POST", type: "POST",
url: url, url: url,
contentType: false, contentType: false,
processData: false, processData: false,
data: data, data: data
timeout: 60000,
xhr: function () {
var xhr = $.ajaxSettings.xhr();
// 업로드 진행 상황 모니터링 (iOS에서 파일 업로드 진행 확인)
if (xhr.upload) {
xhr.upload.addEventListener('progress', function (e) {
if (e.lengthComputable) {
var percent = Math.round((e.loaded / e.total) * 100);
console.log("업로드 진행률: " + percent + "%");
}
}, false);
}
return xhr;
}
}); });
// 에러 처리 ajaxRequest.error(function (e) {
ajaxRequest.fail(function (jqXHR, textStatus, errorThrown) { prgstop();
console.error("Ajax 요청 실패:", textStatus, errorThrown); isCaping = false;
// 타임아웃인 경우 별도 처리 console.log(e.responseText);
if (textStatus === "timeout") { if (_jsislayer2) {
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요."); msg2("개발담당자에게 문의해주세요...");
// 로딩바 숨김 추가 (타임아웃 시)
hideLoadingImage();
} }
else { else {
// 기존 에러 처리 로직 유지 (하지만 에러 시 다른 처리를 권장) msg("개발담당자에게 문의해주세요...");
executeCallback({
code: -1,
message: "요청 처리 중 오류가 발생했습니다",
error: textStatus
});
} }
}); });
ajaxRequest.done(function (data) { ajaxRequest.done(function (data) {
if (data && data.code == 1000) { prgstop();
executeCallback(data); if (_setBG) {
$("#bglayer").hide();
}
capResult = data;
if (capResult.code == 1000 || _abscaller) {
eval(capfilecallback.substr(capfilecallback.length - 1, 1) == ")" ? capfilecallback : (capfilecallback + "()"));
} }
else { else {
console.warn("서버 응답 코드가 1000이 아닙니다:", data); console.log(capResult.code);
executeCallback(data); console.log(capResult.msg);
console.log(capResult.obj);
}
if (_jsislayer2) {
bglayer2(false);
}
else {
bglayer(false);
} }
}); });
} }
function capfileform(url, fid, callback, iseval, getpost, autoMsg, noBG, jsislayer2) { function capfileform(url, fid, callback, iseval, getpost, autoMsg, noBG, jsislayer2) {
_jsislayer2 = jsislayer2 || false; _jsislayer2 = jsislayer2 || false;
if (!isCaping) { if (!isCaping) {
// 로딩바 표시 추가
showLoadingImage();
isAutoMsg = autoMsg || false; isAutoMsg = autoMsg || false;
_bging = noBG || false; _bging = noBG || false;
if (!_bging) { ajaxing(); } if (!_bging) {
if (_jsislayer2) { bglayer2(); } prg('');
ajaxing();
}
if (_jsislayer2) {
prg('2');
bglayer2();
}
_callback = callback; _callback = callback;
capResult = null; capResult = null;
capOK = false; capOK = false;
isCaping = true; isCaping = true;
// 폼 요소 직접 참조 clearComma();
const form = document.getElementById(fid);
// iOS 호환성을 위한 FormData 생성 방식 개선
let formData;
try {
// 기본 FormData 생성 시도
formData = new FormData(form);
// iOS 호환성 검사 - 파일 입력 필드 확인
const fileInputs = form.querySelectorAll('input[type="file"]');
let hasFiles = false;
fileInputs.forEach(input => {
if (input.files && input.files.length > 0) {
hasFiles = true;
// 파일 입력 필드 값이 제대로 FormData에 들어갔는지 확인
const fieldName = input.name || 'file';
if (!formData.has(fieldName)) {
console.log(`iOS 호환성: 수동으로 ${fieldName} 추가`);
// 수동으로 파일 추가
for (let i = 0; i < input.files.length; i++) {
formData.append(fieldName, input.files[i]);
}
}
}
});
// 디버깅용 로그
console.log('FormData 생성 완료:', hasFiles ? '파일 포함' : '파일 없음');
} catch (error) {
console.error('FormData 생성 오류:', error);
// 대체 방식으로 FormData 생성
formData = new FormData();
// 폼 필드 수동 추가
const formElements = form.elements;
for (let i = 0; i < formElements.length; i++) {
const field = formElements[i];
const name = field.name;
if (!name) continue;
if (field.type === 'file') {
for (let j = 0; j < field.files.length; j++) {
formData.append(name, field.files[j]);
}
}
else if (field.type !== 'submit' && field.type !== 'button') {
formData.append(name, field.value);
}
}
}
// 네트워크 요청 타임아웃 설정
const ajaxTimeout = 60000; // 60초
$.ajax({ $.ajax({
type: getpost || "post", type: getpost || "post",
url: url, url: url,
data: formData, data: new FormData($('#' + fid)[0]),
contentType: false, contentType: false,
processData: false, processData: false,
timeout: ajaxTimeout,
success: function (r) { success: function (r) {
isCaping = false; isCaping = false;
capResult = r; capResult = r;
setcap(); setcap();
// 로딩바 숨김 추가 }, error: function (e) {
hideLoadingImage();
},
error: function (e) {
isCaping = false; isCaping = false;
console.log('Ajax 오류:', e.status, e.statusText);
console.log(e.responseText); console.log(e.responseText);
if (e.status === 0 && e.statusText === 'timeout') { if (_jsislayer2) {
alert("요청 시간이 초과되었습니다. 다시 시도해주세요."); msg2("개발담당자에게 문의해주세요....");
}
else if (_jsislayer2) {
alert("개발담당자에게 문의해주세요");
} }
else { else {
alert("개발담당자에게 문의해주세요."); msg("개발담당자에게 문의해주세요....");
} }
// 로딩바 숨김 추가 }, complete: function () {
hideLoadingImage(); prgstop();
},
complete: function () {
ajaxing(false); ajaxing(false);
// complete에도 로딩바 숨김 추가 (중복 호출 방지를 위해 다른 방법 고려 가능)
hideLoadingImage();
} }
}); });
} }
else { else {
console.log("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요."); alert("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
} }
} }
//function (xhr, textStatus) { //function (xhr, textStatus) {
@ -1125,107 +934,52 @@ function cap(url, formid, callback, getpost, autoMsg, noBG, jsislayer2) {
} }
} }
var _jsislayer2 = false; var _jsislayer2 = false;
function capp(url, p, callback, getpost, autoMsg, noBG, jsislayer2, hideBG, noerror, sync) { function capp(url, p, callback, getpost, autoMsg, noBG, jsislayer2, noclearcomma) {
noclearcomma = noclearcomma || false;
_jsislayer2 = jsislayer2 || false; _jsislayer2 = jsislayer2 || false;
_noerror = noerror || false;
_hideBG = hideBG || false;
// 동기식 요청은 권장되지 않지만, 기존 코드 호환성을 위해 유지
// 단, 경고 메시지 출력
_async = !(sync || false);
if (sync) {
console.warn("동기식 Ajax 요청은 권장되지 않으며 iOS에서 문제를 일으킬 수 있습니다.");
}
if (!isCaping) { if (!isCaping) {
isAutoMsg = autoMsg || false; isAutoMsg = autoMsg || false;
_bging = noBG || false; _bging = noBG || false;
if (!_bging) { if (!_bging) {
prg('');
ajaxing(); ajaxing();
} }
if (_jsislayer2) { if (_jsislayer2) {
prg('2');
bglayer2(); bglayer2();
} }
_callback = callback; _callback = callback;
capResult = null; capResult = null;
capOK = false; capOK = false;
isCaping = true; isCaping = true;
if (!noclearcomma) {
// 기존 함수 호출 유지, 존재 확인 후 실행
if (typeof clearComma === 'function') {
try {
clearComma(); clearComma();
} catch (e) {
console.error("clearComma 함수 실행 오류:", e);
} }
} $.ajax({
// Ajax 요청 설정
const ajaxSettings = {
type: getpost || "post", type: getpost || "post",
url: url, url: url,
data: p, data: p,
async: _async,
timeout: _async ? 30000 : undefined, // 비동기 요청만 타임아웃 설정
success: function (r) { success: function (r) {
isCaping = false; isCaping = false;
capResult = r; capResult = r;
// iOS 호환성을 위한 추가 처리
setTimeout(function () {
setcap(); setcap();
}, 0); }, error: function (e) {
},
error: function (xhr, status, error) {
isCaping = false; isCaping = false;
console.log("Ajax 오류:", status, error); console.log(e.responseText);
if (xhr.responseText) {
console.log("응답 내용:", xhr.responseText);
}
// 타임아웃 오류 별도 처리
if (status === "timeout") {
if (_jsislayer2) { if (_jsislayer2) {
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요."); msg2("개발담당자에게 문의해주세요.");
} else {
alert("요청 시간이 초과되었습니다. 다시 시도해 주세요.");
}
}
else if (!_noerror) {
if (_jsislayer2) {
alert("잠시 후 다시 요청해주세요.");
} }
else { else {
alert("잠시 후 다시 요청해주세요."); msg("개발담당자에게 문의해주세요.");
} }
} }, complete: function () {
}, prgstop();
complete: function () {
// iOS에서의 지연 문제 방지를 위한 setTimeout 사용
setTimeout(function () {
ajaxing(false); ajaxing(false);
}, 0);
} }
}; });
// iOS 특정 버전에서의 캐시 문제 방지
if (navigator.userAgent.match(/(iPad|iPhone|iPod)/g)) {
ajaxSettings.cache = false;
// URL에 타임스탬프 추가하여 캐시 방지
const timestamp = new Date().getTime();
ajaxSettings.url = ajaxSettings.url +
(ajaxSettings.url.indexOf('?') >= 0 ? '&' : '?') +
'_t=' + timestamp;
} }
else {
$.ajax(ajaxSettings); alert("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
}
else if (!_noerror) {
console.log("다른 작업을 처리중입니다. 잠시후 다시 작업해주세요.");
} }
} }