Javascript

[크로스브라우징] chrome과 safari 브라우저의 호환성 이슈

허미룡 2023. 8. 16. 10:25

크로스브라우징 테스트에서 Safari 브라우저의 호환성 확인 및 조치

 

location.reload

 

windows에서는 location.reload를 화면 새로고침으로 인식하지만 safari에서는 url클릭 + enter로 인식

쿼리스트링을 포함한 get방식이라면 상관없으나 백단을 통해 데이터를 주고 받는 경우라면 location.reload 사용시 데이터가 유실되는 문제 발생

 

🟥 : 등록된 파일을 삭제하면 바로 ajax로 DB에 저장된 파일을 지우고 페이지를 reload. 페이지가 다시 load되면 서버에서 넘겨받은 데이터가 유실되어 세팅되지 않는 이슈 발생

 

🟨..? :

해결방법을 못찾아서 그냥 목록으로 화면 전환을 시켜버렸는데.. 방법 좀 알려주세요 ..

 

window.history.back

 

사파리,파이어폭스(Safari, Flrefox) 브라우저에서는 동일 세션에서 이전 페이지를 빠르게 로딩하기 위하여 BFCache( Back-Foward-Cache ) 기능을 이용하여 이전에 저장한(캐싱) 데이터를 바로 로드하고 있음

이 때, 서버단에서 데이터 처리 및 화면 구성이 끝나는 페이지이 경우는 상관없지만

window.onload 나 $(document).ready() 단계에서 ajax로 데이터를 조회하는 로직이 있는 경우에 이슈가 될 수 있음

 

🟩 :

//Javascript
window.onpageshow =  function(event) { // BFCahe
	if (event.persisted) {
		window.location.reload();
	}
}

//Jquery
$(window).bind("pageshow", function(event) {
	if ( event.originalEvent && event.originalEvent.persisted) { // BFCahe
		window.location.reload();
	}
});

→ 페이지가 캐시되었을 때 강제로 새로고침

 

onload : 페이지가 캐시에서 로드될 때는 발생하지 않음

onpageshow : 페이지가 로드될 때 무조건 발생

persisted : 페이지가 캐시되었을 경우 true, 아닌 경우 false를 반환

 

$().clone()

clone 자체는 정상작동. 하지만 input[type='file']인 경우 등록된 파일이 복제되지 않음

 

🟥 :

form에 row를 추가하여 각각의 row에 파일을 등록하고자 함
팝업에서 row를 추가하여 다중 파일을 등록하고 저장 버튼을 누르면 저장할 준비 완료

(X 버튼을 누르면 등록되거나 변경된 파일을 이전으로 복구)

 

이를 위해 팝업에서 저장 버튼을 누르면 display : none으로 팝업에 등록된 파일을 복제하여 form에 넣어주고

form에서 열기 버튼을 누르면 form 안에 등록된 파일을 팝업안에 채워줌

 

🟩 :

// div를 통으로 복제할 것이기 때문에 일단 clone해주기
var tx = $('#modalFilePop').find('.modal-body').find('.filediv').clone();

$('#procTable > tbody > tr:eq('+tableIdx+')').find('.pre-parent').html(tx);

// safari 브라우저인지 체크
var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);

if (isSafari) {
	//팝업에 등록된 파일 전체
	var popupFile = $('#modalFilePop').find('.modal-body').find('.filediv').find('input[name=fileInfo]');

    var i = 0;
    if(popupFile.length > 0){
        const fileform = Array.from(popupFile);
        Array.from(fileform)
            .forEach(file => {
				// 같은 name을 가진 input이 여러개이므로 배열로 접근
            	$('#procTable > tbody > tr:eq('+tableIdx+')').find('.pre-parent').find("input[name=fileInfo]")[i].files = file.files;
                i++;
        });
    }
}

개별 파일을 꺼내 해당 row에 등록 file을 수동으로 넣어줌

동일한 방식으로 form 의 file 데이터를 팝업에 수동으로 넣어줌

 

tableIdx : 팝업에 등록된 파일을 넣어줄 row number

files : input태그로 선택한 파일의 목록 조회 가능

 

브라우저 체크

navigator.userAgent : 브라우저 정보를 검사

 

safari 확인 정규식 : */^((?!chrome|android).)safari/i

  →  "chrome" 또는 "android"이라는 문자열이 포함되지 않은 경우에만 "safari"라는 문자열을 포함하는지 검사

 

크롬의 경우 navigator.userAgent로 출력시에 safari 가 같이 표시되기 때문

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36