팝업제어 관련 질문 입니다.

팝업제어 관련 질문 입니다.

QA

팝업제어 관련 질문 입니다.

본문


 
<?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 이라는 대상이 존재한다면 그 놈을 보이지 않게 하라는 위와 같이 사용합니다.

비타주리님.. 답변 감사합니다.
그리고. 죄송합니다. 제가 아직 초급이라 계속 공부를 하는중 입니다. 나이 먹고 하려니 쉽지 않네요.
트랜드도 잘 파악이 안되고, 용어도 아직도 맞설고..
말씀해 주신 내용을 새벽에 곰곰히 파악해 보고 풀리지 않아서 이제야.. 답글을 올려요.
거의 40시간정도를 깨어 있다 보니 미몽사몽 이어서...
해결방법은 항상 있는데, 시간이 좀 걸릴 뿐 입니다.
다시 한 번 답글 주셔서 고맙습니다.^^
좋은 하루 되세요~

아.. popup 보다는 Modal 을 쓰는게 낫다고 하는데, 팝업창 잠김현상 때문 인가요?

 

어 이거 모달이 아니었나요? 요즘 팝업이라고 하면 다 레이어 팝업 즉 모달 팝업을 의미해서요.

모달이 아니라 윈도우 팝업이나 아이프레임 팝업을 사용하면 두 가지 단점이 있습니다.

 

첫째 모달 안에서 정의한 변수나 함수는 핸들링하기가 쉽습니다.

하지만 아이프레임에서 정의해주는 변수나 함수 또는 엘레먼트를 부모페이지에서 통제한다거나 그 반대 즉 자식에서 부모를 통제하는 경우는 은근히 까다롭습니다.

은근히 까다로운게 아니라 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' '점검이 필요합니다')

명쾌한 답변 고맙습니다.  부끄럽습니다.
얕은 지식으로 겉 핥기만 한 기분 입니다.
열공 하겠습니다.

그런데 제가 처음 질문 드렸던 코드는 실행 불가 이겠죠?
너무 답이 안나와서  ChatGPT 에 물어고 여기 저기서 응용을 해서 만든건데...
한심해 지네요...

가능은 한데 팝업 코드를 봐야 할 것 같아요.

차라리 팝업에 position:absolute 를 주고... display는 그냥 보이게 하면서

 

1. 팝업이 보이고 싶을 때는 원래 팝업의 top 이 30px 라면...

 

popup.style.top = "30px";

 

2. 팝업이 안 보이고 싶을 때는 위로 1000픽셀 쯤 처 올려 버리세요.

 

popup.style.top = "-1000px";

 

헐~~ 천잰데요!@@!
ㅎㅎ

xml 파싱은  http 사이트 ip 가 DB 를 가지고 있는 서버에 request 를 보내면 등록된 ip 만 응답해주는 방식입니다.
그러면, 결과값 들 중에 에러코드 들 중 'E000' 과 '잔여일수 >0'  의 2가지 조건이면, 'layer-popup' 을 호출해서 팝업을 띄우고 진행 끝!
그 외의 조건,  에러코드 'E000' + '잔여일수 < 0'  이면  'layer-popup' 을 호출 하지 않고 에러코드의 내용만 '경고창' 띄우고 끝!

이런 쿨~한 장면을 예상했는데................

아래는 layer-pop 입니다.


<div class="popup" id="layer-popup" tabindex="-1" role="dialog" aria-hidden="true">
    <span class="popup-close pull-right" onclick="document.getElementById('layer-popup').style.display = 'none'">
        <img src="<?= $G5_PATH ?>/img/btn_close.png">
        <div class="lr">
            <div class="rl">

            </div>
        </div>
    </span>

<form name="fwrite" method="post" onSubmit="return submitChk(this)">
        <input type=hidden name=sca value="<?= $sca ?>">
        <div id="iyke_form">
.
.
.
생략
.
.
.
<script language="javascript">
                function submitChk(f) {
                    f.action = "../form_ok.php";
                    return true;
                }
            </script>
   </div>
    </form>
    

 

근데 왜 xml 을 쓰시죠? json 파일로 뿌리거나 js 파일로 뿌리면 세상에 다시 없이 편한데...

그러면, 결과값 들 중에 에러코드 들 중 'E000' 과 '잔여일수 >0'  의 2가지 조건이면, 'layer-popup' 을 호출해서 팝업을 띄우고 진행 끝!


이하 오타 입니다. 죄송요.

그 외의 조건,  에러코드 'E000' 이외의 코드 + '잔여일수 < 0'  이면  'layer-popup' 을 호출 하지 않고 에러코드의 내용만 '경고창' 띄우고 끝!

잔여일수가 문자로 들어와서 그럴 수도 있습니다.

숫자 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("경고창');

}


<script>
    var my_1 = (<?php echo json_encode($xml_data->RESULTS->ERR_CD) ?> === "E000" && Number('<?php echo $xml_data->ACCOMMODATION_INFO->REMAINING->TOTALDAY; ?>') > 0);
    var my_2 = (<?php echo json_encode($xml_data->RESULTS->ERR_CD) ?> !== "E000" && Number('<?php echo $xml_data->ACCOMMODATION_INFO->REMAINING->TOTALDAY; ?>') < 0);

    var popup = document.getElementById('layer-popup');

    if (my_1) {
        popup.style.display = "block";
    }

    if (my_2) {
        popup.style.display = "none";
        var error_message;

        switch (<?php echo json_encode($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 = '알 수 없는 오류가 발생하였습니다.';
        }

        if (popup) {
            popup.style.display = 'none';
        }

        alert(error_message);
        return false;
    }
</script>


이렇게 다시 만들었는데.... 어떨런지요?

에고

 

<?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"

 

포지션으로 되면 그냥 그걸루 쓰세요^^.

음... 안되네요. 그냥 팝업이 뜨네요. 그전엔 에러메세지 경고창이라도 나왔는데, 이젠

당당하게 그냥 팝업이 뙇!!!!

알려 주신 두 가지모두( String 방법) 으로 돌리는것 까지 해 봤는데 그냥 당당하게 뙇!!!!!!

ㅡㅡ; 미안해서 계속 여쭤 볼 수가 없네요. 

여러가지 조언도 방법도 기본적인 것 까지.. 고맙습니다.

답변을 작성하시기 전에 로그인 해주세요.
전체 516 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT