Search Results for '프로그래밍'


1206 posts related to '프로그래밍'

  1. 2012/02/07 특정 html 허용 및 javascript style 등등 완전 제거 함수 [ASP 정규식] 1
  2. 2012/02/07 ASP에서 FTP 사용을 가능하게 해주는 컴포넌트
  3. 2012/02/07 파일생성 권한 초기화 시키기
  4. 2012/02/07 특정 파일(ex: mp3,avi,mpg)만 찾아서 자동으로 삭제하기!
  5. 2012/02/07 리눅스에서 쓰레드 최대 생성 갯수 확인
  6. 2012/02/07 리눅스 하위 디렉토리의 문자열 검색
  7. 2012/02/07 SSH 포트22번 불량 접속 시도 IP 자동 막기 1
  8. 2012/01/31 네이버 원격블로깅입니다.
  9. 2012/01/28 web page performance test (WPT) tool - 사이트 속도 테스트
  10. 2012/01/16 SNS Share API - shareaholic
  11. 2012/01/16 Google Webfont API
  12. 2012/01/14 하이브리드 앱 개발툴 - 앱셀레이터 티타늄(Appcelerator Titanium)
  13. 2012/01/10 쉘상태에서 웹서버 접속자수 알아내기[2차 수정] 1
  14. 2012/01/02 브라우저가 최신기술 지원하는지 체크하는 방법
  15. 2012/01/02 HTML5/JS 소스공유 사이트
  16. 2012/01/02 웹뷰에서 폭 스크롤 때문에 잘리는 문제 해결 2
  17. 2012/01/02 php.ini 설정 권한이 없는 웹호스팅에서 register_globals = ON 설정 하기
  18. 2012/01/02 아이폰에서 프레임 적용시 100% 적용하기
  19. 2012/01/02 ASP 파일 경로 접근 에러(Path/File access error)
  20. 2012/01/02 자바스크립트를 이용해서 링크 클릭시 테이블 보이기 숨기기 style display 활용
  21. 2012/01/02 ASP 해킹 방지 보안 방법(injection, cross site scripting...)
  22. 2011/12/25 우분투 IP변경하기
  23. 2011/12/10 웹표준 진단 프로그램(정식버전) - eGovFrame
  24. 2011/12/10 웹 접근성을 고려한 콘텐츠 제작 기법 2.0(2011.11)
  25. 2011/12/06 레이어 공지사항(오늘 하루 그만 보기)
  26. 2011/12/06 JSON 객체를 String으로 변환하기
  27. 2011/12/06 다중 셀렉트 기본 방법
  28. 2011/12/06 모든 자바스크립트 에러 잠재우기 (에러 디버그)
  29. 2011/12/06 innerHTML 에서 script 태그 넣기
  30. 2011/12/06 문 자열 길이 체크
가장 기본적인 방법은 다음과 같다.
< %
sUrl = "http://www.youngsam.kr/"
set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
oHttp.Open "GET", sUrl, False
oHttp.Send ""
Response.Write oHttp.ResponseText
Set oHttp = Nothing
%>

GET 메쏘드로 갖고온 HTML을 화면에 출력하는 루틴이다.
게시판등에 글을 쓰거나 할 때는 POST 메쏘드를 사용하는데 이 방법도 가능한다.

<%
sUrl = "http://youngsam.kr/form.asp"
set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oHttp.Open "POST", sUrl, False
oHttp.Send "subject=test&contents=message+body"
Response.Write oHttp.ResponseText
Set oHttp = Nothing
%>


오류 처리는 Send 메쏘드를 호출하기 전에 On Error Resume Next를 적어주고 오류발생여부를 체크하면 된다.

<%
sUrl = "http://youngsam.kr/form.asp"
set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
On Error Resume Next


oHttp.Send "subject=test&contents=message+body"
If Err Then
Response.Write "Error:" & oHttp.ParseError.URL & "<br>" & oHttp.ParseError.Reason
Else
Response.Write oHttp.ResponseText
End If
Set oHttp = Nothing
%>
2012/02/07 09:59 2012/02/07 09:59

사용법

content = StripHTML(content)

Function StripHTML(oSource)

dim Result_Text

Result_text = ReplaceText(oSource," ( )+"," ")

Result_text = Replace(Result_text,"=" & vbcrlf,"")
Result_text = Replace(Result_text,";" & vblrcf,"")

' Remove the header (prepare first by clearing attributes)

' head 태그 안의 모든 내용을 지운다
Result_text = ReplaceText(Result_text,"<( )*head([^>])*>","<head>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*head( )*>)","</head>")
Result_text = ReplaceText(Result_text,"(<head>)[\s\S]*(</head>)","")

' remove all scripts (prepare first by clearing attributes)

' script 태그 안의 모든 내용을 지운다
Result_text = ReplaceText(Result_text,"<( )*script([^>])*?>","<script>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*?script()*>)","</script>")
Result_text = ReplaceText(Result_text,"(<script>)([^(<script>\.</script>)])*?(</script>)","")
Result_text = ReplaceText(Result_text,"(<script>)[\s\S]*?(</script>)","")

' remove all styles (prepare first by clearing attributes)

' style 태그 안의 모든 내용을 지운다
Result_text = ReplaceText(Result_text,"<( )*style([^>])*?>","<style>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*?style( )*>)","</style>")
Result_text = ReplaceText(Result_text,"(<style>)[\s\S]*?(</style>)","")

' remove all object (prepare first by clearing attributes)

' object 태그 안의 모든 내용을 지운다
Result_text = ReplaceText(Result_text,"<( )*object([^>])*?>","<object>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*?object( )*>)","</object>")
Result_text = ReplaceText(Result_text,"(<object>)[\s\S]*?(</object>)","")

' Remove the link (prepare first by clearing attributes)

' link 태그 안의 모든 내용을 지운다
Result_text = ReplaceText(Result_text,"<( )*link([^>])*>","<link>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*link( )*>)","</link>")
Result_text = ReplaceText(Result_text,"(<link>)[\s\S]*(</link>)","")

' 자바스크립트 함수 치환

Result_text = ReplaceText(Result_text,"onclick=","xonclick=")
Result_text = ReplaceText(Result_text,"onmouseover=","xonmouseover=")
Result_text = ReplaceText(Result_text,"onmouseout=","xonmouseout=")
Result_text = ReplaceText(Result_text,"onchange=","xonchange=")
Result_text = ReplaceText(Result_text,"href=""javascript","href=""xjavascript")

' span 및 div 태그의 속성을 제거

Result_text = ReplaceText(Result_text,"<( )*span([^>])*?>","<span>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*?span( )*>)","</span>")

Result_text = ReplaceText(Result_text,"<( )*div([^>])*?>","<div>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*?div( )*>)","</div>")

' input 태그를 지운다

Result_text = ReplaceText(Result_text,"<( )*input([^>])*?>","")

' Remove remaining tags like <a>, links, images, comments etc - anything thats enclosed inside < >

' 허용태그 이외의 태그 제거

Result_text = ReplaceText(Result_text,"<[^(image|a|div|span|table|tr|td|li|p)]*?>","")

' Thats it.
StripHTML = Result_Text
End Function

Function ReplaceText(str1, patrn, replStr)
Dim regEx
Set regEx = New RegExp
with regEx
.Pattern = patrn
.IgnoreCase = True
.Global = True
end with
ReplaceText = regEx.Replace(str1, replStr)
End Function

2012/02/07 09:58 2012/02/07 09:58
ASP에서 가끔 FTP를 사용해야할때(자료의 원격지 이동등) 유용하게 사용할 수 있는 컴포넌트입니다.
ASPFTP 라는 이름이며, 압축파일에는 설치법과 예제 , 그리고 dll 파일이 포함되어 있습니다.

컴포넌트는 첨부되어 있는 파일을 사용하면 됩니다.

DLL등록하는 방법은

regsvr32 경로\aspftp.dll

라고

하면 되고요, 경로는 DLL 파일의 경로 입니다

압축을 풀면 나오는 파일의 aps파일의 소스를 참고 하시면 쉽게 사용

가능 합니다.

그래도 잠깐 살펴 본다면..

대충 변수를 설정하고요

Dim objFTP

Dim ftpErrMsg

ftpErrMsg = ""

'객체를 만들어 줍니다

Set objFTP = Server.CreateObject("NIBLACK.ASPFTP")

'인자1 서버이름

'인자2 아이디

'인자3 패스

'인자4 소스파일

'인자5 타겟파일

'인자6 전송형태

'인자7 overWrite

If objFTP.bQPutFile("주소","아뒤","패스워드","경로", "대상",TRANSFER_TYPE_ASCII) Then

ftpErrMsg = ""

Else

ftpErrMsg = "objFTP.sError" '실패시 실패이유가 변수에 저장 됩니다

End If

'이제 객체를 닫아 주고요

Set objFTP = Nothing

if ftpErrMsg = "" then

call 성공시 실행할 함수

else

response.Write "전송실패 : "&ftpErrMsg

end if

머 대충 이렇게 사용하면 됩니다

2012/02/07 09:56 2012/02/07 09:56
chmod 644 -R * (초기화)
chmod -R go+X * (디렉토리별 실행권한을 준다)
chmod -R 707 나머지 바꾸고 싶음 퍼미션 폴더
2012/02/07 09:50 2012/02/07 09:50
예제로 나온 스크립트는 mp3 라는 단어가 들어있는 파일을 지웁니다.

for LIST in `find / | grep mp3`
do
rm -f $LIST
echo $LIST
done

이런 예제의 문제점은 mp3.html 도 지울수가 있다는 것이겠죠
그렇다면 다음과 같이 바꿀수 있겠죠

for LIST in `find / -name *.mp3`
do
rm -f $LIST
echo $LIST
done

이렇게 바꿀수가 있답니다.

그러면 저걸 vi 를 열어서 작성한다음 저장하고 빠져나옵니다
(파일명은 자기맘^^)

그런후 excute 권한을 줘야죠.. 지금 이 작업을 하시는분은 당연히 root 이실테니..

# chmod 700 파일명

자기자신이외에 실행을 못시킵니다..

그러나 여기서 또 발견되는 문제점.. 의사를 확인하지않고 지우면 문제가될수있으니..
다음과 같이바꿀수 있죠(그러나, 귀찮은 단점이있습니다)

for LIST in `find / -name *.mp3`
do
rm $LIST
echo $LIST
done

그럼.. 계정관리하시는데 도움이 되길 바랍니다~~
2012/02/07 09:50 2012/02/07 09:50
cat /proc/sys/kernel/threads-max

명령을 할 경우 최대 생성 갯수가 나옴
2012/02/07 09:50 2012/02/07 09:50
find . | xargs grep '검색 하고 싶은 문자열'

명령 실행시 실행시키는 디렉토리의 하위 디렉토리의 문자열과

문자열이 들어있는 파일이 검색된다.
2012/02/07 09:49 2012/02/07 09:49

SSH를 돌리면 /var/log/secure 에 22번포트로 접속시도가 많이 보인다. 부적절하게 접속시도하는 IP 들을 자동으로 차단하는 스크립트를 만들어 보겠다.
 
과정은 /var/log/secure 에서 불량 ssh 접속 ip를 추려내서 /etc/hosts.deny 에 등록된다.
 
 # grep "Failed password for" /var/log/secure | egrep -v "invalid user" | egrep -v "{USERID}|{LOGINIP}" | awk '{ print $11}' | uniq | sed "s/^/all:/" > /root/ssh-login-ip
# grep "Failed password for invalid user" /var/log/secure.1 | awk '{ print $13}' | uniq | sed "s/^/all:/" >> /root/ssh-login-ip
 
 [위의 명령어 설명] USERID=관리자 ssh 접속계정 LOGINIP=관리자 ssh접속계정의 공인 ip : 직접 입력해야함.
 
-------------------------------------------------------------------------------------------------------------
 
grep "Failed password for" /var/log/secure: /var/log/secure 파일 내에서 "Failed password for" 문장이 들어간 행만 뽑아냄
 
egrep -v "invalid user" : 위 결과에서 "invalid user" , "USERID" , "LOGINIP" 가 들어간 부분은 제외
 
egrep -v "{USERID}|{LOGINIP}": 위 결과에서 관리상 필요에 의해 접속했던 계정, IP는 제외
 
awk '{print $11}' : 위 결과에서 각 행마다 11번째 문장을 뽑아냄 -> 비정상 IP
 
uniq : 중복된 문장을 하나씩만 출력
 
sed "s/^/all:/" > /root/ssh-login-ip: 각 행의 맨 앞에 "all:" 을 입력 후 /root/ssh-login-ip 파일에 저장

grep "Failed password for invalid user" /var/log/secure.1 : var/log/secure.1 파일에서 "Failed .... user" 문장이 들어간 행만 추출
 
awk '{print $13}' : 각 행마다 11번째 문장만 뽑아냄 -> 비정상 IP
 
>> /root/ssh-login-ip : 위의 /root/ssh-login-ip 파일에 뒤이어 내용을 첨가함

------------------------------------------------------------------------------------------------------------
 
# cat /root/ssh-login-ip /etc/hosts.deny | sort | uniq >> /root/hosts.deny : hosts.deny에 블럭킹할 ip 등록

▶crontab 등록
 
# crontab -e
 
------------------------------------------------------------------------------------------------------------------
 
05,15,25,35,45,55 * * * * grep "Failed password for" /var/log/secure | egrep -v "invalid user" | egrep -v "{USERID} | {LOGINIP}" | awk '{ print $11}' | uniq | sed "s/^/all:/" > /root/ssh-login-ip
 
06,16,26,36,46,56 * * * * cat /root/ssh-login-ip /etc/hosts.deny | sort | uniq > /root/hosts.deny
 
07,17,27,37,47,57 * * * * cp /root/hosts.deny /etc/hosts.deny
 
-------------------------------------------------------------------------------------------------------------------

2012/02/07 09:48 2012/02/07 09:48
include_once "xmlrpc.inc";

function newPost($title, $description, $category) {
$g_blog_url = "https://api.blog.naver.com/xmlrpc";
$user_id = "네이버 아이디";
$blogid = "블로그 아이디 = 네이버 아이디와 동일";
$password = "글쓰기 API 암호";
$publish = true;
$client = new xmlrpc_client($g_blog_url);

$client->setSSLVerifyPeer(false);
$GLOBALS['xmlrpc_internalencoding']='UTF-8';

$struct = array(
'title' => new xmlrpcval($title, "string"),
'description' => new xmlrpcval($description, "string"),
'categories' => new xmlrpcval($category, "string")
);

$f = new xmlrpcmsg("metaWeblog.newPost",
array(
new xmlrpcval($blogid, "string"),
new xmlrpcval($user_id, "string"),
new xmlrpcval($password, "string"),
new xmlrpcval($struct , "struct"),
new xmlrpcval($publish, "boolean")
)
);

$f->request_charset_encoding = 'UTF-8';

return $response = $client->send($f);
}

$return = newPost("블로그 제목", "블로그 내용", "블로그 카테고리명");

print_r($return);
?>

xmlrpc.inc 다운로드
http://sourceforge.net/projects/phpxmlrpc/files/phpxmlrpc/2.2.2/

네이버 글쓰기 API를 활성화 시키시고 작업하시면 됩니다.

많은 내용들이 구글에 올라와 있습니다만 내용이 너무 복잡하더군요

그래서 필요한 부분만 올려봅니다.

수정 및 삭제는 따로 찾아보시면 될듯합니다.

http://dev.naver.com/projects/naverblogerapi/issue/6856


자세한 내용은 위의 문서를 참고하시면 될듯합니다.

2012/01/31 11:03 2012/01/31 11:03

http://www.webpagetest.org/


현재 운영하고 계신 사이트가 얼마나 빠른지 한번 보시겠어요? 6대주의 도시를 찍고 돌려볼 브라우저를 선택한 다음 테스트 가능합니다.

예제) 네이버를 독일 프랑크푸르트에서 IE8로 접속할때의 graph,
http://www.webpagetest.org/result/120207_23_34YZS/
2012/01/28 01:11 2012/01/28 01:11
http://www.shareaholic.com/
지원되는 SNS 종류가 엄청납니다.
twitter, facebook 은 당연 기본이고,
wordpress 로 퍼가는 것도 되네요.

api 는 소스코드가 아니니까 그냥 쓰면 되는거고,

공유버튼에 쓰라고 만든 아이콘셋은 Creative Commons Attribution-Share Alike 3.0 Unported License 입니다.
http://www.shareaholic.com/openshareicon

공짜인 것 같아요.

구글툴바의 공유버튼이 이걸로 되어 있어서 알았네요.                                       
2012/01/16 17:47 2012/01/16 17:47
http://www.google.com/webfonts
https://developers.google.com/webfonts/

영어뿐인게 아쉽네요.

License: Google APIs Terms of Service https://developers.google.com/terms/

----------------------------------------------------------------------------------

한글웹폰트 그냥 여기가셈 (나눔시리즈 등 무료웹폰트 서비스)

http://api.mobilis.co.kr/webfonts/

서버는 한국서버가 甲
2012/01/16 17:47 2012/01/16 17:47

직접 사용은 안해봤지만 추후에 사용할 것 같아서 대충 알아본 내용들을 토대로 올려봅니다.

하이브리드 앱 개발툴 : 웹 소스를 통해서 어떠한 플랫폼에 상관없이 연동되는 UI를 가지며 각 플랫폼 별로 지원이 필요한 기능(GPS,카메라, 등)은 각 플랫폼 내부의 API를 이용하여 개발을 도와주는 툴.

심비안, 블랙베리, 윈도우, 리눅스, 안드로이드, 아이폰, 바다 등등의 각종 플랫폼에서 구동되는 프로그램을 개발할려면 각 플랫폼별 언어 이해와 여러가지 UI 시도 등을 해야되는데 하이브리드 앱 개발툴을 이용하면 그것이 필요없다고 합니다. (위에서 말한 내용과 같은 내용이지만 조금 더 강조를 하기 위해서 추가하였습니다.)

앱셀레이터 티타늄 : http://www.appcelerator.com/

앱셀레이터 티타늄 스튜디오(개발툴) : http://titanium-studio.s3.amazonaws.com/latest/Titanium%20Studio.exe

2012/01/14 00:19 2012/01/14 00:19
netstat -n|grep -F :80|egrep '(ESTAB|SYN)'|awk '{print $5}'|sed 's/:[0-9]*//'|sort -u|wc -l

쉘상태에서 위와 같이 치시면 됩니다.

=2차 수정=
생각해보니
netstat -n|grep -F :80|egrep '(ESTAB|SYN)'|awk '{print $5}'|sed 's/:[0-9]*//'|sort -u|wc -l

보다는(레드햇 8.0 <- 이외에는 테스트 안해봄~)
netstat -np|grep -F httpd|awk '{print $5}'|sed 's/:[0-9]*//'|sort -u|wc -l
으로 좀더 정확한 수치를 뽑아낼 수 있습니다.

이제야 "웹서버와 통신하고있는 클라이언트 수 알아내기"가 완벽히 완성되었습니다.
=2차 수정 끝=
=수정 시작=
제가 생각을 해보니 명령어의 설명이 하나도 안들어갔군요.
netstat 은 네트워크의 상황을 나타내주는 유틸리티입니다.
옵션 -n은 재분석을 하지 않는옵션으로 빠른 결과출력 속도를 가져오죠.

grep는 정규표현식시 일치하는 줄만을 출력하는 쉘입니다.
-F옵션은 정규표현식을 사용하지 않겠다는 옵션이고.. ":80"은 netstat에서 ":80"을 포함한 줄만을 출력한다는 것이죠.. 즉. http프로토콜만을 출력하겠다는 것입니다.

egrep는 grep -E 와 같은 것으로 좀더 많은 정규표현식을 사용할 수 있습니다. 옵션은 '(ESTAB|SYN)' 으로 주었는데 이는 정규표현식으죠.. 정규표현식을 알고싶으시면 아래의 URL으로..
http://kldp.org/HOWTO/html/Adv-Bash-Scr-HOWTO/x10468.html 을 참조하세요.

awk 는 각 줄에서 공백을 기준으로 필드로 나누며 '{print $5}'는 5번째 필드만을 출력하겠다는 것입니다.

sed 는 비대화형 줄단위 편집기입니다. 정규표현식을 사용하며 's/:[0-9]*//'옵션을 분리하면 s/// 안에 :[0-9]가 들어가있는 것으로 "s/이것//" 는 각 줄에서 "이것"이라는 글자만 지운다는 것으로 정규표현식 :[0-9] 을 나눠보면 ":" 으로 시작하는 모든 숫자를 나타냅니다.
([0-9]는 모든 숫자를 가리킴)

sort는 참 유용한 쉘입니다. 말 그대로 정렬한다는 것인데
printf "1\n5\n3\n"|sort 라고 쉘에서 처보면 순서대로 1,3,5로 출력되는것을 확인할 수 있습니다.
여기서. 옵션 -u는 출력 내용이 같은 것은 한번만 출력하는것입니다.

wc 이것 또한 참 유용한 쉘이죠 ~ 단어의 수를 알아내는 것으로 한줄에 한해서만 단어의 수를 샙니다. 이를 이용해서 몇줄이 나왔는지를 알수있는데 -ㅣ 옵션을 주면 몇줄이 출력되었는지만을 나타냅니다.

전체적으로 분석을 하면
netstat -n|grep -F :80|egrep '(ESTAB|SYN)'|awk '{print $5}'|sed 's/:[0-9]*//'|sort -u|wc -l
명령은 netstat유틸을 이용해서 네트워크의 상황을 출력하고 이 중에 grep 를 이용해 :80 문자만을 나타내고있는 줄만 출력하며 egrep를 이용해 ESTAB이나 SYN이있는 줄만 출력하며 awk를 이용해 접속하고있는 클라이언트만을 표시하며 sed를 이용해 클라이언트의 포트를 제거하고 sort를 이용해서 중복된 IP를 제거하고 마지막으로 숫자만을 출력하기위해 wc를 이용한것입니다
2012/01/10 19:38 2012/01/10 19:38

사용하려는 웹 기술이 브라우저에서 지원을 하는지 체크하고 싶으신가요?

Modernizr를 사용해보세요. 코드부터 보시겠습니다.

<!doctype html>

<html lang="ko">

<head>

<meta charset="UTF-8">

<title>Canvas</title>

<script src="modernizr/modernizr-2.0.6.js"></script>

<script>

window.addEventListener("load", eventWindowLoaded, false);

function eventWindowLoaded() {

alert(Modernizr.canvas);

}

</script>

</head>

<body>

</body>

</html>

modernizr 라이브러리 포함 후 Modernizr.canvas를 호출하면 canvas 지원여부가 true로

표현됩니다.

공식사이트의 문서 중 http://www.modernizr.com/docs/#s2 이 문서를 읽으시면

다른 기능들의 지원여부를 확인할 때 어떤 것을 체크하면 되는지 찾으실 수 있습니다.

다른 예)

Modernizr.fontface

Modernizr.cssanimations

Modernizr.audio

Modernizr.indexeddb

Modernizr.websockets

Modernizr.svg

2012/01/02 13:25 2012/01/02 13:25

http://jsdo.it/

다양한 HTML5 예제 코드들을 보실 수 있습니다.

쉽게 쉽게 따라하셔서 HTML5 페이지들을 제작할 수 있겠죠?

일본도 많이 앞서가고 있네요.

2012/01/02 13:23 2012/01/02 13:23
요즘 웹앱 종종 작업하게 되는데요.
즉, 앱 안에 웹뷰로 모바일 웹을 띄우는 작업을 진행시 간혹 스크롤 때문에 웹표준과 충돌나서 흰여백이 생기는 경우가 있습니다.
한동안 스타일 문제로 알고 자료 계속 찾다가 알고 보니 웹뷰에서 스크롤만 false 처리하면 끝이더군요.
그렇다고 스크롤이 기능이 안되는건 아니구요 스크롤만 숨겨서 웹에서 폭이 모두 나오게끔 하는 겁니다.
Hide the scrollbar in Android
In Eclipse open DroidGap.java. Find the function public void onCreate(Bundle savedInstanceState). Look for the line that created the Android WebView:
appView = (WebView) findViewById(R.id.appView);
Beneath that, add these two lines:
appView.setVerticalScrollBarEnabled(false);
appView.setHorizontalScrollBarEnabled(false);
The scroll bars will no longer appear.
Since Phonegap v0.9.2 there is no need to change core DroidGap.java files.
Just change you main activity class ( the one that extends DroidGap):
public class MyApp extends DroidGap {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.init();
// Disable scrollbars
super.appView.setVerticalScrollBarEnabled(false);
super.appView.setHorizontalScrollBarEnabled(false);
super.loadUrl("file:///android_asset/www/index.html");
}
}
2012/01/02 02:14 2012/01/02 02:14
웹호스팅 이용시 php.ini 설정을 제어하기가 어럽다.

예를들어 register_globals = OFF 값을 ON 으로 또는 OFF 로 설정하고 싶을 경우 호스팅 업체에 요청하면 들어주지 않는데, 이유는 설정을 변경시 모든 호스팅 이용자들에게 적용되어 버리기 때문에 얘기치 않은 장애가 발생하게 된다.

하지만, 홈페이지 root 경로에 보면 .htaccess 파일이 있을것이다.
없으면 추가해주면 된다.
수정은 그냥 메모장으로 하면된다.

파일에 다음과 같이 추가하면된다.

php_flag register_globals on

mysql utf8로 접근하고 싶을땐
PHP_VALUE mysql.default_charset UTF8

라고 추가해 주면 된다.
2012/01/02 02:12 2012/01/02 02:12
frameset 적용시 100% 되지 않는 문제는 meta 태그 한줄로 해결 됩니다.

<meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, width=device-width" />
<frameset rows="*,49" frameborder="no" border="0" framespacing="0" style="border:0; width:320px;">
<frame src="/m/store/main.php" name="mainFrame" id="mainFrame" title="mainFrame" />
<frame src="/m/store/menu.php" name="bottomFrame" scrolling="No" noresize="noresize" id="bottomFrame" title="bottomFrame" />
</frameset>

<meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, width=device-width" />

이부분을 추가 해주시면 됩니다.
2012/01/02 02:09 2012/01/02 02:09

제품 : DEXTUpload Pro 분류 : 컴포넌트 일반

[설명]
2.4x 버전과 Professional 3.0에서 DefaultPath프로퍼티 설정시 차이점이 있습니다.
[DEXTUpload 2.4x]
DefaultPath로 지정된 곳은 EveryOne 읽기, 쓰기, 수정 권한이 있어야 합니다. 그러나, 객체 생성후 DefaultPath를 지정 해주지 않으시면 C:\ 를 참조 하게 됩니다. C:\에 EveryOne 권한을 주시거나 또는 DefaultPath를 지정 해주시고 그곳에 권한을 주시면 됩니다.

[DEXTUpload Professional 3.0]
DefaultPath를 지정하지 않으면, 에러를 발생시키고 파일을 업로드 시키지 않습니다.
따라서, 명시적으로 DefaultPath를 지정해야 합니다.
DEXTUpload Professional에서는 DefaultPath를 지정한 폴더가 존재하지 않을시 AutoMakeFolder를 True로 지정함으로써, 자동 폴더 생성을 지원 합니다.

본 문서의 정보는 다음의 제품에 적용됩니다.
DEXTUpload Professional 3.0
DEXTUpload 2.4x
DEXTUpload 2.0x

2012/01/02 02:08 2012/01/02 02:08

고객센터 질문과답변 페이지를 보여 줄때 답변 내용이 길게 나올 경우 페이지가 쭉 늘어나 정작 필요한 답변을 찾기가 쉽지가 않습니다.
이럴때 답변은 숨겨 놓고 질문 제목을 클릭하면 답변이 보이며 좀전 열었던 답변은 숨기는 기능을 자바스크립트와 style display을 이용해서 적용해 보겠습니다.

1. 자바스크립트 소스

<script language="javascript">
<!--
function QnaShow(qna) {

document.all.qna1.style.display = "none";
document.all.qna2.style.display = "none";
document.all.qna3.style.display = "none";

var obj = eval("document.all." + qna);
obj.style.display = "block";
}
//-->
</script>

2. 테이블 소스

<table>
<!-- 질문 1 -->
<tr>
<td><a href="javascript:QnaShow('qna1')">질문1</a></td>
</tr>
<tr id="qna1" style="display:none;">
<td>답변1</td>
</tr>
<!-- 질문 2 -->
<tr>
<td><a href="javascript:QnaShow('qna2')">질문2</a></td>
</tr>
<tr id="qna2" style="display:none;">
<td>답변2</td>
</tr>
<!-- 질문 3 -->
<tr>
<td><a href="javascript:QnaShow('qna3')">질문3</a></td>
</tr>
<tr id="qna3" style="display:none;">
<td>답변3</td>
</tr>
</table>

3. 소스 설명 :
제목을 클릭시 자바스크립트 QnaShow() 함수를 호출합니다.
이때 함께 전달한 qna 값으로 어떤 질문을 클릭했는지 구분합니다.
먼저 모든 질문을 숨기기 처리합니다.
1번 질문을 본뒤에 2번 질문을 클릭시 1번 질문을 숨기고 2번 질문의 답변을 보여주기 위한 처리인데 일괄적으로 모든 질문의 답변을 숨긴뒤에 원하는 답변만 보여주는 처리 입니다.
열려있는 질문만 숨기기 코딩하면 좋겠지만 오히려 소스가 복잡해줄수 있으므로 질문추가시 자바스크립트 항목중 document.all.qna3.style.display = "none"; 이부분도 함께 추가해 줍니다.
숨기기 처리가 끝나면 var obj = eval("document.all." + qna); 에서 obj로 클릭한 질문의 답변 <tr> id값을 조합합니다.
그리고, obj.style.display = "block"; 에서 지정한 <tr> style의 display 값을 block 으로 적용해서 보이도록 합니다.
이와같은 적용으로 페이지를 다시 접속하지 않고도 보이기 또는 숨기기 적용이 됩니다.

2012/01/02 02:07 2012/01/02 02:07
<%
'////////////////////////////////////////////////////////////////////
'//가. 명령어 삽입(Command Injection) 가능성
'////////////////////////////////////////////////////////////////////
Dim title, str
title = "What's Up!!! <what happen> Oh my god!!!! & goodness"
str = ""
//변환을 수행할 함수
Sub ReplaceStr(content, byref str)
content = replace(content, "'", """)
content = replace(content, "&", "&")
content = replace(content, "<", "<")
content = replace(content, ">", ">")

str = content
End Sub

ReplaceStr title, str
response.write str

%>

'////////////////////////////////////////////////////////////////////
'//나. 크로스 사이트 스크립팅 (XSS) 가능성
'////////////////////////////////////////////////////////////////////
/include/config.inc.asp
<%
atag = "p,br" 'XSS 허용할 태그 리스트
UploadedPath = "/Uploaded_Files/" '업로드 기본 경로
fileext = "jpg,gif,png,pcx" '허용할 확장자 리스트
%>


/include/secure.inc.asp
<%
'공격 위험성이 존재하는 문자들을 필터링
'문자열 입력값을 검증
'숫자형은 데이터 타입을 별도로 체크하도록 한다.
Function sqlFilter(search)
Dim strSearch(5), strReplace(5), cnt, data

'SQL Injection 특수문자 필터링
'필수 필터링 문자 리스트
strSearch(0)="'"
strSearch(1)=""""
strSearch(2)="\"
strSearch(3)=null
strSearch(4)="#"
strSearch(5)="--"
strSearch(6)=";"

'변환될 필터 문자
strReplace(0)="''"
strReplace(1)=""""""
strReplace(2)="\\"
strReplace(3)="\"&null
strReplace(4)="\#"
strReplace(5)="\--"
strReplace(6)="\;"

data = search
For cnt = 0 to 6 '필터링 인덱스를 배열 크기와 맞춰준다.
data = replace(data, LCASE(strSearch(cnt)), strReplace(cnt))
Next

sqlFilter = data
End Function

'XSS 출력 필터 함수
'XSS 필터 함수
'$str - 필터링할 출력값
'$avatag - 허용할 태그 리스트 예) $avatag = "p,br"
Function clearXSS(strString, avatag)
'XSS 필터링
strString = replace(strString, "<", "<")
strString = replace(strString, "\0", "")

'허용할 태그 변환
avatag = replace(avatag, " ", "") '공백 제거
If (avatag <> "") Then
taglist = split(avatag, ",")

for each p in taglist
strString = replace(strString, "<"&p&" ", "<"&p&" ", 1, -1, 1)
strString = replace(strString, "<"&p&">", "<"&p&">", 1, -1, 1)
strString = replace(strString, "</"&p&" ", "</"&p&" ", 1, -1, 1)
next
End If

clearXSS = strString
End Function

'확장자 검사
'$filename: 파일명
'$avaext: 허용할 확장자 예) $avaext = "jpg,gif,pdf"
'리턴값: true-"ok", false-"error"
Function Check_Ext(filename,avaext)
Dim bad_file, FileStartName, FileEndName

If instr(filename, "\0") Then
Response.Write "허용하지 않는 입력값"
Response.End
End If

'업로드 금지 확장자 체크
bad_file = "asp,html,htm,asa,hta"

filename = Replace(filename, " ", "")
filename = Replace(filename, "%", "")

FileStartName = Left(filename,InstrRev(filename,".")-1)
FileEndName = Mid(filename, InstrRev(filename, ".")+1)

bad_file = split(bad_file, ",")

for each p in bad_file
if instr(FileEndName, p)>0 then
Check_Ext = "error"
Exit Function
end if
next

'허용할 확장자 체크
if avaext <> "" Then
ok_file = split(avaext, ",")

for each p in ok_file
if instr(FileEndName, p)>0 then
Check_Ext = "ok"
Exit Function
End If
next
End If

Check_Ext = "error"
End Function

'다운로드 경로 체크 함수
'$dn_dir - 다운로드 디렉토리 경로(path)
'$fname - 다운로드 파일명
'리턴 - true:파운로드 파일 경로, false: "error"
Function Check_Path(dn_dir, fname)
'디렉토리 구분자를 하나로 통일
dn_dir = Replace(dn_dir, "/", "\")
fname = Replace(fname, "/", "\")

strFile = Server.MapPath(dn_dir) & "\" & fname '서버 절대경로

strFname = Mid(fname,InstrRev(fname,"\")+1) '파일 이름 추출, ..\ 등의 하위 경로 탐색은 제거 됨
Response.Write strFname

strFPath = Server.MapPath(dn_dir) & "\" & strFname '웹서버의 파일 다운로드 절대 경로

If strFPath = strFile Then
Check_Path = strFile '정상일 경우 파일 경로 리턴
Else
Check_Path = "error"
End If
End Function

'IP 체크 함수
Function Check_IP(IP_Addr)
If Request.Servervariables("REMOTE_ADDR") = IP_Addr Then
Check_IP = "TRUE"
Else
Check_IP = "FALSE"
End If
End Function
%>



/head.asp
<%
'페이지에서 에러가 발생하여도 페이지 오류를 외부로 출력하지 않기위해 사용
On Error Resume Next
'On Error GoTo 0도 가능하나 2003에서는 실행되지 않음
if err.number <> 0 then
'Response.Write err.description & "<BR>" & err.source & "<BR>"
err.clear
End if
%>


/content.asp
<!--#include virtual="/include/connection.inc.asp"--> <% 'DB연결 헤더 %>
<!--#include virtual="/include/secure.inc.asp"--> <% '보안관련라이브러리 %>
<!--#include virtual="/include/config.inc.asp"--> <% '전역변수리스트 %>
<!--#include virtual="/head.asp"--> <% '초기 설정 페이지(에러 메세지 미출력) %>
<%
Dim strSQL
Dim intSeq, strName, strEmail, strSubject, strContent, intCount, dtmReg_Date, intExist
Dim blnTag, strUserIP
Dim atag

'입력값이 숫자형인 경우 IsNumeric 함수를 사용한다.
If IsNumeric(seq) Then
intSeq = Request.QueryString("seq")
Else
Response.Write "허용하지 않는 입력값입니다."
Reponse.End
End If

'문자(열)인 경우 sqlfilter 사용
'intSeq = sqlFilter(Request.QueryString("seq")) 'SQL Injection 필터링

'읽은 횟수 검색
strSQL = "SELECT count(*) FROM board WHERE intSeq='" & intSeq & "'"

objRs.Open strSQL, objDBConn

intExist = objRs(0)
objRs.Close

If intExist <> 1 Then
Response.Write "해당글이 없습니다."
Else
'읽은 횟수 증가
strSQL = "UPDATE board SET intCount=intCount+1 WHERE intSeq='" & intSeq & "'"
objRs.Open strSQL, objDBConn

'게시물 SELECTZ
strSQL = "SELECT strName,strEmail,strSubject,strContent,intCount,strUserIP,blnTag,dtmReg_Date FROM board WHERE intSeq='" & intSeq & "'"
objRs.Open strSQL, objDBConn

strName = objRs(0)
strEmail = objRs(1)
strSubject = objRs(2)
strContent = objRs(3)
intCount = objRs(4)
strUserIP = objRs(5)
blnTag = objRs(6)
dtmReg_Date = objRs(7)

objRs.Close
Set objRs = Nothing

objDBConn.Close
Set objDBConn = Nothing

'게시물 출력값에 XSS 필터링
'사용자가 입력하는 출력되는 값은 strName, strEmail, strSubject, strContent으로 이 부분은 XSS 공격이 가능한 부분들이다.
'일반적으로 본문만 선택적으로 HTML 태그 사용을 허용하며 나머지 부분들은 사용할 수 없도록 하는것이 바람직하다.
strName = clearXSS(strName, atag)
strEmail = clearXSS(strEmail, atag)
strSubject = clearXSS(strSubject, atag)
strContent = clearXSS(strContent, atag)

'줄넘김 처리
strContent = replace(strContent, vbLf, vbLf & "<br>")
%>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=ks_c_5601-1987">
<title>내용보기</title>
</head>

<body>
<div align=center>
<table border=1>
<tr>
<td>이름</td>
<td><%=strName%></td>
<td>등록일</td>
<td><%=dtmReg_Date%></td>
</tr>
<tr>
<td>이메일</td>
<td><%=strEmail%></td>
<td>조회</td>
<td><%=intCount%></td>
</tr>
<tr>
<td>제목</td>
<td colspan=3><%=strSubject%></td>
</tr>
<tr>
<td>내용</td>
<td colspan=3><%=strContent%></td>
</tr>
<tr>
<td colspan=4>
<a href="list.asp">목록으로</a> <a href="edit.asp?seq=<%=intSeq%>">수정하기</a> <a href="delete.asp?seq=<%=intSeq%>">삭제하기</a>
</td>
</tr>
</table>

</div>
</body>
</html>
<%
End If
%>



'////////////////////////////////////////////////////////////////////
'//다. SQL 구문 삽입 가능성
'////////////////////////////////////////////////////////////////////
SQL Injection은 쿼리문의 잘못 해석함에서 발생하는 문제이다. 이를 해결하기 위해서는 쿼리문을 생성시에 입력된 값에 대한 유효성 검사를 수행하면 된다. ‘, “ 문자를 \’, \”로 변경해 주거나 아예 공백으로 처리하는 방법이다.

삭제해야 할 프로시저
xp_cmdshell
xp_stratmail
xp_sendmail
xp_grantlogin
xp_makewebtask


'////////////////////////////////////////////////////////////////////
'//사. 다운로드 취약성
'////////////////////////////////////////////////////////////////////
<!--#include virtual="/include/connection.inc.asp"--> <% 'DB연결 헤더 %>
<!--#include virtual="/include/secure.inc.asp"--> <% '보안관련라이브러리 %>
<!--#include virtual="/include/config.inc.asp"--> <% '전역변수리스트 %>
<!--#include virtual="/head.asp"--> <% '초기 설정 페이지(에러 메세지 미출력) %>
<%
Dim dn_dir, fname, val_ok
Dim UploadedPath

dn_dir = Request("dir")
fname = Request("fname") '파일 이름

' IE 5.01에서는 이 방식을 사용할때 메모리 관련 문제가 발생할 수 있다.
strUA = Request.ServerVariables("HTTP_USER_AGENT")
If Instr(strUA, "MSIE") Then
intVersion = CDbl(mid(strUA, Instr(strUA, "MSIE")+5, 3))

If intVersion < 5.01 Then
Response.Write "error"
End If
End If

if fname = "" Then
Response.Write "<script language=javascript>"
Response.Write "alert(""파일명을 입력해 주세요"");"
Response.Write "history.back();"
Response.Write "</script>"
End If

dn_dir = UploadedPath & dn_dir
val_ok = Check_Path(dn_dir, fname)

If val_ok <> "error" Then '사용자가 다운 받는 파일과 웹서버의 파일 다운로드 경로가 맞는지 비교
Set objStream = Server.CreateObject("ADODB.Stream") 'Stream 이용

Response.ContentType = "application/unknown" 'ContentType 선언
Response.AddHeader "Content-Disposition","attachment; filename=" & fname

objStream.Open
objStream.Type = 1
objStream.LoadFromFile val_ok

download = objStream.Read
Response.BinaryWrite download
End If

Set objstream = nothing '객체 초기화
%>
2012/01/02 02:04 2012/01/02 02:04

우분투가 데비안 커널을 사용하는것인지 서버설정이며 기본명령어가 대부분 데비안과 비슷하다. ㅡ.,ㅡ;
이제껏 사용했던 빨간모자-레뎃(redhat)의 네트웍 설정은 아무런 도움이 되지 못했다.

초기 설치시 DHCP를 사용하게 되어있던 항목을 고정아이피로 바꿔주기 위해서 구글신을 빌었다.
설정은 아래와 같이 하면된다.

우선 서버콘솔박스 앞에서 작업한다면 (리모트로 작업한다면 ifdown하는 동시에 터미널접속이 끊어지므로 주의)

ifdown eth0

로 네트웍카드를 잠시 멈춘후 아래 내용을 etc/network/interfaces에 설정한다.

auto lo
iface lo inet
loopback

auto eth0
iface eth0 inet static
address 192.168.10.136
netmask 255.255.255.0
network 192.168.10.0
broadcast 192.168.10.255
gateway 192.168.10.1
dns-nameservers 168.126.63.1 168.126.63.2
위와 같이 설정후
ifup eth0
으로 네트웍을 설정한다.
리모트로 작업한다면 위의 ifdown이나 ifup을 사용하지 말고

sudo /etc/init.d/networking restart
으로 네트웍을 다시 시작하는것이 좋다.
2011/12/25 19:38 2011/12/25 19:38
개요

eGovFrame에서는 한국정보화진흥원(NIA)에서 제공하는 웹표준 진단 프로그램을 사용 할 수 있는 방법을 제공한다.

설명
웹표준 진단 프로그램은 웹사이트의 웹표준(HTML, CSS)준수 여부를 진단하고 웹표준 문법 오류를 유형별로 구분하여 웹개발자 및 콘텐츠 제작사가 웹사이트를 지속적으로 관리하고 개선 할 수 있도록 도와주는 프로그램이다.
웹표준 진단 프로그램의 상세한 기능 및 사용 방법 및 설치 방법 및 이슈사항은 한국정보화진흥원(http://www.nia.or.kr) 홈페이지 또는 한국정보화진흥원에서 제공하는 웹표준 진단 프로그램 가이드를 참고한다.



2011/12/10 08:59 2011/12/10 08:59
한국형 웹 콘텐츠 접근성 지침 2.0(KICS.OT-10.0003/R1, 2010년 12월 31일 제정)을 기준으로 작성한 웹 접근성을 고려한 콘텐츠 제작 기법 2.0 입니다.


[목 차]

Ⅰ. 웹 접근성의 이해 | 11

Ⅱ. 웹 접근성을 고려한 콘텐츠 제작기법 | 29
원칙 1. 인식의 용이성(Perceivable): 모든 콘텐츠는 사용자가 인식할 수 있어야 한다. | 29
검사항목 1.1.1 (적절한 대체 텍스트 제공) 텍스트 아닌 콘텐츠는 그 의미나 용도를 이해할 수 있도록 대체 텍스트를 제공해야 한다. | 31
검사항목 1.2.1 (자막 제공) 멀티미디어 콘텐츠에는 자막, 원고 또는 수화를 제공해야 한다. | 55
검사항목 1.3.1 (색에 무관한 콘텐츠 인식) 콘텐츠는 색에 관계없이 인식될 수 있어야 한다. | 62
검사항목 1.3.2 (명확한 지시사항 제공) 지시사항은 모양, 크기, 위치, 방향, 색, 소리 등에 관계없이 인식될 수 있어야 한다. | 70
검사항목 1.3.3 (텍스트 콘텐츠의 명도 대비) 텍스트 콘텐츠와 배경 간의 명도 대비는 4.5대 1 이상이어야 한다. | 77
검사항목 1.3.4 (배경음 사용 금지) 자동으로 재생되는 배경음을 사용하지 않아야 한다. | 83
원칙 2. 운용의 용이성(Operable): 사용자 인터페이스 구성요소는 조작 가능하고 내비게이션 할 수 있어야 한다. | 93
검사항목 2.1.1 (키보드 사용 보장) 모든 기능은 키보드만으로도 사용할 수 있어야 한다. | 106
검사항목 2.1.2 (초점 이동) 키보드에 의한 초점은 논리적으로 이동해야 하며 시각적으로 구별할 수 있어야 한다. | 115
검사항목 2.2.1 (응답시간 조절) 시간제한이 있는 콘텐츠는 응답시간을 조절할 수 있어야 한다. | 115
검사항목 2.2.2 (정지 기능 제공) 자동으로 변경되는 콘텐츠는 움직임을 제어할 수 있어야 한다. | 119
검사항목 2.3.1 (깜빡임과 번쩍임 사용 제한) 초당 3~50회 주기로 깜빡이거나 번쩍이는 콘텐츠를 제공하지 않아야 한다. | 123
검사항목 2.4.1 (반복 영역 건너뛰기) 콘텐츠의 반복되는 영역은 건너뛸 수 있어야 한다. | 128
검사항목 2.4.2 (제목 제공) 페이지, 프레임, 콘텐츠 블록에는 적절한 제목을 제공해야 한다. | 133
검사항목 2.4.3 (적절한 링크 텍스트) 링크 텍스트는 용도나 목적을 이해할 수 있도록 제공해야 한다. | 137
원칙 3. 이해의 용이성(Understandable): 콘텐츠는 이해할 수 있어야 한다. | 140
검사항목 3.1.1 (기본 언어 표시) 주로 사용하는 언어를 명시해야 한다. | 142
검사항목 3.2.1 (사용자 요구에 따른 실행) 사용자가 의도하지 않은 기능(새 창, 초점 변화 등)은 실행되지 않아야 한다. | 145
검사항목 3.3.1 (콘텐츠의 선형화) 콘텐츠는 논리적인 순서로 제공해야 한다. | 154
검사항목 3.3.2 (표의 구성) 표는 이해하기 쉽게 구성해야 한다. | 165
검사항목 3.4.1 (레이블 제공) 입력 서식에는 대응하는 레이블을 제공해야 한다. | 174
검사항목 3.4.2 (오류 정정) 입력 오류를 정정할 수 있는 방법을 제공해야 한다. | 183
원칙 4. 견고성(Robust): 웹 콘텐츠는 미래의 기술로도 접근할 수 있도록 견고하게 만들어야 한다. | 201
검사항목 4.1.1 (마크업 오류 방지) 마크업 언어의 요소는 열고 닫음, 중첩 관계 및 속성 선언에 오류가 없어야 한다. | 202
검사항목 4.2.1 (웹 애플리케이션 접근성 준수) 콘텐츠에 포함된 웹 애플리케이션은 접근성이 있어야 한다. | 209


[적용 기술 목차]

적용 기술 1) 이미지 등에 대한 대체 텍스트 제공 | 31
적용 기술 2) 버튼 이미지에 대한 대체 텍스트 제공 | 32
적용 기술 3) Java 애플릿 등에 대한 대체 텍스트 제공 | 32
적용 기술 4) 이미지 맵에 대한 대체 텍스트 제공 | 35
적용 기술 5) 텍스트 이미지, 그래픽 문자 등에 대한 대체 텍스트 제공 | 35
적용 기술 6) 플래시 콘텐츠의 대체 텍스트 제공 | 37
적용 기술 7) 실버라이트 콘텐츠의 대체 텍스트 제공 | 38
적용 기술 8) 그래프 등에 대한 설명문 제공 | 39
적용 기술 9) 생방송 콘텐츠에 대한 대체 텍스트 제공 | 40
적용 기술 10) CAPTCHA에 대한 대체 텍스트 제공 | 41
적용 기술 11) 온라인 시험 등에 대한 대체 텍스트 제공 | 42
적용 기술 12) 대체 텍스트를 빈 공간(alt="")이나 생략해서 제공해야 하는 경우 · 42
적용 기술 13) 열린 자막 제공 | 55
적용 기술 14) 닫힌 자막 제공 | 56
적용 기술 15) 대본 또는 원고 제공 | 56
적용 기술 16) 수화 제공 | 57
적용 기술 17) 음성이 없는 동영상의 대체 수단 제공 | 57
적용 기술 18) 색을 보완하는 텍스트 제공 | 62
적용 기술 19) 색을 보완하기 위하여 글자모양을 이용하는 방법 | 63
적용 기술 20) 색을 보완하기 위하여 무늬 또는 모양을 이용하는 방법 | 64
적용 기술 21) 시각 정보를 이용한 지시문의 보완 | 70
적용 기술 22) 청각 정보를 이용한 지시문의 보완 | 71
적용 기술 23) 배경과 텍스트 콘텐츠의 색 지정 방법 | 77
적용 기술 24) 배경과 텍스트 콘텐츠 색을 기본 값으로 지정하는 방법 | 78
적용 기술 25) 배경과 텍스트 콘텐츠 색을 변경하는 컨트롤의 제공 | 78
적용 기술 26) 재생 시간이 3초 미만인 배경음의 사용 | 83
적용 기술 27) 배경음을 정지 상태로 제공하는 방법 | 84
적용 기술 28) 플래시 콘텐츠의 배경음 자동 실행 방지 | 84
적용 기술 29) 실버라이트 콘텐츠의 배경음 자동 실행 방지 | 89
적용 기술 30) 키보드와 마우스 이벤트 핸들러 제공 | 95
적용 기술 31) 마우스 드래그와 드롭 기능에서의 키보드 이용 보장 | 97
적용 기술 32) 웹 애플리케이션 제공 시 키보드 이용 보장 | 98
적용 기술 33) 실버라이트 플러그인의 키보드 접근 제공 | 101
적용 기술 34) 콘텐츠 화면 순서와 동일한 키보드 내비게이션 순서 제공 | 106
적용 기술 35) 시각적으로 표시 가능한 초점 표시 방법 | 107
적용 기술 36) 플래시에서 키보드 내비게이션 순서 제공 방법 | 110
적용 기술 37) 실버라이트에서 키보드 내비게이션 순서 제공 방법 | 111
적용 기술 38) 제한 시간 연장 방법 제공 | 115
적용 기술 39) 메타 태그를 이용한 페이지 재 이동 방법 제공 | 116
적용 기술 40) 변화하는 콘텐츠를 일시정지 시키고, 일시정지 된 곳으로부터 다시 시작할 수 있도록 제공 | 119
적용 기술 41) 전체 배너를 보여줄 수 있는 방법 제공 | 120
적용 기술 42) 전체 배너의 리스트 제공 | 120
적용 기술 43) 사용자 요구에 의한 업데이트 방법 제공 | 120
적용 기술 44) 깜빡이는 시간이 3초 이내인 콘텐츠만 제공 | 124
적용 기술 45) 경고 페이지 제공 | 125
적용 기술 46) 반복적인 콘텐츠 영역의 시작 부분에 건너뛰기 링크 제공 | 128
적용 기술 47) 건너뛰기 링크의 화면 표시 | 129
적용 기술 48) 웹 페이지의 제목 제공 | 133
적용 기술 49) 콘텐츠 블록의 제목 제공 | 134
적용 기술 50) 프레임 제목 제공 | 134
적용 기술 51) 링크의 목적을 설명하는 링크 텍스트 제공 | 137
적용 기술 52) <html> 태그에 주 사용 언어 지정 | 142
적용 기술 53) 초점 변화에 의해 맥락을 변화시키지 말고, 해당 인터페이스가 활성화(activate)되었을 때 기능을 실행 | 145
적용 기술 54) 명확한 서식 제출(submit) 버튼 제공 | 146
적용 기술 55) 새 창 열림을 사전에 알림 | 146
적용 기술 56) 콘텐츠를 의미 있는 순서로 배열 | 154
적용 기술 57) 스타일을 이용한 글자 간격 조절 | 157
적용 기술 58) 동적으로 생성된 요소는 그것을 유발시킨 요소 바로 뒤에 위치 | 158
적용 기술 59) 표 제목을 <caption>으로 제공 | 165
적용 기술 60) 표의 구조 또는 내용에 대한 요약을 summary로 제공 | 166
적용 기술 61) 표의 헤더 셀과 데이터 셀의 관계 정의 | 167
적용 기술 62) 입력 서식과 <label>의 명시적 관계 제공 | 174
적용 기술 63) <label>을 제공할 수 없는 입력 서식에 title 제공 | 176
적용 기술 64) 여러 개의 유사한 입력 서식 묶기 | 178
적용 기술 65) 입력 값 또는 형식에 대한 예시 제공 | 183
적용 기술 66) 서버측 오류 검사 | 184
적용 기술 67) 클라이언트측 적합성 검사와 본문에 오류 메시지 표시 | 185
적용 기술 68) 오류 메시지를 스크립트 경고창으로 제공 | 194
적용 기술 69) 중요한 서식 제출 시 재확인 절차 제공 | 197
적용 기술 70) 여는 태그와 닫는 태그의 정확한 사용 | 202
적용 기술 71) 속성 이름과 속성 값의 정확한 사용 | 203
적용 기술 72) 태그의 정확한 중첩관계 | 204
적용 기술 73) 표준에 부합하는 태그와 속성 이름, 값 사용 | 205
적용 기술 74) 플러그인 플랫폼이 제공하는 접근성 API 활용 | 209
적용 기술 75) 웹 애플리케이션의 대체 콘텐츠 제공 | 210
적용 기술 76) 용도, 목적지, 종류, 사용법에 맞는 사용자 인터페이스 요소 사용 · 212


[잘못된 사례 목차]

잘못된 사례 1) 의미나 기능이 있는 텍스트 아닌 콘텐츠에 빈 문자열을 대체 텍스트로 제공 | 45
잘못된 사례 2) 복잡한 정보를 하나의 이미지로 표현하고 간단한 대체 텍스트로만 제공 | 47
잘못된 사례 3) 주기적으로 변하는 콘텐츠의 대체 텍스트를 변경하지 않는 경우 | 48
잘못된 사례 4) 의미 있는 정보를 배경 이미지로 제공 | 48
잘못된 사례 5) 빈칸 이미지의 대체 텍스트가 콘텐츠의 인식을 방해하는 경우 | 50
잘못된 사례 6) 도와 같은 텍스트 아닌 콘텐츠에 대한 설명이 불충분한 경우 | 51
잘못된 사례 7) 중요한 정보를 색으로만 제공하는 경우 | 51
잘못된 사례 8) alt 속성이 아닌 title 속성을 이용하여 대체 텍스트 제공 | 52
잘못된 사례 9) QR 코드에서 URL을 대체 텍스트로 알려주지 않는 경우 | 53
잘못된 사례 10) 자막, 원고, 수화 중 어느 한 가지도 제공하지 않는 경우 | 58
잘못된 사례 11) 동영상의 내용을 요약하여 제공하는 자막 또는 원고의 경우 | 59
잘못된 사례 12) 대체 수단에 대한 또 다른 대체 수단임을 알려주지 않는 경우 | 60
잘못된 사례 13) 열린 자막이 수화를 가리는 동영상 | 61
잘못된 사례 14) 동영상의 해상도가 낮아 수화를 볼 수 없는 경우 | 61
잘못된 사례 15) CSS로 인하여 링크임이 구분되지 않는 경우 | 65
잘못된 사례 16) 색으로만 필수 입력 항목을 표시한 경우 | 66
잘못된 사례 17) 오류 메시지를 색으로만 구분하도록 한 경우 | 67
잘못된 사례 18) 그래프를 색으로만 인식하도록 하는 경우 | 68
잘못된 사례 19) 일정 구분을 색으로만 구분하도록 한 경우 | 69
잘못된 사례 20) 방향, 위치 정보만을 이용하여 사용법을 알려주도록 구현한 경우 | 72
잘못된 사례 21) 화면 위치만을 이용하여 객체를 지정한 경우 | 74
잘못된 사례 22) 버튼 모양만을 이용하여 사용법을 알려준 경우 | 74
잘못된 사례 23) 특수 기호만을 이용하여 사용법을 알려준 경우 | 76
잘못된 사례 24) 전경색은 기본 값으로 두고 배경색만을 지정한 경우 | 79
잘못된 사례 25) 배경색은 기본 값으로 두고 전경색만을 지정하는 경우 | 80
잘못된 사례 26) 배경음이 3초 이상 지속되도록 구현한 경우 | 91
잘못된 사례 27) 마우스 오버 또는 키보드 초점을 받으면 자동적으로 배경음이 실행되는 경우 | 92
잘못된 사례 28) 마우스로만 접근 가능한 이미지 버튼을 제공하는 경우 | 101
잘못된 사례 29) 키보드로 접근할 수 없는 플래시 메뉴 | 102
잘못된 사례 30) 마우스로만 접근할 수 있는 링크를 제공한 경우 | 103
잘못된 사례 31) 키보드만으로 이전 입력 서식 이동이 불가능한 경우 | 105
잘못된 사례 32) 초점을 일부러 보이지 않도록 한 경우 | 112
잘못된 사례 33) 키보드 이동순서가 비논리적인 경우 | 113
잘못된 사례 34) 페이지 재 이동 시 회피 수단을 제공하지 않는 경우 | 116
잘못된 사례 35) 마우스로만 정지할 수 있는 콘텐츠를 제공한 경우 | 121
잘못된 사례 36) 자동으로 변하는 배너 | 122
잘못된 사례 37) 깜빡이는 콘텐츠가 많은 경우 | 125
잘못된 사례 38) 발작 가능성이 있는 동영상을 제공한 경우 | 126
잘못된 사례 39) 번쩍임이 지속되는 영상을 제공한 경우 | 127
잘못된 사례 40) 건너뛰기 링크를 제공하지 않은 경우 | 130
잘못된 사례 41) 건너뛰기 링크를 과도하게 제공한 경우 | 131
잘못된 사례 42) 콘텐츠가 다른 페이지에 동일한 제목을 제공한 경우 | 135
잘못된 사례 43) 프레임 제목이 누락된 경우 | 135
잘못된 사례 44) 특수문자(▩▩▩▩)기호를 제공한 경우 | 136
잘못된 사례 45) 목적이나 용도를 알기 어려운 링크 텍스트 | 138
잘못된 사례 46) 목록 선택 상자에서 초점 변경만으로 새 창이 열리는 경우 | 148
잘못된 사례 47) 체크 상자의 선택만으로 페이지가 다시 로드되는 경우 | 150
잘못된 사례 48) 텍스트 입력 서식에 값을 넣으면 자동으로 제출되는 경우 | 151
잘못된 사례 49) 페이지가 로드될 때 자동으로 팝업 창이 열리도록 한 경우 | 152
잘못된 사례 50) 상위 메뉴와 하위 메뉴의 읽는 순서가 잘못된 경우 | 160
잘못된 사례 51) 배치용 표를 잘못 사용한 경우 | 162
잘못된 사례 52) 표를 이미지로 표현하고, 표 제목을 제공하지 않은 경우 | 170
잘못된 사례 53) 이메일 입력 서식의 레이블을 잘못 제공한 경우 | 180
잘못된 사례 54) 오류 정보를 확인한 후 오류 발생 페이지로 돌아가지 못하는 경우 · 199
잘못된 사례 55) 아이디를 중복 선언한 경우 | 206
잘못된 사례 56) 태그의 중첩관계에 오류가 있는 경우 | 207
잘못된 사례 57) 이미지 링크를 자바스크립트로 잘못 구현한 경우 | 214
잘못된 사례 58) 잘못된 이미지 버튼 구현 사례 | 214


