이웃집 사는 몽씨 (43)

반응형

 

[javascript] 모바일SMS 문자 보내기

 

해당 기능은 문자를 보내는 방법이라기보다는 사용자가 내가 지정한 번호와 문구로 문자를 보낼 수 있도록 
문자 화면으로 이동시켜주는 기능에 가깝습니다.

단순하게 공유하기 기능으로 작업하면 되겠다고 생각하고 작업을 했었는데,
세상의 모든 핸드폰은 안드로이드와 아이폰으로 나뉘어있다는 사실을 잠시 망각했었죠. (...)
내 폰(안드로이드)에서는 잘만 되는데 아이폰에서는 왜 그렇게 안 되던지.

보내는 기능에 앞서, 접속해오는 유저가 아이폰 유저인지 안드로이드 유저인지 확인부터 하는 작업을 거쳐야 합니다.

 

function checkMobile(){
	var varUA = navigator.userAgent.toLowerCase(); //userAgent 값 얻기
	if ( varUA.indexOf('android') > -1) {
		//안드로이드
		return "android";
	} else if ( varUA.indexOf("iphone") > -1||varUA.indexOf("ipad") > -1||varUA.indexOf("ipod") > -1 ) {
		//IOS
		return "ios";
	} else {
		//아이폰, 안드로이드 외
		return "other";
	}
}

 

해당 스크립트로 유저를 구분 짓는 것까지 완료되었다면 문자 보내는 기능부터 만들어야겠죠.
html 안에 class명이 btn이란 버튼이 있다 가정하고 아래 스크립트를 추가해줍니다.

 

const btn = document.querySelector('.btn');
btn.addEventListener('click', function() {
	checkM(checkMobile());
});

function checkM(m){
	location.href = 'sms:' +'전화번호'+(m == 'ios' ? '&' : '?') + 'body='+ encodeURIComponent("보낼 내용");
}

 

해당 스크립트를 적어주면 안드로이드에서도 아이폰에서도 사용되는 기능이 적용됩니다.

안드로이드와 아이폰이 location.href에서 각각 어떻게 다른지는 아래 내용에서 참고 부탁드립니다.

 

// 안드로이드
location.href = sms:받을번호?body=보낼메세지;

// 아이폰
location.href = sms:받을번호&body=보낼메세지;

 

* 참고 사이트 : https://justbobby.tistory.com/20 , https://justbobby.tistory.com/21

반응형
반응형

예전 블랙 프라이데이 때, 어도비 클라우드 서비스를 구매하게 되고 1년간 잘 쓰다가 서비스 연장을 해야될 시기가 와서 하는 수 없이 자주 쓰는 포토샵과 일러스트 두 개를 각각 사용료를 내고서 사용하고 있던 중, 어도비 블랙 프라이데이가 다시 시작되서 차라리 가격이 같다면 블랙 프라이데이로 갈아타자는 생각이 들었다. 

 

(포토샵, 일러스트까지 합쳐서 4만 8천원쯤이었고 블랙프라이데이로 어도비 클라우드 서비스가 4만 7천원 정도였으니까)

 

무작정 아무 생각 없이 일러스트를 어도비 클라우드 서비스로 플랜을 바꾸고 포토샵을 플랜 해지를 하려고 보니 위약금이 12만원인가 나오는게 아닌가.

 

당황해서 우선 중단하고 뭐 이렇게 많이 나오는가 싶어서 서치를 해보니, 어도비에서 위약금으로 악명이 어마어마하다는 사실을 그 때서야 알았다. 아니 아무리 그래도 십얼마는 너무 하잖아. 클라우드 서비스를 구매한 마당에 포토샵을 이미 쓸 수 있는 나로써는 포토샵을 또 돈을 내야한다는 게 납득이 안 되서 어도비 코리아 고객센터에 자초지종이라도 설명해볼까 싶었지만.. 어도비 코리아에 대한 서치들을 읽어보니, 위약금은 무조건 내야한다는 식으로만 답이 온다는 내용들에 문의해봤자 소용이 없겠구나 하는 생각부터 들었다. (망했네) 

 

