팝업제어 관련 질문 입니다.
본문
<?php //REQUEST001
////////////// XML 요청 데이터를 생성합니다. /////////////
$roomNo = get_text($member['mb_id']);
$userNo = get_text($member['mb_nick']);
$userName = get_text($member['mb_name']);
// 요청 데이터를 생성합니다.
$requestData = '<?xml version="1.0"?>
<REQUEST001>
<YEAR>2022</YEAR>
<ROOM_NO>' . $roomNo . '</ROOM_NO>
<USER_NO>' . $userNo . '</USER_NO>
</REQUEST001>';
// API 서버 URL을 설정합니다.
$url = ' 주소 지웠습니다.';
// cURL 세션을 초기화합니다.
$ch = curl_init();
// cURL 옵션을 설정합니다.
curl_setopt($ch, CURLOPT_URL, $url); // 요청할 URL 설정
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 결과 값을 반환받기 설정
curl_setopt($ch, CURLOPT_POST, true); // POST 요청 설정
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestData); // 요청 데이터 설정
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml; charset=utf-8')); // Content-Type 설정
// cURL 실행 및 결과 값을 받습니다.
$result = curl_exec($ch);
// cURL 세션을 종료합니다.
curl_close($ch);
// 결과 값을 SimpleXMLElement로 파싱합니다.
$xml_data = new SimpleXMLElement($result);
// 파싱된 결과에서 필요한 값을 추출합니다.
$xml_data = simplexml_load_string($result);
//$remaining_totalday = $xml_data->ACCOMMODATION_INFO->REMAINING->TOTALDAY;
$remaining_totalday = intval($xml_data->ACCOMMODATION_INFO->REMAINING->TOTALDAY);
?>
<script>
function show_alert() {
<?php
if ($xml_data->RESULTS->ERR_CD != 'E000') {
switch ($xml_data->RESULTS->ERR_CD) {
case 'E001': $error_message = '유효한 호수 또는 계약자번호가 아닙니다.';
break;
case 'E002': $error_message = '무료숙박 대상 계약자가 아닙니다.';
break;
case 'E003': $error_message = '해지된 계약자입니다.';
break;
case 'E900': $error_message = '데이터베이스 장애입니다.';
break;
case 'E901': $error_message = 'XML 로딩 에러 - 올바른 XML 데이터가 아닙니다.';
break;
case 'E902': $error_message = 'XML 요청타입 에러 - 올바른 요청타입이 아닙니다.';
break;
case 'E903': $error_message = 'XML 데이터 무결성 에러 - 특정 노드의 값이 유효하지 않습니다.';
break;
default: $error_message = '알 수 없는 오류가 발생하였습니다.';
}
echo "var popup = document.getElementById('layer-popup');";
echo "if (popup) { popup.style.display = 'none'; }";
echo "alert('" . $error_message . "');";
echo "return false;";
} else {
if ($xml_data->ACCOMMODATION_INFO->REMAINING->TOTALDAY <= 0) {
echo "alert('죄송합니다. 남은 숙박일수는 0일 남았습니다.\\n숙박예약을 진행 하시려면 T:1533-1234 으로 연락 주십시요.');";
echo "return false;";
} else { ?>
alert('남은 숙박일수는 ' + <?php echo $xml_data->ACCOMMODATION_INFO->REMAINING->TOTALDAY; ?> + '일 남았습니다.');
var popup = document.getElementById('layer-popup');
if (popup) {
popup.style.display = 'block';
}
<?php }
} ?>
}
</script>
위 코드는 파싱을해서 해당 에러 코드 가 E000 이 아니면 팜업창을 실ㅇ행하지 말아야 하는데
걍 열립니다. 미치겠습니다.
또, 잔여 숙박일 수가 0이면 팝업 데신 경고창을 띄우게 했는데, 경고창은 뜨지만 팝업은
또 걍 열립니다.ㅜㅜ
도와 주세요.. 저 지금 40시간째 잠 못자고 .. 오류ㅈ 잡느라..흑...
토큰에러는 14시간 만에 잡았는데... 누가 좀 도와 주세요... !-->
답변 6
if (popup) { popup.style.display = 'none'; }
자바 스크립트에 이런 것이 있나요?
만일 popup 이 존재한다면 popup 을 안 보이게 해라를 의도하신 것 같은데...
이렇게 쓰는 구문을 저는 본 적이 없습니다. 그리고 else 의 경우에는 오류가 터지구요.
자바스크립트에서 대상의 존재여부를 체크할 때는 null 이나 언디파인드로 체크합니다.
제가 주로 쓰는 것은 typeof 가 언디파인드라면 비존재 아니라면 존재입니다.
그래서... 존재한다면의 조건문은 언디파인드를 부정하는 것이죠.
if (typeof popup !== "undefined") { popup.style.display = 'none'; }
popup 이라는 대상이 존재한다면 그 놈을 보이지 않게 하라는 위와 같이 사용합니다.
어 이거 모달이 아니었나요? 요즘 팝업이라고 하면 다 레이어 팝업 즉 모달 팝업을 의미해서요.
모달이 아니라 윈도우 팝업이나 아이프레임 팝업을 사용하면 두 가지 단점이 있습니다.
첫째 모달 안에서 정의한 변수나 함수는 핸들링하기가 쉽습니다.
하지만 아이프레임에서 정의해주는 변수나 함수 또는 엘레먼트를 부모페이지에서 통제한다거나 그 반대 즉 자식에서 부모를 통제하는 경우는 은근히 까다롭습니다.
은근히 까다로운게 아니라 js 내공이 약하신 분은 솔직히 언감생심입니다.
부모페이지와 자식페이지는 동일사이트에 있다면 서로 완벽히 소통될 수 있지만 그 소통방식을 자유자재로 다루기 위해서는 또 하나의 "문지방"을 넘어야 하는 것이죠.
둘째 window.open 이나 window.close 메서드를 사용할 경우 싸구려 조건으로 구성된 단순한 넘겨받기 앱에서는 통제하기가 거의 불가능합니다.
앱에서는 기본이 현재창 이벤트니까요.
그...래...서... 팝업은 모달로 만든는 것입니다.
모달 팝업은 div 에 포지션을 주고 display:block&none 으로만 구성해도 되니까요.
그리고 비슷한 패턴의 구문이 여러개 사용될 경우 함수로 만들어 사용하셔야 편해요.
예를 들어서
function my(a, b) {
var popup = document.getElementById('layer-popup');
popup.style.display = a;
alert(b);
}
위와 같이 함수를 만든 후 아래처럼 사용해야 나의 손과 발과 머리가 명료해 집니다.
my('block', '확인되었습니다')
my('none' '점검이 필요합니다')
가능은 한데 팝업 코드를 봐야 할 것 같아요.
차라리 팝업에 position:absolute 를 주고... display는 그냥 보이게 하면서
1. 팝업이 보이고 싶을 때는 원래 팝업의 top 이 30px 라면...
popup.style.top = "30px";
2. 팝업이 안 보이고 싶을 때는 위로 1000픽셀 쯤 처 올려 버리세요.
popup.style.top = "-1000px";
근데 왜 xml 을 쓰시죠? json 파일로 뿌리거나 js 파일로 뿌리면 세상에 다시 없이 편한데...
잔여일수가 문자로 들어와서 그럴 수도 있습니다.
숫자 1 이 아니라 문자 "1" 로요. Number(잔여일수) 로 바꿔보세요.
my_1 = (error === "E000" && Number(day) > 0);
my_2 = (error !== "E000" && Number(day) < 0);
if (my_1) {
popup.style.display = "block";
}
if (my_2) {
popup.style.display = "none";
alert("경고창');
}
에고
<?php echo json_encode($xml_data->RESULTS->ERR_CD) ?> === "E000"
는 아래처럼요. 변수가 아니라 문자열이 들어오는데 따옴표 처리 안해 주면 망망대망합니다.
"<?php echo json_encode($xml_data->RESULTS->ERR_CD) ?>" === "E000"
또는
String("<?php echo json_encode($xml_data->RESULTS->ERR_CD) ?>") === "E000"
포지션으로 되면 그냥 그걸루 쓰세요^^.