출처 : 한국정보화진흥원 | 원문자료

2011/12/10 08:50 2011/12/10 08:50
<SCRIPT language=javascript>
var banner_count = 1;
var cur_banner = 1;
var timeout_id;

function all_banner_clear() {
var banner_id = "";
for( var i=1; i<= banner_count; i++) {
banner_id = 'all_banner_'+ i;
document.all[banner_id].style.visibility='hidden';
}
clearTimeout(timeout_id);
}

function all_banner_change() {
var next_banner = cur_banner+1;
var banner_id = "";
if( next_banner > banner_count ) {
next_banner = 1;
}
banner_id = 'all_banner_'+ cur_banner;
document.all[banner_id].style.visibility='hidden';
banner_id = 'all_banner_'+ next_banner;
document.all[banner_id].style.visibility='visible';

cur_banner = next_banner;
timeout_id = window.setTimeout("all_banner_change()",4000);
}

function all_banner_open() {
if (screen.width==800) {
var w_left = 0;
} else {
var w_left = (screen.width)?(screen.width-600)/2:100;
}
var banner_id = "";
for(var i = 1; i<= banner_count; i++ ) {
banner_id = 'all_banner_' + i;
document.all[banner_id].style.left=w_left;
}
if (getCookie("all_banner_img") == null) {
document.all['all_banner_1'].style.visibility='visible';
selectbox_hidden(all_banner_1);
//timeout_id = window.setTimeout("all_banner_change()",4000);
} else {
document.all['all_banner_1'].style.visibility='hidden';
selectbox_visible();
}
}

function all_banner_cookie() {
if (document.all.cookie_check.checked == true) {
setCookie("all_banner_img", "true", 1);
}
document.all['all_banner_1'].style.visibility = "hidden";
clearTimeout(timeout_id);
}

function getCookie(Name) {
var search = Name + "="
if (document.cookie.length > 0) {
offset = document.cookie.indexOf(search)
if (offset != -1) {
offset += search.length
End = document.cookie.indexOf(";", offset)
if (End == -1)
End = document.cookie.length
return unescape(document.cookie.substring(offset, End))
}
}
}

function setCookie(name, value, expiredays) {
var todayDate = new Date();
todayDate.setDate( todayDate.getDate() + expiredays );
document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + todayDate.toGMTString() + ";"
}

function selectbox_hidden(layer_id) {
var ly = eval(layer_id);

// 레이어 좌표
var ly_left = ly.offsetLeft;
var ly_top = ly.offsetTop;
var ly_right = ly.offsetLeft + ly.offsetWidth;
var ly_bottom = ly.offsetTop + ly.offsetHeight;

// 셀렉트박스의 좌표
var el;

for (i=0; i<document.forms.length; i++) {
for (k=0; k<document.forms[i].length; k++) {
el = document.forms[i].elements[k];
if (el.type == "select-one") {
var el_left = el_top = 0;
var obj = el;
if (obj.offsetParent) {
while (obj.offsetParent) {
el_left += obj.offsetLeft;
el_top += obj.offsetTop;
obj = obj.offsetParent;
}
}
el_left += el.clientLeft;
el_top += el.clientTop;
el_right = el_left + el.clientWidth;
el_bottom = el_top + el.clientHeight;

// 좌표를 따져 레이어가 셀렉트 박스를 침범했으면 셀렉트 박스를 hidden 시킴
if ((ly_right >= el_left && ly_left <= el_right) && (ly_bottom >= el_top && ly_top <= el_bottom))
el.style.visibility = 'hidden';
}
}
}
}