어쩌지, 어쩌지 하면서 애꿎은 발만 동동 구르다가 우선 클라우드 서비스부터 취소하자라는 생각에 취소버튼을 눌렀는데... 어라? 위약금이 나오지 않았다. 뭐지, 싶어서 확인해보니 내가 당일에 플랜을 바꾸고 당일에 취소를 한 것이, 바뀐 플랜은 신규건으로 등록 되어 취소하는 것이기 때문에 위약금이 나오지 않는 것이었다. (유레카)

 

우선 침착하게 클라우드 서비스를 취소했고 (어차피 위약금 안 나오니까) 재빠르게 포토샵을 클라우드 서비스로 플랜을 변경하니 위약금 없이 클라우드 서비스로 갈아탈 수 있었다. 

 

신용카드로 결제했기 때문에 취소처리는 이틀 뒤에나 확인해볼 수 있어서 마음을 내려놓고 기다려보니 다행히 위약금에 대한 내용은 없었다. 천몇백원 내라는 내역이 2건 남아있긴 했는데 이게 취소했을 때 내는 취소금? 인 것 같았다. (2번 플랜 취소를 했으니까.) 위약금 12만원을 봤던 나로써는 이정도 취소금도 그렇게 아깝진 않았다. 그래, 차라리 취소금이 낫지, 가져가라. 가져가.

 

어쨌든 어도비를 계속 써야하는 내 입장에서는 앞으로 클라우드 서비스는 공부하는데 필요하기도 하고 디스카운트가 1년까지니까 그 이후에는 다시 포토샵과 일러스트로 재등록을 해야 될 테니, 어찌보면 쫄려가며 몸으로 부딪힌 꿀팁을 얻은 셈이었다. 

반응형
반응형

[Tip] magnific popup을 iframe 안에서 열었을 시 문제점

 

 

제 포스팅에 자주 나와서 짐작하고 계시겠지만 

전 magnific popup을 실무에서 자주 사용하는 편입니다. 

 

반응형 팝업이란 장점 뿐만 아니라 유튜브(비디오) 팝업, 갤러리 형식, 모달까지 구현되는

편리한 점들이 많아서 자주 애용하고 있는데,

iframe 안에 플러그인 팝업을 띄우는 상황에서 문제점을 확인하였습니다. 

 

 

 

 

 

일반 페이지에서는 팝업이 자동적으로 높이를 측정하여 중앙에 팝업을 띄우는데,

iframe 안에서는 팝업이 자동적으로 높이를 측정할 수 없어 

팝업이 화면 중앙이 아닌 하단에 위치되거나 상단에 위치되거나 

그도 아니면 중앙이 아닌 부분에 위치하는 난감한 상황이 벌어지게 됩니다.

 

열심히 구글링을 하고 삽질을 하면서 겨우 찾아낸 방식은 아래와 같습니다.

 



$('클래스명').magnificPopup
  callbacks:
    open: resizeThumbnailViewer
    imageLoadComplete: resizeThumbnailViewer

resizeThumbnailViewer = ->
  $('.mfp-wrap').css({top: viewport.scrollTop(), height: viewport.height()})
  $('.mfp-img').css({'max-height': viewport.height()})

 

위 내용으로 적용하니 iframe 안에서도 중앙 정 가운데에 뜨는 것을 확인할 수 있었습니다.

혹시 몰라 하단에 출처도 남깁니다.

 

 

* 참고 : https://github.com/dimsemenov/Magnific-Popup/issues/728

 

반응형
반응형

[Tip] checkbox 초기화하기



모바일에서의 햄버거 메뉴를 구현 하는 중, 다른 페이지로 이동했다가 모바일에서 뒤로 가기를 하면 

햄버거 메뉴가 자동적으로 열리는 오류가 있었습니다.

페이지가 이동하면서 checkbox에 checked가 초기화되지 않고 자동적으로 checked되었기 때문에 발생한 오류였는데요. 

checked를 풀기 위해서는 페이지가 열릴 때마다 checkbox를 초기화하는 작업이 필요했습니다. 

꽤 여러 삽질을 거쳤는데요;; 제 경우는 아래 세 경우를 모두 적용하고 나서야 해당 오류에서 벗어날 수 있었습니다.





혹시 몰라 적용된 예시도 올려두겠습니다. 

(해당 내용은 두번째 방법을 제외한 내용이 들어 있습니다.)




1/ 별도 js 스크립트에서 초기화 내용 넣기


window.onpageshow = function(event) {
    if ( event.persisted || (window.performance && window.performance.navigation.type == 2)) {
	var chk = $("#menu__toggle").is(":checked");
	if(chk) {$("#menu__toggle").prop("checked", false).attr("checked", false).removeAttr("checked");}
    }
};



2/ index.html에 넣기 (jquery 사용)


<script>
function uncheck(){
	$(':checkbox:checked').prop('checked',false);
};
</script>
<body onLoad="uncheck()">


3/ autocomplete="off"를 넣기


<input type="checkbox" autocomplete="off">


* 첫번째 방법 참고 사이트 : https://dev-t-blog.tistory.com/9 , http://amabile29.blog.me/221548195341

* 두번째 방법 참고 사이트 : https://itbloger.tistory.com/1019

* 세번쨰 방법 참고 사이트 : http://triki.net/prgm/126

* 햄버거 메뉴 참고 사이트 : https://codepen.io/andreykrokhin/pen/mGEqja

반응형
반응형

 


 

[Visual Inspector] 디자이너를 위한 툴 비주얼 인스펙터 (Visual Inspector)


크롬을 쓰다보면 필요한 프로그램을 크롬에 직접 설치하여 쓰는 경우가 많은데,

이러한 확장 프로그램들을 쓰다보면 용량만 차지하고 쓰지는 않는 프로그램들이 있는 반면에,

편리하게 실무에서 자주 쓰게 되는 확장 프로그램들이 생기기 마련입니다.

 

비주얼 인스펙터 (Visual Inspector)가 바로 그런 프로그램인데요,
비주얼 인스펙터는 디자인 분석 툴로 웹 사이트에 적용된 위치, 불투명도, 색상, 그라디언트, 타이포 그래피 등의

구성요소를 빠르고 간편하게 확인할 수 있는 아주 편리한 툴입니다.

소개글로 디자이너가 디자인을 위해 제작되었다고 해도 과언이 아닌데요.

 

먼저 크롬에서 아래 URL로 접속하여 해당 확장 프로그램을 다운로드, 설치해줍니다.
https://chrome.google.com/webstore/detail/visual-inspector/efaejpgmekdkcngpbghnpcmbpbngoclc?hl=ko

 

 

설치가 완료되면 우측에 하늘색 눈 모양의 작은 아이콘이 생기는데,
네이버로 들어가서 해당 창을 열어보도록 하겠습니다.

 

 

창을 열고 네이버 로고를 클릭하니, 해당 위치가 한 눈에 보기 쉽게 표시가 되는데요,
(창 외의 부분은 프로그램 내에서 어두워지는 게 아니라 보기 편하게끔 제가 임의로 처리하였습니다.)

 

 

 

 

이런 식으로 위치가 확인이 가능할 뿐만아니라 각 탭에서
해당 페이지에 대한 정보를 손 쉽게 확인할 수 있고 또 변형하는 것도 가능합니다.
(변형을 한다해서 해당 페이지에 실질적으로 영향을 주지는 않습니다.)

 

 

 

 

색상 코드 확인은 물론 폰트 관련 정보도 손쉽게 알 수 있어 페이지를 서치할 때 큰 도움이 됩니다.
또한 페이지에 쓰이고 있는 이미지도 Export 버튼으로 손쉽게 다운로드도 가능합니다.

반응형
반응형

 

[javascript] 현재 시간 select로 잡기


시간을 select로 직접 선택할 수 있게끔 하는 방법도 있지만 select를 이미 현재 시간으로 선택 되게끔

설정하는 방법도 있습니다. 먼저 html에 해당 내용을 넣어주세요.



<select class="hour"></select>시
<select class="minute"></select>분
<script src="https://code.jquery.com/jquery-3.5.1.min.js"><script>


그리고 각 select에 들어갈 소스를 <script></script> 사이로 아래 내용을 넣어주세요.


 

var html = '';
for (var i = 0; i < 60; i++) {
  html += "<option value = '" + i + "' >" + i + "</option>";
}
$('.minute').append(html);

var htm = '';
for (var j = 0; j < 24; j++) {
  htm += "<option value = '" + j + "' >" + j + "</option>";
}
$('.hour').append(htm);




이렇게 하면 option값을 별도로 넣지 않아도 option 값이 자동으로 들어가는데요, 

여기에 이제 현재 시간을 자동적으로 선택할 수 있게끔 소스를 수정해줍니다. 



 

var html = '';
for (var i = 0; i < 60; i++) {
  html += "<option value = '" + i + "' >" + i + "</option>";
}
$('.minute').append(html);
var d = new Date();
var n = d.getMinutes();
$(".minute").val(n);

var htm = '';
for (var j = 0; j < 24; j++) {
  htm += "<option value = '" + j + "' >" + j + "</option>";
}
$('.hour').append(htm);
var dt = new Date();
var h = dt.getHours();
$(".hour").val(h);

$(".hour option").filter(function() {
    //may want to use $.trim in here
    return $(this).text() == h;
}).attr('selected', true);

$(".minute option").filter(function() {
    //may want to use $.trim in here
    return $(this).text() == n;
}).attr('selected', true);



위 소스를 넣고 화면에 구현해보면 현재 시간에 셀렉트가 맞게 들어가있는 것을 확인하실 수 있습니다. 




반응형
반응형


[typed.js] 부트스트랩 캐러셀의 타이핑 효과넣기


이 내용을 알게 된 지 벌써 2년이나 지났는데 게으름을 피우다가 이제야 내용을 정리해서 올리네요.. 

문의할 곳이 없어서 정말 다급하게 동앗줄 잡는 심정으로 카페 문의글로 올렸었는데 

친절한 답변과 함께 꼼꼼한 첨부파일까지 올려주신 '기소기'님, 다시 한번 감사합니다. 


* 해당 답변을 받았던 카페글 : https://cafe.naver.com/hacosa/221591






부트스트랩의 캐러셀 (http://bootstrapk.com/javascript/#carousel)을 사용하는 중에 

안에 들어가는 글자를 타이핑효과가 나게끔 넣어야하는 부분이 있었는데요.


 여기서 중요한 건 타이핑 뿐만 아니라 타이핑이 다 끝난 후에 (글씨가 다 작성된 후에) 

슬라이더가 옆으로 이동하게 만들어야하는 부분에 있었습니다.



https://github.com/mattboldt/typed.js/


타이핑 효과가 나는 플러그인은 위 URL에서 다운 받았습니다.

기본적으로 세팅해야할 소스는 제이쿼리, 부트스트랩, 그리고 타이핑 플러그인, 이렇게 세팅 먼저 해주셔야합니다.





<!-- 제이쿼리 -->
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<!-- 부트스트랩  -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<!-- 타이핑 플러그인 -->
<script src="https://cdn.jsdelivr.net/npm/typed.js@2.0.11"></script>



해당 소스들을 세팅해주시고 html에 캐러셀 소스를,
css에는 캐러셀에 넣을 스타일을 넣어주세요.







<div id="carousel-example-generic" class="carousel slide" data-ride="carousel" data-interval="false">
  <!-- Wrapper for slides -->
  <div class="carousel-inner" role="listbox">
    <div class="item active">
      <div class="item_bg"></div>
	  <div class="carousel-caption">
		<span class="typing"></span>
      </div>
    </div>
    <div class="item">
      <div class="item_bg"></div>
	  <div class="carousel-caption">
		<span class="typing"></span>
      </div>
    </div>
    <div class="item">
     <div class="item_bg"></div>
	  <div class="carousel-caption">
		<span class="typing"></span>
      </div>
    </div>
  </div>
  <!-- Controls -->
  <a class="left carousel-control" href="#carousel-example-generic" role="button" data-slide="prev">
    <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
    <span class="sr-only">Previous</span>
  </a>
  <a class="right carousel-control" href="#carousel-example-generic" role="button" data-slide="next">
    <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
    <span class="sr-only">Next</span>
  </a>
</div>






ul,li {
	list-style:none;
	margin:0px;
	padding:0px;
}
.item_bg {
  background-color:#757575;
  height:200px;
}
.carousel-caption {
  padding-top:0px;
  padding-bottom:60px;
}
#typed,#typed2,#typed3 {
	font-size:25px;
	color:#fff;

}
.typing {
	font-size: 20px;
}
.typing::after {
	content: '|';
	display: inline;
	-webkit-animation: blink 0.7s infinite;
	-moz-animation: blink 0.7s infinite;
	animation: blink 0.7s infinite;
}
.typing-cursor{
   opacity: 0;
	display: none;
}
@keyframes blink{
	0% { opacity:1; }
	50% { opacity:0; }
	100% { opacity:1; }
}
@-webkit-keyframes blink{
	0% { opacity:1; }
	50% { opacity:0; }
	100% { opacity:1; }
}
@-moz-keyframes blink{
	0% { opacity:1; }
	50% { opacity:0; }
	100% { opacity:1; }
}





마지막으로 javascript를 넣고 마무리해주시면 됩니다. 






$(function(){

	var carouselWrap = $('#carousel-example-generic'),
		 typedTxtArr = [
			'First Carousel Text',
			'Second Carousel Text',
			'Third Carousel Text'
		 ],
		 typed, typedObj;	

	var typedFunc = function( a, b ) {
		typed = new Typed(a[0], {
			strings: [
				typedTxtArr[ b ]
			],
			stringsElement: null,
			typeSpeed: 70,
			startDelay: 1000,
			smartBackspace: false,
			backSpeed: 60,
			backDelay: 5000,
			loop: true,
			loopCount: 5,
			showCursor: false,
			cursorChar: "|",
			attr: null,
			contentType: 'html',
			callback: function() {},
			preStringTyped: function() {},
			onStringTyped: function() {
				setTimeout(function(){
					carouselWrap.carousel('next');
				}, 1000);
			},
			resetCallback: function() {},
			onReset: function(self) { 
				
			}
		});
	}

	carouselWrap.on('slid.bs.carousel', function () {
		var idx =$(this).find('.active').index(),
			 typedObj = $('.typing').eq( idx );
			 typed.destroy();
			 typedFunc( typedObj, idx );
	});
	
	// init
	typedFunc( $('.typing').eq(0), 0); 

});




반응형
반응형

[Tip] tab(탭)에 카카오맵 api 지도 여러개 넣기


부트스트랩 탭에 지도(카카오맵 api)를 여러개 넣어야하는 작업이 있었는데, 

하나 넣었던 때처럼 단순히 넣으면 제대로 구현되겠다고 생각했는데 막상 해보니 

생각처럼 단순한 게 아니었습니다.


열심히 삽질을 하고 구글링을 반복하던 끝에 다행히 구현할 수 있었는데,

먼저 하나씩 단계를 밟아가며 설명 드리겠습니다.


 부트스트랩 탭을 세팅합니다. 

 (제가 구현한 탭은 총 4가지입니다.)




