[jQuery] 제이쿼리에서 아이템 동적 추가후 스타일 적용 문제(select, listview 등)

Posted by Find my true self Fimtrus
2017. 5. 11. 09:04 Programming/Web

리스트뷰에만 해당하는 것은 아니고, 모든 jquery 위젯에 해당하는 문제인데,

아이템들을 동적 추가하면 jquery에서 자동으로 추가하는 class 들이 해당 dom에 추가되지 않는다.

jquery는 html 화면을 불러들일 때, html을 파싱해서 각각 태그에 맞게 클래스를 추가하게 된다.

dom을 동적으로 추가할 경우, 이 로직을 타지 않기 때문에 jquery 스타일이 적용되지 않는다.

이 문제를 해결하기 위해서는 1줄만 추가해주면 된다.

- listview
$jqueryObject.listview('refresh')

- select
$jqueryObject.selectmenu('refresh')


동적 추가후 화면이 제대로 적용이 되지 않는다면!

refresh를 꼭 해주자!


이 댓글을 비밀 댓글로

[HTML] a 태그에 이미지가 보이지 않는다면

Posted by Find my true self Fimtrus
2017. 5. 11. 08:54 Programming/Web

a 태그에 이미지를 넣을 경우, 사이즈가 0으로 잡혀 이미지가 보이지 않는다.


스타일에 display:block; 을 지정하게 되면 정상적으로 이미지가 보이게 된다.



이 댓글을 비밀 댓글로

[Javascript] get으로 넘어온 파라미터를 Object 형태로 변환

Posted by Find my true self Fimtrus
2014. 10. 21. 13:38 Programming/Web

아래와 같이 데이터가 주소에 포함되어 있을 때,


하나하나 꺼내오려면 상당히 귀찮다(어렵진 않지만...)


http://fimtrus.tistory.com/1?data1=123&data2=1234


화면이 로딩되는 시점에서 아래 function을 넣어주면 


주소에 포함되어 있는 파라미터 값들을 편하게 들고 올 수 있다.



/**
 * @author jonghyun.jeong
 * @since 2014.04.01
 * URL과 함께 넘어온 데이터들을 리턴한다.
 */
function getUrlValue( key ) {
	var valueObject = {}, hash, value;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++) {
    	hash = hashes[i].split('=');
    	valueObject[hash[0]] = hash[1];
    }
    
    if ( key ) {
    	
    	if ( valueObject[key] ) {
			return valueObject[key];
		}
    	
    	return "";
    }
    
    return valueObject;
}



getUrlValue() 처럼 인자 값을 넘기지 않을 경우 주소에 포함되어 있는 모든 데이터를 Object 형태로 리턴하고


getUrlValue("data1") 처럼 인자 값을 넘길 경우, 해당하는 키의 value만 리턴한다. 없을 경우 "" 을 리턴.



이 댓글을 비밀 댓글로

자바스크립트 난독화(패킹, 언패킹)

Posted by Find my true self Fimtrus
2014. 10. 14. 10:44 Programming/Web

자바스크립트는 "소스보기"를 통해 외부에 노출된다.

(아래는 모 사이트 난독화 적용화면)




그러기에 더욱 난독화의 적용이 필요하다.(난독화를 적용한다고 해서 소스 분석이 안되는 것은 아니다. 단지 보기 힘들뿐)


웹을 통해 난독화를 적용시킬 수 있는 사이트를 소개한다.



난독화 (click)

난독화 해제 (click)



출처 : 박종명의 아름다운 개발

이 댓글을 비밀 댓글로

[Javascript] Iframe document 얻기.

Posted by Find my true self Fimtrus
2014. 8. 13. 15:09 Programming/Web

query에는 css 선택자를 넣어주면된다

ex) getFrameDocuement("#frame1");


function getFrameDocument( query ) {
	var frame = document.querySelector( query );
	if (frame == null)
		return;

	var frameDocument = frame.contentWindow || frame.contentDocument;
	return frameDocument;
}


이 댓글을 비밀 댓글로

[Javascript] String byte check. 스트링 바이트 체크 (한글).

Posted by Find my true self Fimtrus
2014. 8. 13. 14:38 Programming/Web

자바스크립트에서 스트링 길이를 구할 때, 한글 길이와 영문길이를 같이 계산하는 경우가 대부분이다.


하지만, 한글의 경우 2byte로 계산해야 정상적인 계산이라고 볼 수 있는데,


구글링 중 어느 블로그를 통해 계산법에 대해 알게 되었다.


현재 string의 byte 수를 구하는 function 이다.


