Android쪽
public class LocalBrowser extends Activity {

    private static final String TAG = "LocalBrowser";
    private final Handler handler = new Handler();
    private WebView webView;
    private TextView textView;
    private Button button;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 화면에서 안드로이드 컨트롤 찾기
        webView = (WebView) findViewById(R.id.web_view);
        textView = (TextView) findViewById(R.id.text_view);
        button = (Button) findViewById(R.id.button);

        // 임베딩된 브라우저-WebView-에 자바스크립트 활성화하기
        webView.getSettings().setJavaScriptEnabled(true);

        // 자바 객체-AndroidBridge-를 브라우저의 자바 스크립트에 노출시키기
        // 객체, 노출할 DOM명칭
        webView.addJavascriptInterface(new AndroidBridge(), "android");

        // 임의의 WebChromeClient 객체를 생성하여 WebView에 등록.
        // 여기의 Chrome은 브라우저 창 주의를 정리하는 모든 작업을 일컬음. 즉, 브라우저 처리을 할 클라이언트를 등록
        webView.setWebChromeClient(new WebChromeClient() {

            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
//                return super.onJsAlert(view, url, message, result);
                Log.d(TAG, "onJsAlert(" + view + ", " + url + ", " + message + ", " + result + ")");

                Toast.makeText(LocalBrowser.this, message, 3000).show();

                result.confirm(); // 결과 처리됨
                return true; // 여기서 처리했으므로 true 반환
            }
        });

        // 로컬 assets에서 웹 페이지 로딩하기
        webView.loadUrl("file:///android_asset/index.html");

        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick(" + v + ")");

                // 자바스크립트 호출
                webView.loadUrl("javascript:callJS('Hello from Android')");
            }
        });
    }


    /**
     * 자바 스크립트에 노출된 객체
     *
     */
    private class AndroidBridge {
        public void callAndroid(final String arg) { // 반드시 final이어야 함

            handler.post(new Runnable() {

                @Override
                public void run() {
                    Log.d(TAG, "callAndroid(" + arg + ")");

                    textView.setText(arg);
                }
            });
        }
    }
}

WebView쪽
<html>
<head>
<script type="text/javascript">
    function callJS(arg) {
        document.getElementById("replaceme").innerHTML = arg;
    }
</script>
</head>
<body>
<h1>WebView</h1>
<p>
    <a href="#" onclick="window.alert('Alert from JavaScript');">Display JavaScript alert</a>
</p>
<p>
    <a href="#" onclick="window.andriod.callAndroid('Hello from Browser');"></a>
</p>
<p id="replaceme"></p>
</body>
</html>

addJavascriptInterface() 에서 설정한 DOM명칭 "android"로 WebView에서 호출가능하다.

- final 매개변수를 잘 사용하자. -> 메소드 내에서 변경하면 안되는 값(주소값)일 경우에 사용하면 유용할 듯

[script] 소수점 자리수

프로그래밍/Web 2010. 5. 20. 10:19 Posted by galad
http://www.w3schools.com/jsref/jsref_tofixed.asp

var num = new Number(13.3714);
document.write(num.toFixed()+"<br />");
document.write(num.toFixed(1)+"<br />");
document.write(num.toFixed(3)+"<br />");
document.write(num.toFixed(10));

>>
13
13.4
13.371
13.3714000000


[javascript] DOM 스크립트

프로그래밍/Web 2010. 1. 15. 11:09 Posted by galad
9장 CSS와 DOM 연동하기를 읽으면서 간단 정리

1. DOM의 style 프로퍼티로는 외부 스타일 시트에서 선언한 style 객체 및 문서 내부의 미리 선언한 스타일 정보도 가져올 수 없다.
  오로지 인라인으로 선언된 style 속성의 정보만을 가져올 수 있음.

2. DOM으로 style 변경 시 기존 class 속성에 새 class 속성을 추가하고 싶을 때
  eleme.className += " newClass"; 이런 식으로 공백을 두고 추가.

Summary.
  DOM으로 style을 바꾸는 일이 얼마나 있을지는 모르겠음. 단, CSS에 정의되어 있는 class에 대한 정의를 이용해서 DOM으로 class를 변경하는 것 정도는 사용할지도 모르겠음.

10장 애니메이션 슬라이드쇼 만들기

1. setTimeout/clearTimeout
variable = setTimeout("function", interval);
clearTimeout(variable);

변수명 = setTimeout(함수, 인터벌(밀리초));
clearTimeout(변수명); // 위에서 설정한 timeout을 취소

movement = setTimeout("moveMessage()", 5000);

clearTimeout(movement);

2. parseInt
parseInt(string)

문자열을 정수로 반환
문자열 중 정수만 반환 : parseInt("39 degree") == 39

3. CSS: overflow
  overflow:visible --> 전체를 모두 표시. 내용을 포함하고 있는 요소 밖으로 삐져나가서 표시
  overflow:hidden --> 요소 밖으로 나간 것은 표시하지 않음
  overflow:scroll --> 요소 안의 것만 보이나 스크롤 바가 생김
  overflow:auto --> 내용이 클 경우 스크롤 바가 생김

4. 사용자 지정 프로퍼티
var elem = document.getElementById(elementID);

elem.movement = setTimeout(repeat, interval);

if(elem.movement) {
    clearTime(elem.movement);
}

elementID에 movement라는 프로퍼티를 추가.

5. @import
<style type="text/css" media="screen">
  @import url("styles/layout.css");
</style>

css파일 안에서도 사용가능
js도 가능.

11장 총정리

1. margin, padding
* {
    padding: 0;
    margin: 0;
}

전체 선택자로 마진과 패딩을 0으로 설정 -> 브라우저마다 제각각인 기본 스타일 문제를 해결

부록

DHTMLgoodies.com

'프로그래밍 > Web' 카테고리의 다른 글

[html] X-UA-Compatible: IE=EmulateIE7  (0) 2010.04.09
[javascript] 전화번호 형식으로 바꾸기  (0) 2010.03.08
[jstl] jstl 사용하기  (0) 2010.01.08
[jsp] jstl 설명  (0) 2010.01.08
[jsp] jstl 설치  (0) 2010.01.08

[javascript] addLoadEvent

프로그래밍/Web 2010. 1. 4. 16:29 Posted by galad
출처: http://simon.incutio.com

function addLoadEvent(func) {
    var oldonload = window.onload;

    if(typeof window.onload != 'function') {
        window.onload = func;
    }
    else {
        window.onload = function() {
            oldonload();
            func();
        };
    }
}

addLoadEvent(functionA);

기존의 함수(oldonload)와 새 함수(func)를 모두 실행하는 무명함수를 window.onload에 attach.
addLoadEvent(함수명)이 실행될때마다 계속 초기에 실행되는 함수가 증가.
!!! IE 6.0밖에 안되는 듯?!!!!
아마도 FF문제와 같이 locally loaded image에 대해서는 IE6.0밖에 안되는 듯

내가 사용하는 버젼

문제: callback 함수에는 인자 넘기기가 불가능한가?
전역변수로 해결하였으나 다른 방법은 없는가??

참고: http://www.coderanch.com/t/121417/HTML-JavaScript/Passing-Parameter-Into-Callback-Function

jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>

<script type="text/javascript" src="image_util.js"></script>

<script type="text/javascript">
function fileCheck(formObj) {
    if(formObj.fileName.value == "") {
        alert("이미지를 선택해주세요.");
        return false;
    }
    if(formObj.checkUploadImgOkYn.value != "Y") {
        alert("업로드 할 수 없는 이미지 파일입니다.");
        return false;
    }

    return true;
}
</script>
</head>
<body>
<form name="F" onsubmit="return fileCheck(this);">
<input type="file" name="fileName" onChange="checkUploadImg(this.value, 'checkUploadImgOkYn', 'jpg' ,1600, 1200, 500)" >
<input type="hidden" name="checkUploadImgOkYn" id="checkUploadImgOkYn" value="N">
<br>
<input type="submit">
</form>
</body>
</html>

js
// 이미지 파일 관련 javascript

/**
 * 파일 확장자를 반환
 * @param filePath 파일 path
 * @return 확장자
 */
function getFileExtension(filePath)
{
    var lastIndex = -1;
    lastIndex = filePath.lastIndexOf('.');
    var extension = "";

    if ( lastIndex != -1 )
    {
        //extension = filePath.substring( lastIndex+1, filePath.len );
        extension = filePath.substring( lastIndex+1);
    } else {
        extension = "";
    }
   
    return extension;
}


// 이미지.onload시의 callback 함수에 파라미터를 넘기기 위한 전역변수
var g_objId = "";            // 이미지 체크 후, 그 결과를 설정할 input태그의 id. ex) <input type="hidden" name="checkUploadImgOkYn" id="checkUploadImgOkYn" value="N">
var g_widthLimit = 0;    // 이미지 최대 가로길이
var g_heightLimit = 0;    // 이미지 최대 세로길이
var g_fileSizeLimit = 0;    // 이미지 최대 파일크기

/**
 * 이미지 업로드 태그에서 부를 함수. ex) &lt;input type="file" name="fileName" onChange="checkUploadImg(this.value, 'checkUploadImgOkYn', 'jpg' ,1600, 1200, 500)" >
 * @param imgSrc 이미지 파일
 * @param objId 이미지 체크 후 결과를 설정할 input태그의 id
 * @param fileExt_limit 이미지 파일 확장자 제한
 * @param width_limit 이미지 최대 가로길이
 * @param height_limit 이미지 최대 세로길이
 * @param fileSize_limit 이미지 최대 파일크기
 * @return 없음. 체크에 성공하면 objId에 Y를 설정. 실패하면 N을 설정함.
 */
function checkUploadImg(imgSrc, objId, fileExt_limit, width_limit, height_limit, fileSize_limit)
{
    var widthLimit = 0;
    var heightLimit = 0;
    var fileSizeLimit = 0;
    var fileExtLimit = "";
   
    if(typeof width_limit != "undefined") { // 제약조건이 있으면
        widthLimit = width_limit;
    }
    if(typeof height_limit != "undefined") { // 제약조건이 있으면
        heightLimit = height_limit;
    }
    if(typeof fileSize_limit != "undefined") { // 제약조건이 있으면
        fileSizeLimit = fileSize_limit;
    }
    if(typeof fileExt_limit != "undefined") { // 제약조건이 있으면
        fileExtLimit = fileExt_limit;
    }
    else { // 이미지 파일만 업로드해야 하므로 조건이 없으면 기본설정
        fileExtLimit = "jpg,gif,png";
    }

    // global 변수에 저장. callback함수에 인자 넘기기 불가하기 때문
    g_objId = objId;
    g_widthLimit = widthLimit;
    g_heightLimit = heightLimit;
    g_fileSizeLimit = fileSizeLimit;
   
    // IE 체크
    if(navigator.userAgent.toLowerCase().indexOf("msie") == -1) { // IE가 아니면
        var msg = "파일 확장자 : " + fileExtLimit;
        msg = (widthLimit != 0) ? msg + " , 이미지 가로 길이 : " + widthLimit : msg;
        msg = (heightLimit != 0) ? msg + " , 이미지 가로 길이 : " + heightLimit : msg;
        msg = (fileSizeLimit != 0) ? msg + " , 이미지 가로 길이 : " + fileSizeLimit : msg;
       
        alert("인터넷 익스플로러가 아닌 경우에는 업로드할 그림을 확인할 수 없습니다.\n다음의 조건에 맞는 파일을 업로드해 주세요.\n" + msg);
        document.getElementById(g_objId).value = "Y";
        return;
    }
   
    if(typeof imgSrc == "undefined" || imgSrc == "") {
        alert("선택된 파일이 없습니다.");
    }

    var ext = getFileExtension(imgSrc);
    //alert(ext);

    if (ext == "") {
        alert('올바른 파일을 입력하세요');
        return;
    }
    else if(fileExtLimit != "" && ext.toLowerCase().indexOf(fileExtLimit.toLowerCase()) == -1) { // 제약조건이 없으면 체크 안 함
        alert(fileExtLimit + " 형식의 파일만 가능합니다.");
        return;
    }
   
    LoadImg(imgSrc);
}

/**
 * 이미지를 로드
 * @param imgSrc 이미지 파일 path
 * @return
 */
function LoadImg(imgSrc)
{
    var imgInfo = new Image();
    imgInfo.onload = img_Loaded;
    imgInfo.onerror = function() {
        // always called
        alert("이미지 파일의 로드에 실패했습니다.");
        document.getElementById(g_objId).value = "N";
    };
    imgInfo.src = imgSrc;
}

/**
 * image.onload의 callback 함수. image가 load 되면 불려진다.
 * @return
 */