// 감추어진 셀렉트 박스를 모두 보이게 함
function selectbox_visible() {
for (i=0; i<document.forms.length; i++) {
for (k=0; k<document.forms[i].length; k++) {
el = document.forms[i].elements[k];
if (el.type == "select-one" && el.style.visibility == 'hidden')
el.style.visibility = 'visible';
}
}
}
</SCRIPT>


<DIV id=all_banner_1 style="Z-INDEX: 8; LEFT: 400px; VISIBILITY: hidden; POSITION: absolute; TOP: 278px">
<IFRAME style="Z-INDEX: -1; ; LEFT: expression(this.nextSibling.offsetLeft); ;
WIDTH: expression(this.nextSibling.offsetWidth); POSITION: absolute; ;
TOP: expression(this.nextSibling.offsetTop); ; HEIGHT: expression(this.nextSibling.offsetHeight)"
src="about:blank" frameBorder=0></IFRAME>

<TABLE cellSpacing=0 cellPadding=0 width=400 bgColor=#ffffff border=0>
<TR>
<TD align=middle height=10></TD>
</TR>
<TR>
<TD height=5></TD>
</TR>
<TR>
<TD style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px" height=15>
<TABLE cellSpacing=1 cellPadding=0 width="100%" bgColor=#d0d0d0 border=0>
<TR>
<TD>
<TABLE cellSpacing=5 cellPadding=0 width="100%" bgColor=#e7e7e7 border=0>
<TR>
<TD bgColor=#ffffff>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TR>
<TD height=10></TD>
</TR>
<TR>
<TD align=middle height=10>
<TABLE cellSpacing=0 cellPadding=0 width="95%" border=0>
<TR>
<TD width=10>>></TD>
<TD style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; FONT-SIZE: 14px; PADDING-BOTTOM: 0px; PADDING-TOP: 2px; LETTER-SPACING: -0.1em">알려드립니다.!!!</TD>
</TR>
</TABLE>
</TD>
</TR>
<TR>
<TD style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; PADDING-BOTTOM: 0px; PADDING-TOP: 15px" height=10>
공지사항입니다.공지사항입니다.공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.<br />
공지사항입니다.
</TD>
</TR>
<TR>
<TD height=5></TD>
</TR>
</TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TR>
<TD width="3%" bgColor=#f7f7f7 height=30></TD>
<TD width="6%" bgColor=#f7f7f7><INPUT type=checkbox name=cookie_check></TD>
<TD width="36%" bgColor=#f7f7f7>오늘 하루 그만 보기 </TD>
<TD style="PADDING-RIGHT: 5px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px" align=right width="55%" bgColor=#f7f7f7>
<A onfocus=this.blur(); href="javascript:all_banner_cookie();">:: 닫기 ::</A>
</TD>
</TR>
</TABLE>
</TD>
</TR>
</TABLE>
</TD>
</TR>
</TABLE>
</TD>
</TR>
<TR>
<TD align=middle height=10></TD>
</TR>
</TABLE>
</DIV>
<SCRIPT>
all_banner_open();
</SCRIPT>
2011/12/06 11:42 2011/12/06 11:42
function JSONtoString(object) {
var results = [];
for (var property in object) {
var value = object[property];
if (value)
results.push(property.toString() + ': ' + value);
}
return '{' + results.join(', ') + '}';
}
var obj = { "id":"outsider", "sex":"male" };
obj = JSONtoString(obj);
alert(obj); // {id: outsider, sex: male}
alert(typeof obj); // string

만일 prototype.js 를 쓴다면
alert(Object.toJSON(obj)); // {id: outsider, sex: male}
2011/12/06 11:40 2011/12/06 11:40
다중 셀렉트는 자주 사용되는 것이다.
간단히 동작 방법을 알아보자. 아래 방법을 가지고 응용하면 된다.

첫번째.
배열을 읽어와 보여 주는 방법이다. 가장 많이 사용하는 방법으로 데이타가 고정 적일때 사용한다.
배열을 따로 JS 파일을 만들어 읽어 오는 것이 좋다.
만일 배열 데이타가 수시로 바뀐다면 매번 JS 파일을 만들어 주어야 하기 때문에 여간 불편 한것이 아니다.
<form name=pubform method=post action=''>
<select name=selectName onChange="selectSecond(this.selectedIndex-1);">
<option value=''>1차 고르시오</option>
<option value='1'>1</option>
<option value='2'>2</option>
</select>
<select name=secondOption>
<option value=''>2차</option>
</select>
</form>

<script language="javascript">
function selectSecond(n) {
fs = document.pubform.secondOption;
if(n==-1) {
fs.selectedIndex = 0;
return;
} else {
for(j=0;j<arrSecondText[n].length;j++) {
fs.options[j]=new Option(arrSecondText[n][j],arrSecondValue[n][j]);
}
fs.length=arrSecondText[n].length;
}
}

arrSecondText = new Array(2);
arrSecondValue = new Array(2);

arrSecondText[0] = new Array(6);
arrSecondValue[0] = new Array(6);

arrSecondText[0][0] = "선택";
arrSecondValue[0][0] = "";
arrSecondText[0][1] = "옵션11";
arrSecondValue[0][1] = "11";
arrSecondText[0][2] = "옵션12";
arrSecondValue[0][2] = "12";
arrSecondText[0][3] = "옵션13";
arrSecondValue[0][3] = "13";
arrSecondText[0][4] = "옵션14";
arrSecondValue[0][4] = "14";
arrSecondText[0][5] = "옵션15";
arrSecondValue[0][5] = "15";

arrSecondText[1] = new Array(6);
arrSecondValue[1] = new Array(6);

arrSecondText[1][0] = "선택";
arrSecondValue[1][0] = "";
arrSecondText[1][1] = "옵션21";
arrSecondValue[1][1] = "21";
arrSecondText[1][2] = "옵션22";
arrSecondValue[1][2] = "22";
arrSecondText[1][3] = "옵션23";
arrSecondValue[1][3] = "13";
arrSecondText[1][4] = "옵션24";
arrSecondValue[1][4] = "24";
arrSecondText[1][5] = "옵션25";
arrSecondValue[1][5] = "25";
</script>

두번째.

아래 방법도 유용하다. 서버 스크립트로 요청된 셀렉트 값을 즉시 만들어 주는 방법이다.

위 방법보다는 느리지만 자주 바뀌는 데이타라면 아래 방법이 유용하다.

<form name=pubform method=post action=''>
<select name=selectName onChange="selectSecond();">
<option value=''>1차 고르시오</option>
<option value='1'>1</option>
</select>
<select name=secondOption>
<option value=''>2차</option>
</select>
</form>

<script id="selectOption"></script>
<script language="javascript">
function selectSecond() {
selectOption.src = "optionSelect.php";
}
</script>
2011/12/06 11:40 2011/12/06 11:40
별로 권장하지는 않지만 익스플러로에
자바스크립트 에러 표시가 걸리시는 분들은 아래 스크립트를 하단에 삽입하여 보십시오.

모든 에러메시지가 출력 되지 않습니다.

window.onerror = ErrorSetting
var e_msg="";
var e_file="";
var e_line="";
function ErrorSetting(msg, file_loc, line_no) {
e_msg=msg;
e_file=file_loc;
e_line=line_no;
return true;
}

* 자바스크립트 에러 디버그

var isDebugging = true;
function ErrorSetting(msg, file_loc, line_no) {
var e_msg=msg;
var e_file=file_loc;
var e_line=line_no;
var error_d = "Error in file: " + file_loc +
"\nline number:" + line_no +
"\nMessage:" + msg;
if(isDebugging)
alert("Error Found !!!\n--------------\n"+error_d);

return true;
}
window.onerror = ErrorSetting;

조금더 확장해서 ajax로 에러 기록 할 경우

var isDebugging = false;
var logJsErrors = true;
function ErrorSetting(msg, file_loc, line_no) {
var e_msg=msg;
var e_file=file_loc;
var e_line=line_no;
var error_d = "Error in file: " + file_loc +"\nline number:"
+ line_no +
"\nMessage:" + msg;

if(logJsErrors){
theData = "file="+file_loc+"&line="+line_no+"&err="+msg;
ajaxCtrl(
function(){
return true;
},"ajxerrorLogger.php",theData
);
}

if(isDebugging)
alert("Error Found !!!\n--------------\n"+error_d);

return true;
}
window.onerror = ErrorSetting;
2011/12/06 11:40 2011/12/06 11:40
innerHTML 아래와 같이 script 태그를 넣으면 에러가 생기는 것을 볼수 있습니다.
Act.innerHTML = "<scripttype='text/javascript'>document.write('yesyo.com')</script>";

nnerHTML의 문자열에 script 가 들어 가서 문제가 생깁니다.
이것을 아래와 같이 수정하면 문제가 해결됩니다.


Act.innerHTML = "<scr" + "ipt type='text/javascript'>document.write('yesyo.com')</scr" + "ipt>";
2011/12/06 11:39 2011/12/06 11:39