String.prototype.getBytes = function() {
	var contents = this;
	var str_character;
	var int_char_count;
	var int_contents_length;

	int_char_count = 0;
	int_contents_length = contents.length;

	for (k = 0; k < int_contents_length; k++) {
		str_character = contents.charAt(k);
		if (escape(str_character).length > 4)
			int_char_count += 2;
		else
			int_char_count++;
	}
	return int_char_count;
}


그리고 조금더 응용해서 


입력된 숫자 만큼의 길이의 스트링을 리턴해준다.


String.prototype.getStringFromByteLength = function( byteLength ) {
	var contents = this;
	var str_character;
	var int_char_count;
	var int_contents_length;
	
	var returnValue = "";
	
	int_char_count = 0;
	int_contents_length = contents.length;
	
	for (k = 0; k < int_contents_length; k++) {
		str_character = contents.charAt(k);
		if (escape(str_character).length > 4)
			int_char_count += 2;
		else
			int_char_count++;
		
		if ( int_char_count > byteLength ) {
			break;
		}
		returnValue += str_character;
	}
	return returnValue;
}



위의 function은 출처가 어딘지 모르겠네요...


혹시 직접 만드신분이 보신다면...댓글 부탁드려요~


이 댓글을 비밀 댓글로

[Javascript] 자바스크립트에서 replaceAll 하기.

Posted by Find my true self Fimtrus
2014. 8. 8. 15:26 Programming/Web

자바에서는 친절하게 replaceAll을 제공하지만 


자바스크립트는 제공하지 않는다.


결국 해당 function을 만들어주는 수 밖에 없다..


마찬가지로 웹페이지 로드될 때, 아래코드를 추가시켜주면된다.


String.prototype.replaceAll = function() { 
	var a = arguments, length = a.length;
	
	if ( length == 0 ) {
		return this;
	}
	
	var regExp = new RegExp( a[0], "g");
	
	if ( length == 1 ) {
		
		return this.replace(regExp, "");
	} else {
		return this.replace(regExp, a[1]);
	}
	return this;
}



이 댓글을 비밀 댓글로

[Javacript] Array remove Index 배열 삭제

Posted by Find my true self Fimtrus
2014. 8. 8. 14:28 Programming/Web

자바스크립트의 Array 객체 ( [] 대괄호를 통해 생성 또는 new Array 로 생성하는 경우) 에는 배열 객체를 삭제하거나, 인덱스를 입력받아 삭제하는 function이 없다.


물론 splice나 split 등의 function을 이용하면 되긴 하지만, 


익숙하지 않은 사람들에게는 상당히 귀찮은 작업이다.


그래서 function을 미리 만들어 놓고 사용하는데,


이것도 마찬가지로 웹페이지가 로드될 때 코드를 추가해주면


모든 Array가 아래 function들을 가지게 된다.



Array.prototype.remove = function() {
    var what, a = arguments, L = a.length, ax;
    while (L && this.length) {
        what = a[--L];
        while ((ax = this.indexOf(what)) !== -1) {
            this.splice(ax, 1);
        }
    }
    return this;
};

Array.prototype.removeIndex = function () {
	var a = arguments, length = a.length;
	this.splice ( a[--length], 1 );
	return this;
}


추가한뒤 array 객체를 보면 remove와 removeIndex가 딱!



이 댓글을 비밀 댓글로

[Javascript] Date format 추가.

Posted by Find my true self Fimtrus
2014. 8. 8. 14:15 Programming/Web

자바스크립트에서 Date 객체에 대한 format function을 지원해 주지 않는다.


해서..... 포멧을 만들려면 상당히 귀찮은 작업을 해야하는데,


아래 코드를 웹페이지 로드될 때, 추가해주면 format function 을 사용할 수 있다.