function img_Loaded()
{
    /*var imgSrc, imgWidth, imgHeight, imgFileSize;
    imgSrc = this.src;
    imgWidth = this.width;
    imgHeight = this.height;
    imgFileSize = this.fileSize;

    alert(imgWidth);*/

    var objId = g_objId;
    var widthLimit = g_widthLimit;
    var heightLimit = g_heightLimit;
    var fileSizeLimit = g_fileSizeLimit;
    //alert(widthLimit);
    //alert(heightLimit);
   
    if (this.src == "" || this.width <= 0 || this.height <= 0)
    {
        alert("이미지 파일의 로드에 실패했습니다.");
        document.getElementById(objId).value = "N";
        return;
    }

    // 제약조건 확인
    if(widthLimit != 0 && this.width > widthLimit) {
        alert("선택한 이미지의 가로 길이가 허용치인 " + widthLimit + " 를 초과했습니다.\n선택한 이미지의 가로 길이는 " + this.width + " 입니다.");
          document.getElementById(objId).value = "N";
        return;
    }
    if(heightLimit != 0 && this.height > heightLimit) {
        alert("선택한 이미지의 세로 길이가 허용치인 " + heightLimit + " 를 초과했습니다.\n선택한 이미지의 세로 길이는 " + this.height + " 입니다.");
          document.getElementById(objId).value = "N";
        return;
    }
    if(fileSizeLimit != 0 && this.fileSize > fileSizeLimit*1024) {
        alert("선택한 이미지 크기가 허용치인 " + fileSizeLimit + "KB 를 초과했습니다.\n선택한 이미지의 크기는 약 " + Math.ceil(this.fileSize/1024) + "KB 입니다.");
          document.getElementById(objId).value = "N";
        return;
    }

    // 제약조건 이내라면
    document.getElementById(objId).value = "Y";

    //이미지 사이즈 저장
    //document.F.imgWidth.value = imgWidth;
    //document.F.imgHeight.value = imgHeight;

    //alert("this.width = " + this.width);
    //alert("this.height = " + this.height);

    //alert(document.getElementById(objId).value);
}


!!! IE 6.0밖에 안되는 듯?!!!!
아마도 아래의 FF문제와 같이 locally loaded image에 대해서는 IE6.0밖에 안되는 듯