<div class="tab">
	<ul class="nav nav-tabs" role="tablist" id="myTab">
		<li role="presentation" class="active"><a href="#place1" aria-controls="place1" role="tab" data-toggle="tab">장소1</a></li>
		<li role="presentation"><a href="#place2" aria-controls="place2" role="tab" data-toggle="tab">장소2</a></li>
		<li role="presentation"><a href="#place3" aria-controls="place3" role="tab" data-toggle="tab">장소3</a></li>
		<li role="presentation"><a href="#place4" aria-controls="place4" role="tab" data-toggle="tab">장소4</a></li>
	</ul>
	<div class="tab-content">
		<div role="tabpanel" class="tab-pane active" id="place1">
		<!--장소 1 지도가 들어갈 자리-->
		</div>
		<div role="tabpanel" class="tab-pane" id="place2">
		<!--장소 2 지도가 들어갈 자리-->
		</div>
		<div role="tabpanel" class="tab-pane" id="place3">
		<!--장소 3 지도가 들어갈 자리-->
		</div>
		<div role="tabpanel" class="tab-pane" id="place4">
		<!--장소 4 지도가 들어갈 자리-->
		</div>
	</div>
</div>

ul.nav-tabs에 있는 li > a의 href, aria-controls와  .tabpanel의 id값의 이름을 같게 맞춰줍니다.
그리고 카카오 개발자 센터에서 카카오맵 api(http://apis.map.kakao.com/)에서
생성한 키를 가져오는데, 

(가져오는 방법은 URL 참고 : http://apis.map.kakao.com/web/guide/#ready)

주석 처리한 공간에 지도를 담을 영역을 만들어줍니다.


<div class="tab-content">
	<div role="tabpanel" class="tab-pane active" id="place1">
	<div class="map" id="map1"></div>
	</div>
	<div role="tabpanel" class="tab-pane" id="place2">
	<div class="map" id="map2"></div>
	</div>
	<div role="tabpanel" class="tab-pane" id="place3">
	<div class="map" id="map3"></div>
	</div>
	<div role="tabpanel" class="tab-pane" id="place4">
	<div class="map" id="map4"></div>
	</div>
</div>

그리고 각각의 script에 아래 내용을 넣어줍니다.

(원하는 위치의 위도, 경도를 모를 경우는 https://support.google.com/maps/answer/18539?co=GENIE.Platform%3DDesktop&hl=ko

해당 URL에서 장소의 좌표 구하기의 내용을 참고하세요)




/* place1의 지도 */

var mapContainer1 = document.getElementById('map1'),
    mapOption1 = {  
        center: new kakao.maps.LatLng(원하는 위치의 위도, 경도),
        level: 3
    };
var map1 = new kakao.maps.Map(mapContainer1, mapOption1);
var markerPosition1  = new kakao.maps.LatLng(원하는 위치의 위도, 경도); 
var marker1 = new kakao.maps.Marker({
    position: markerPosition1
});
marker1.setMap(map1);

/* place2의 지도 */
    
var mapContainer2 = document.getElementById('map2'),
    mapOption2 = { 
        center: new kakao.maps.LatLng(원하는 위치의 위도, 경도),
        level: 3
    };
var map2 = new kakao.maps.Map(mapContainer2, mapOption2);
var markerPosition2  = new kakao.maps.LatLng(원하는 위치의 위도, 경도); 
var marker2 = new kakao.maps.Marker({
    position: markerPosition2
});
marker2.setMap(map2);

/* place3의 지도 */

var mapContainer3 = document.getElementById('map3'),
    mapOption3 = { 
        center: new kakao.maps.LatLng(원하는 위치의 위도, 경도),
        level: 3
    };
var map3 = new kakao.maps.Map(mapContainer3, mapOption3);
var markerPosition3  = new kakao.maps.LatLng(원하는 위치의 위도, 경도); 
var marker3 = new kakao.maps.Marker({
    position: markerPosition3
});
marker3.setMap(map3);

/* place4의 지도 */

var mapContainer4 = document.getElementById('map4'),
    mapOption4 = { 
        center: new kakao.maps.LatLng(원하는 위치의 위도, 경도),
        level: 3
    };
var map4 = new kakao.maps.Map(mapContainer4, mapOption4);
var markerPosition4  = new kakao.maps.LatLng(원하는 위치의 위도, 경도); 
var marker4 = new kakao.maps.Marker({
    position: markerPosition4
});
marker4.setMap(map4);


이렇게 하고 완료! 하면 좋았겠지만 여기까지 하고 나면
탭을 이동시킬 때마다 위치를 표시해주는 마커가
사라지는 현상이 자꾸 발생됩니다. 

그럴 때는 당황하지 말고
아래 소스를 추가해서 넣어주세요.




$('#myTab a').click(function (e) {
  e.preventDefault()
  $(this).tab('show');
  setTimeout(function(){
	  map2.relayout();
	  map2.setCenter(new daum.maps.LatLng(두번째 탭 지도 위치와 경도));
	  map3.relayout();
	  map3.setCenter(new daum.maps.LatLng(세번째 탭 지도 위치와 경도));
	  map4.relayout();
	  map4.setCenter(new daum.maps.LatLng(네번째 탭 지도 위치와 경도));
	}, 0);  
});



* 참고 사이트 :

https://devtalk.kakao.com/t/topic/57949

https://brunch.co.kr/@ourlove/79

반응형
반응형

[Tip] 크롬에서 현재 창 닫기 (window.close)


기획 사항 중에 버튼을 클릭시 보고 있는 창(현재 창)을 닫게 해달라는 요청으로 

자바스크립트의 window.close를 쓰면 되겠다고 생각하고 진행을 하던 중, 크롬에서 해당 소스가 먹히지 않는 상황이있었습니다. 


왜 안 되지 하고 삽질을 하던 중, 이 이슈가 생각보다 오래 전부터 있었던 이슈라는 것도 발견하게 되었습니다. 


https://stackoverflow.com/questions/19761241/window-close-and-self-close-do-not-close-the-window-in-chrome


(글 올려진 때가 2013년이면 .... 지금이 2020년이니까 7년 전이네요. 이런 뒷북이.. )


올려진 답안지를 해보다가 안 된다면서 다른 예제를 찾으러 돌아다니고 괜한 삽질하다보니 다행히도 해결방안을 찾게 됐는데요. 

너무 단순해서 허무할 정도였네요. 그래도 해결 됐으니 다행!



<a href="javascript:close();">창 닫기</a>
<script>
function close()
 {
  window.open('','_self').close(); 
}
</script>

 * 참고사이트
https://hyxn.tistory.com/4


반응형
반응형


[javascript] input 이메일 유효성 체크 



이메일을 작성하는 input란에 내용을 넣을 때, 이메일이 형식에 맞게 작성되어있는 지 

확인할 수 있도록 input 아래에 에러 메세지를 넣어달라는 요청이 있었습니다. 


먼저 <head></head> 사이에 jquery 플러그인을 넣어주시고 

그 다음 html 안에 내용을 작성합니다.



<input type="email" placeholder="이메일" name="mail" id="mail" maxlength="30">
<div id="error_mail" class="result-email result-check"></div>


내용을 다 작성하였다면 다음은 javascript  차례인데요, 

</body> 전에 아래 스크립트를 작성합니다.



function email_check( email ) {    
    var regex=/([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
    return (email != '' && email != 'undefined' && regex.test(email)); 
}

$("input[type=email]").blur(function(){
  var email = $(this).val();
  if( email == '' || email == 'undefined') return;
  if(! email_check(email) ) {
  	$(".result-email").text('이메일 형식으로 적어주세요');
    $(this).focus();
    return false;
  }else {
	$(".result-email").text('');
  }
});

이렇게 내용을 작성하면 이메일 형식 (ex. test@test.com)이 아닐 경우에는

하단에 '이메일 형식으로 적어주세요' 라는 에러 메세지가 뜨게 됩니다.




반응형