Date.prototype.format = function(f) { if (!this.valueOf()) return " "; var weekName = ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"]; var d = this; return f.replace(/(yyyy|yy|MM|dd|E|HH|hh|mm|SSS|ss|a\/p)/g, function($1) { switch ($1) { case "yyyy": return d.getFullYear(); case "yy": return (d.getFullYear() % 1000).zf(2); case "MM": return (d.getMonth() + 1).zf(2); case "dd": return d.getDate().zf(2); case "E": return weekName[d.getDay()]; case "HH": return d.getHours().zf(2); case "hh": return ((h = d.getHours() % 12) ? h : 12).zf(2); case "mm": return d.getMinutes().zf(2); case "ss": return d.getSeconds().zf(2); case "a/p": return d.getHours() < 12 ? "AM" : "PM"; case "SSS": var temp = "0000"; var milliSeconds = d.getMilliseconds(); temp = temp + milliSeconds; temp = temp.substring ( temp.length - 3 , temp.length); return temp; default: return $1; } }); };


이 댓글을 비밀 댓글로

[Android, Hybrid] 앱에서 파일 다운로드 구현. URL File Download.

Posted by Find my true self Fimtrus
2014. 7. 10. 15:09 Programming/Android

웹브라우저를 이용해서 파일을 다운로드 받을 경우, 다운로드매니저를 통해 받게 된다.(진저브레드 이상)


앱에서 다운로드 매니저를 사용하여 파일 다운로드 받는 방법을 쓰고자 한다.


앱이나 하이브리드나 다운로드 하는 방법은 동일하다.


다운로드 매소드, 그리고 다운로드매니저로부터 액션을 받을 수 있는 리시버를 만드면 끝.!


Download Method

private DownloadManager mDownloadManager; //다운로드 매니저. 
private int mDownloadQueueId; //다운로드 큐 아이디..
private String mFileName ; //파일다운로드 완료후...파일을 열기 위해 저장된 위치를 입력해둔다.
/**
 * @param url : 파일을 다운로드할 url.
 */
public void download(String url) {
	if (mDownloadManager == null) {
		mDownloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
	}
	Request request = new DownloadManager.Request( Uri.parse(url) );
	request.setTitle("==타이틀==");
	request.setDescription("==설명==");
	List<string> pathSegmentList = uri.getPathSegments();
	Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS + "/temp").mkdirs();  //경로는 입맛에 따라...바꾸시면됩니다.
	request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS + "/temp/", pathSegmentList.get(pathSegmentList.size()-1) );
	mFileName = pathSegmentList.get(pathSegmentList.size()-1);

	mDownloadQueueId = mDownloadManager.enqueue(request);
}



다운로드관련 인텐트를 받을 리시버를 만들고, 등록시켜주면 끝!

(onResume 에서 등록, onPause에서 해제를 추천한다.)


Complete Receiver

/**
 * 다운로드 완료 액션을 받을 리시버.
 */
private BroadcastReceiver mCompleteReceiver = new BroadcastReceiver() {
	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		if (action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {
			Toast.makeText(context, "Complete.", Toast.LENGTH_SHORT).show();
			Intent intent1 = new Intent();
			intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			intent1.setAction(android.content.Intent.ACTION_VIEW);
			intent1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

			String localUrl = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
					+ "/temp/" + mFileName; //저장했던 경로..
			String extension = MimeTypeMap.getFileExtensionFromUrl(localUrl);
			String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);

			File file = new File(localUrl);
			intent1.setDataAndType(Uri.fromFile(file), mimeType);
			try {
				startActivity(intent1);
			} catch (ActivityNotFoundException e) {
				Toast.makeText(NPF.this, "Not found. Cannot open file.", Toast.LENGTH_SHORT).show();
				e.printStackTrace();
			}
		}
	}
};


@Override
protected void onPause() {
	super.onPause();
	unregisterReceiver(mCompleteReceiver);
}

@Override
protected void onResume() {
	super.onResume();
	IntentFilter completeFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
	registerReceiver(mCompleteReceiver, completeFilter);
}


하이브리드 앱의 경우 JavaInterface에 해당 method를 넣어주면 되고, 일반적인 앱에서 사용할 경우에는


유틸 같은 곳에 추가하여 사용하면된다.(물론 해당 method를 조금 수정해서 context를 받도록 해야할 것이긴 하지만)



이 댓글을 비밀 댓글로
    • 2014.07.14 09:31
    비밀댓글입니다
    • 조금의(?) 수정
    • 2015.10.21 22:14
    직접 내용을 수정하여 제목, 내용 커스텀 + 경로 지정 가능하게 해보고
    일반 앱에 바로 복붙하고 Import만 하면 가능하게 대충 수정을...

    public void download(String url, String title, String des, String path) {
    DownloadManager mDownloadManager = null; //다운로드 매니저.
    int mDownloadQueueId; //다운로드 큐 아이디..
    String mFileName ; //파일다운로드 완료후...파일을 열기 위해 저장된 위치를 입력해둔다.
    if (mDownloadManager == null) {
    mDownloadManager = (DownloadManager) getApplicationContext().getSystemService(Context.DOWNLOAD_SERVICE);
    }
    DownloadManager.Request request = new DownloadManager.Request( Uri.parse(url) );
    request.setTitle(title);
    request.setDescription(des);
    List<String> pathSegmentList = Uri.parse(url).getPathSegments();
    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS + "/" + path).mkdirs(); //경로는 입맛에 따라...바꾸시면됩니다.
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS + "/" + path + "/", pathSegmentList.get(pathSegmentList.size()-1) );
    mFileName = pathSegmentList.get(pathSegmentList.size()-1);

    mDownloadQueueId = (int) mDownloadManager.enqueue(request);
    }