일단 firefox에서는 image.onload가 업로드 하려는 파일, 즉 locally loaded image에 대해서는 작동하지 않는다
(참고: http://www.tek-tips.com/viewthread.cfm?qid=1452885&page=5)

대신에 image.src="http://www.tek-tips.com/images/logo.gif" 와 같이 어딘가의 서버상에 올려져 있는 파일에 대해서는 작동한다.

 function LoadImg(value)
{
    var imgInfo = new Image();
    imgInfo.onload = img_Load;
    imgInfo.onerror = function() {
        // always called
        alert('error');
    };
// imgInfo.src = "http://www.tek-tips.com/images/logo.gif"; // 이렇게 하면 firefox에서도 동작함
    imgInfo.src = value;
}

function img_Load()
{
    var imgSrc, imgWidth, imgHeight, imgFileSize;
    var maxFileSize;
    maxFileSize = 5000000;
    imgSrc = this.src;
    imgWidth = this.width;
    imgHeight = this.height;
    imgFileSize = this.fileSize;

    if (imgSrc == "" || imgWidth <= 0 || imgHeight <= 0)
    {
        alert('그림파일을 가져올 수 없습니다.');
        return;
    }

    if (imgFileSize > maxFileSize)
    {
        alert('선택하신 그림 파일은 허용 최대크기인 ' + maxFileSize/1024 + ' KB 를 초과하였습니다.');
        return;
    }

    //이미지 사이즈 저장
    document.F.imgWidth.value = imgWidth;
    document.F.imgHeight.value = imgHeight;

    alert(imgWidth);
    alert(imgHeight);
}

주의할 건 image.onload 이후에 image.src 가 와야한다는 것.
image.src 에서 실제 이미지를 로드하고 나서, onload가 동작하는 원리인 듯.
src가 먼저오면 onload가 되기도 하고 아니기도 하는 듯.

기타 참고 링크
http://dogfeet.tistory.com/20
http://www.juniac.net/183
http://blog.byuli.com/entry/운영체제와-브라우저-체크
html
                            <td nowrap style="width:225px;margin-bottom:1px;">
                                <s:select name="approvalStage" list="stageCodeList" listKey="key" listValue="value" headerKey="" headerValue="--선택(현재 상태)--" onchange="selectStageCode(this);"></s:select>
                            </td>
                            <td nowrap style="width:85px;margin-bottom:1px;" id="dpStageTd">
                                <div id="dpStage" style="display: none;"><img src="../images/button/btn_next.gif" align="middle"> 상용상태</div>
                            </td>
                            <td nowrap style="width:225px;margin-bottom:1px;">
                                <div id="dpStageSelect" style="display: none;"><s:select name="dpStageSelect" list="dpStageCodeList" listKey="key" listValue="value" headerKey="" headerValue="전체"></s:select></div>
                            </td>
                            <td align="right" nowrap style="margin-bottom:1px;">
                                <img id="searchButton" src="../images/button/btn_search.gif" align="middle" onClick="javascript:searchContent();" style="cursor:hand;">
                            </td>


script
    function selectStageCode(obj) {
        var STAGE_CODE_RELEASED = "<%=WorkflowCodeDef.STAGE_CODE_RELEASED%>";
       
        //alert(obj.value);
        if(obj.value == STAGE_CODE_RELEASED) { // 상용이면
            document.getElementById("dpStageTd").setAttribute("className", "subject");
            document.getElementById("dpStage").style.display="";
            document.getElementById("dpStageSelect").style.display="";
        }
        else {
            document.getElementById("dpStageTd").setAttribute("className", "");
            document.getElementById("dpStage").style.display="none";
            document.getElementById("dpStageSelect").style.display="none";
        }
    }



출처: http://iamnotokay.tistory.com/123

위의 오류를 뿜어내는 이유는 A 페이지에서 띄운 B 페이지가 서로 도메인이 다를 경우 보안을 위해 차단을 하는것으로 보인다. 타 브라우저에선 어떻게 처리되는지 확인해보지 않았지만 Internet Explorerfirefox에서 테스트결과 자바스크립오류를 낸다.
 
 그러나 두 서버가 같은 도메인을 사용하고 있고 서버도메인이 다를 경우라면 자바스크립트의 공유가 허용된다.
예를 들어

aaa.iamnotokay.com (A페이지)
bbb.iamnotokay.com (b페이지)

이와같이 앞에 www가 들어갈 자리만 다를뿐이라면  해결방법이 있는데

<script language="javascript">
document.domain="iamnotokay.com"
....
</script>
양쪽 두 페이지에 위의 한줄을 추가 해주면 해결된다.

'프로그래밍 > Web' 카테고리의 다른 글

[jQuery] How jQuery Works  (0) 2009.07.06
[jQuery] jQuery로 작업하기, Part 1  (0) 2009.07.01
[C/B] firefox에서의 key event  (0) 2009.06.12
[javascript] 정규표현식을 이용한 이메일 형식 체크  (0) 2009.05.27
[EL] EL  (0) 2009.05.18
출처: http://blog.empas.com/ganemochi/11897983

<SCRIPT LANGUAGE="JavaScript">
        function chk(form) {
         re=/^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;

                if(form.email.value.length<6 || !re.test(form.email.value)) {
                        alert("메일형식이 맞지 않습니다.");
                        form.email.value="";
                        form.email.focus();
                } else {
                        alert("제대로된 형식");
                }
        }
</script>

<form name="form1">
        <input type="text" name="email"><input type="button" value="체크" onclick="chk(this.form)">
</form>

^[0-9a-zA-Z]                --> 첫글자는 숫자또는 영문자
[-_.]?                           --> - 또는 _ 또는 . 이 0번 또는 1번  .은 특수문자 이므로 . 으로
[0-9a-zA-Z]                 --> 숫자또는 영문자
([-_.]?[0-9a-zA-Z])*@ --> @ 앞에(-,_,. 이 0~1번, 그 뒤에는 숫자,영문자)이 한번 또는 여러번
[0-9a-zA-Z]                --> @ 뒤에는 숫자 또는 영문자
[-_.]?                          --> - 또는 _ 또는 . 이 0번 또는 1번
([-_.]?[0-9a-zA-Z])*.   --> . 앞에(-,_,. 이 0~1번, 그 뒤에는 숫자,영문자)이 한번 또는 여러번
[a-zA-Z]{2,3}$             --> . 뒤 마지막 문자열은 영문자가 2~3개
http://www.javascriptkit.com/javatutors/languageattri.shtml
http://en.wikipedia.org/wiki/Client-side_JavaScript

Yes, there is a difference .

<script language="JavaScript"> is incorrect

There is no attribute "language" it has been deprecated.
The required attribute is "type" and the type="text/javascript"

Hence...

<script type="text/javascript"> is now the correct form