먼저 소스를 올립니다. 조금 길어도 이해를...

아참. 실행결과를 먼저 보고픈 분은 미리보기를 이용해주세요.

▷ 미리보기 : http://www.dreamphp.com/program/20011125_htoh/


// 파일명 htoh.php

<?
/* -----------------------------------------------------------------------------
▶ BiHon's DreamPHP.com (비혼의 조그만 세상)
-master@dreamphp.com
- http://dreamphp.com

▷ 한자를 한글로.
말 그대로 한자를 한글로 바꿔주는 프로그램입니다.

한자를 보다 편하게 읽기 위해, 그리고 폰트피아의 웹폰트를 위해 만들었습니다.
웹폰트의 경우 한자글꼴에 대한 정보가 없기 떄문에 네모박스로 나와 보기가 좋지
않거든요. [한자 글꼴까지 포함하면 웹폰트 용량이 지금보다 몇배는 더 늘어납니다.
그런 것은 싫죠.]

이를 해결하기 위해 한자가 쓰인 곳마다 앞뒤에 <font face=굴림>悲魂</font> 이렇게
태그를 붙여주면 되지만 번거롭기 때문에 자동으로 붙여주는 프로그램도 만들게
되었는데 지금 이 『한자를 한글로』는 그때의 그 함수를 이용했습니다. ^^

"悲魂" 이런 한자를 "비혼(悲魂)" 이런 식으로 바꿔줍니다.
변경이 쉽게 된다고 한자 공부를 게을리 하지 맙시다.


▷ 사용법?
예제를 보도록 하세요. PHP에 대한 기초적인 지식만 있어도 사용엔 어려움이
없을거에요. 그리고 아시죠? 문제점 있으면 연락좀 주세요. 수정할 수 있도록. ^-^/



----------------------------------------------------------------------------- */

function hanja_hangul() { // 한글_한자 데이터 파일 읽어오는 함수
global $hanja; // 전역변수 선언
$temp = "가 伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕
각 刻却各恪慤殼珏脚覺角閣
간 侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間
갈 乫喝曷渴碣竭葛褐蝎鞨
감 勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕
갑 匣岬甲胛鉀閘
강 剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇
개 介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開
객 喀客
갱 坑更粳羹
갹 醵
거 倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸
건 乾件健巾建愆楗腱虔蹇鍵騫
걸 乞傑杰桀
검 儉劍劒檢瞼鈐黔
겁 劫怯迲
게 偈憩揭
격 擊格檄激膈覡隔
견 堅牽犬甄絹繭肩見譴遣鵑
결 抉決潔結缺訣
겸 兼慊箝謙鉗鎌
경 京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨
계 係啓堺契季屆悸戒桂械棨溪界癸磎稽系繫繼計誡谿階鷄
고 古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓
곡 哭斛曲梏穀谷鵠
곤 困坤崑昆梱棍滾琨袞鯤
골 汨滑骨
공 供公共功孔工恐恭拱控攻珙空蚣貢鞏
곶 串
과 寡戈果瓜科菓誇課跨過鍋顆
곽 廓槨藿郭
관 串冠官寬慣棺款灌琯瓘管罐菅觀貫關館
괄 刮恝括适
광 侊光匡壙廣曠洸炚狂珖筐胱鑛
괘 卦掛罫
괴 乖傀塊壞怪愧拐槐魁
굉 宏紘肱轟
교 交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫
구 丘久九仇俱具勾區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜
국 國局菊鞠鞫麴
군 君窘群裙軍郡
굴 堀屈掘窟
궁 宮弓穹窮芎躬
권 倦券勸卷圈拳捲權淃眷
궐 厥獗蕨蹶闕
궤 机櫃潰詭軌饋
귀 句晷歸貴鬼龜
규 叫圭奎揆槻珪硅窺竅糾葵規赳逵閨
균 勻均畇筠菌鈞龜
귤 橘
극 克剋劇戟棘極隙
근 僅劤勤懃斤根槿瑾筋芹菫覲謹近饉
글 契
금 今妗擒昑檎琴禁禽芩衾衿襟金錦
급 伋及急扱汲級給
긍 亘兢矜肯
기 企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒
긴 緊
길 佶吉拮桔
김 金
끽 喫
나 儺喇奈娜懦懶拏拿癩羅蘿螺裸邏那
낙 樂洛烙珞落諾酪駱
난 亂卵暖欄煖爛蘭難鸞
날 捏捺
남 南嵐枏楠湳濫男藍襤
납 拉納臘蠟衲
낭 囊娘廊朗浪狼郎
내 乃來內奈柰耐
냉 冷
녀 女
년 年撚秊
념 念恬拈捻
녕 寧寗
노 努勞奴弩怒擄櫓爐瑙盧老蘆虜路露駑魯鷺
녹 碌祿綠菉錄鹿
논 論
농 壟弄濃籠聾膿農
뇌 惱牢磊腦賂雷
뇨 尿
누 壘屢樓淚漏累縷陋
눈 嫩
눌 訥
뉴 杻紐
늑 勒肋
늠 凜
능 凌稜綾能菱陵
니 尼泥
닉 匿溺
다 多茶
단 丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛
달 撻澾獺疸達
담 啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟
답 沓畓答踏遝
당 唐堂塘幢戇撞棠當糖螳黨
대 代垈坮大對岱帶待戴擡玳臺袋貸隊黛
댁 宅
덕 德悳
도 倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃棹櫂淘滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜
독 毒瀆牘犢獨督禿篤纛讀
돈 墩惇敦旽暾沌焞燉豚頓
돌 乭突
동 仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅
두 兜斗杜枓痘竇荳讀豆逗頭
둔 屯臀芚遁遯鈍
득 得
등 嶝橙燈登等藤謄鄧騰
라 喇懶拏癩羅蘿螺裸邏
락 樂洛烙珞絡落諾酪駱
란 丹亂卵欄欒瀾爛蘭鸞
랄 剌辣
람 嵐擥攬欖濫籃纜藍襤覽
랍 拉臘蠟
랑 廊朗浪狼琅瑯螂郞
래 來崍徠萊
랭 冷掠
략 略
량 亮倆兩凉梁樑粮粱糧良諒輛量
려 侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎
력 力曆歷瀝礫轢靂
련 憐戀攣漣煉璉練聯蓮輦連鍊
렬 冽列劣洌烈裂
렴 廉斂殮濂簾
렵 獵
령 令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡
례 例澧禮醴隷
로 勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵
록 碌祿綠菉錄鹿麓
론 論
롱 壟弄朧瀧瓏籠聾
뢰 儡瀨牢磊賂賚賴雷
료 了僚寮廖料燎療瞭聊蓼遼鬧
룡 龍
루 壘婁屢樓淚漏瘻累縷蔞褸鏤陋
류 劉旒柳榴流溜瀏琉瑠留瘤硫謬類
륙 六戮陸
륜 侖倫崙淪綸輪
률 律慄栗率
륭 隆
륵 勒肋
름 凜
릉 凌楞稜綾菱陵
리 俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉
린 吝潾燐璘藺躪隣鱗麟
림 林淋琳臨霖
립 砬立笠粒
마 摩瑪痲碼磨馬魔麻
막 寞幕漠膜莫邈
만 万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻
말 唜抹末沫茉襪靺
망 亡妄忘忙望網罔芒茫莽輞邙
매 埋妹媒寐昧枚梅每煤罵買賣邁魅
맥 脈貊陌驀麥
맹 孟氓猛盲盟萌
멱 冪覓
면 免冕勉棉沔眄眠綿緬面麵
멸 滅蔑
명 冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴
몌 袂
모 侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌
목 木沐牧目睦穆鶩
몰 歿沒
몽 夢朦蒙
묘 卯墓妙廟描昴杳渺猫竗苗錨
무 務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡
묵 墨默
문 們刎吻問文汶紊紋聞蚊門雯
물 勿沕物
미 味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴
민 岷悶愍憫敏旻旼民泯玟珉緡閔
밀 密蜜謐
박 剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁
반 伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯
발 勃拔撥渤潑發跋醱鉢髮魃
방 倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐
배 倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪
백 伯佰帛柏栢白百魄
번 幡樊煩燔番磻繁蕃藩飜
벌 伐筏罰閥
범 凡帆梵氾汎泛犯範范
법 法琺
벽 僻劈壁擘檗璧癖碧蘗闢霹
변 便卞弁變辨辯邊
별 別瞥鱉鼈
병 丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈
보 保堡報寶普步洑湺潽珤甫菩補褓譜輔
복 伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒
본 本
볼 乶
봉 俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳
부 不付俯傅剖副否咐埠夫婦孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧
북 北
분 分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰
불 不佛弗彿拂
붕 崩朋棚硼繃鵬
비 丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥脾臂菲蜚裨誹譬費鄙非飛鼻
빈 嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻
빙 憑氷聘騁
사 乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝
삭 削數朔索
산 傘刪山散汕珊産疝算蒜酸霰
살 乷撒殺煞薩
삼 三參杉森渗芟蔘衫
삽 揷澁鈒颯
상 上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜
새 塞璽賽
색 嗇塞穡索色
생 牲生甥省笙
서 墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署胥舒薯西誓逝鋤黍鼠
석 夕奭席惜昔晳析汐淅潟石碩蓆釋錫
선 仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮
설 卨屑楔泄洩渫舌薛褻設說雪齧
섬 剡暹殲纖蟾贍閃陝
섭 攝涉燮葉
성 城姓宬性惺成星晟猩珹盛省筬聖聲腥誠醒
세 世勢歲洗稅笹細說貰
소 召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷
속 俗屬束涑粟續謖贖速
손 孫巽損蓀遜飡
솔 率
송 宋悚松淞訟誦送頌
쇄 刷殺灑碎鎖
쇠 衰釗
수 修受嗽囚垂壽嫂守岫峀帥愁戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚
숙 叔塾夙孰宿淑潚熟琡璹肅菽
순 巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴
술 戌術述鉥
숭 崇崧嵩
슬 瑟膝蝨
습 濕拾習褶襲
승 丞乘僧勝升承昇繩蠅陞
시 侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺
식 埴寔式息拭植殖湜熄篒蝕識軾食飾
신 伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅
실 失室實悉
심 審尋心沁沈深瀋甚芯諶
십 什十拾
쌍 雙
씨 氏
아 亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝
악 堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷
안 安岸按晏案眼雁鞍顔鮟
알 斡謁軋閼
암 唵岩巖庵暗癌菴闇
압 壓押狎鴨
앙 仰央怏昻殃秧鴦
애 厓哀埃崖愛曖涯碍艾隘靄
액 厄扼掖液縊腋額
앵 櫻罌鶯鸚
야 也倻冶夜惹揶椰爺耶若野
약 弱掠略約若葯蒻藥躍
양 亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養
어 圄御於漁瘀禦語馭魚齬
억 億憶抑檍臆
언 偃堰彦焉言諺
얼 孼蘖
엄 俺儼嚴奄掩淹
업 嶪業
엔 円
여 予余勵呂女如廬旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎
역 亦力域役易曆歷疫繹譯轢逆驛
연 嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶
열 列劣咽悅涅烈熱裂說閱
염 厭廉念捻染殮炎焰琰艶苒簾閻髥鹽
엽 曄獵燁葉
영 令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領
예 乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預
오 五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳烏熬獒筽蜈誤鰲鼇
옥 屋沃獄玉鈺
온 溫瑥瘟穩縕蘊
올 兀
옹 壅擁瓮甕癰翁邕雍饔
와 渦瓦窩窪臥蛙蝸訛
완 婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑
왈 曰
왕 往旺枉汪王
왜 倭娃歪矮
외 外嵬巍猥畏
요 了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療窈窯繇繞耀腰蓼蟯要謠遙遼邀饒
욕 慾欲浴縟褥辱
용 俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍
우 于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩
욱 勖彧旭昱栯煜稶郁頊
운 云暈橒殞澐熉耘芸蕓運隕雲韻
울 蔚鬱亐
웅 熊雄
원 元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛
월 月越鉞
위 位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏
유 乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類
육 六堉戮毓肉育陸
윤 倫允奫尹崙淪潤玧胤贇輪鈗閏
율 律慄栗率聿
융 戎瀜絨融隆
은 垠恩慇殷誾銀隱
을 乙
음 吟淫蔭陰音飮
읍 揖泣邑
응 凝應膺鷹
의 依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼議醫
이 二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌
익 匿溺瀷益翊翌翼謚
인 人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟
일 一佚佾壹日溢逸鎰馹
임 任壬妊姙恁林淋稔臨荏賃
입 入卄立笠粒
잉 仍剩孕芿
자 仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌
작 作勺嚼斫昨灼炸爵綽芍酌雀鵲
잔 孱棧殘潺盞
잠 岑暫潛箴簪蠶
잡 雜
장 丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長障
재 再哉在宰才材栽梓渽滓災縡裁財載齋齎
쟁 爭箏諍錚
저 佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟
적 勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑
전 佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞
절 切截折浙癤竊節絶
점 占岾店漸点粘霑鮎點
접 接摺蝶
정 丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖靜頂鼎
제 制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊
조 俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥
족 族簇足鏃
존 存尊
졸 卒拙猝
종 倧宗從悰慫棕淙琮種終綜縱腫踪踵鍾鐘
좌 佐坐左座挫
죄 罪
주 主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐
죽 竹粥
준 俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿
줄 茁
중 中仲衆重
즉 卽
즐 櫛
즙 楫汁葺
증 增憎曾拯烝甑症繒蒸證贈
지 之只咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲
직 直稙稷織職
진 唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震
질 侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭
짐 斟朕
집 什執潗緝輯鏶集
징 徵懲澄
차 且侘借叉嗟嵯差次此磋箚茶蹉車遮
착 捉搾着窄錯鑿齪
찬 撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌
찰 刹察擦札紮
참 僭參塹慘慙懺斬站讒讖
창 倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼
채 債埰寀寨彩採砦綵菜蔡采釵
책 冊柵策責
처 凄妻悽處
척 倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻
천 仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆
철 凸哲喆徹撤澈綴輟轍鐵
첨 僉尖沾添甛瞻簽籤詹諂
첩 堞妾帖捷牒疊睫諜貼輒
청 廳晴淸聽菁請靑鯖
체 切剃替涕滯締諦逮遞體
초 初剿哨憔抄招梢椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮
촉 促囑燭矗蜀觸
촌 寸忖村
총 邨叢塚寵悤憁摠總聰蔥銃
촬 撮
최 催崔最
추 墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍
축 丑畜祝竺筑築縮蓄蹙蹴軸逐
춘 春椿瑃
출 出朮黜
충 充忠沖蟲衝衷
췌 悴膵萃
취 贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲
측 側仄厠惻測
층 層
치 侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒
칙 則勅飭
친 親
칠 七柒漆
침 侵寢枕沈浸琛砧針鍼
칩 蟄
칭 秤稱
쾌 快
타 他咤唾墮妥惰打拖朶楕舵陀馱駝
탁 倬卓啄坼度托拓擢晫柝濁濯琢琸託鐸
탄 呑嘆坦彈憚歎灘炭綻誕
탈 奪脫
탐 探眈耽貪
탑 塔搭榻
탕 宕帑湯糖蕩
태 兌台太怠態殆汰泰笞胎苔跆邰颱
택 宅擇澤
탱 撑
터 攄
토 兎吐土討
통 慟桶洞痛筒統通
퇴 堆槌腿褪退頹
투 偸套妬投透鬪
특 慝特
틈 闖
파 坡婆巴把播擺杷波派爬琶破罷芭跛頗
판 判坂板版瓣販辦鈑阪
팔 八叭捌
패 佩唄悖敗沛浿牌狽稗覇貝
팽 彭澎烹膨
퍅 愎
편 便偏扁片篇編翩遍鞭騙
폄 貶
평 坪平枰萍評
폐 吠嬖幣廢弊斃肺蔽閉陛
포 佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑
폭 幅暴曝瀑爆輻
표 俵剽彪慓杓標漂瓢票表豹飇飄驃
품 品稟
풍 楓諷豊風馮
피 彼披疲皮被避陂
필 匹弼必泌珌畢疋筆苾馝
핍 乏逼
하 下何厦夏廈昰河瑕荷蝦賀遐霞鰕
학 壑學虐謔鶴
한 寒恨悍旱汗漢澣瀚罕翰閑閒限韓
할 割轄
함 函含咸啣喊檻涵緘艦銜陷鹹
합 合哈盒蛤閤闔陜
항 亢伉姮嫦巷恒抗杭桁沆港缸肛航行降項
해 亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸
핵 劾核
행 倖幸杏荇行
향 享向嚮珦鄕響餉饗香
허 噓墟虛許
헌 憲櫶獻軒
헐 歇
험 險驗
혁 奕爀赫革
현 俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯
혈 孑穴血頁
혐 嫌
협 俠協夾峽挾浹狹脅脇莢鋏頰
형 亨兄刑型形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨
혜 兮彗惠慧暳蕙蹊醯鞋
호 乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥
혹 惑或酷
혼 婚昏混渾琿魂
홀 忽惚笏
홍 哄弘汞泓洪烘紅虹訌鴻
화 化和嬅樺火畵禍禾花華話譁貨靴
확 廓擴攫確碻穫
환 丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥
활 活滑猾豁闊
황 凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃
회 匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄
획 劃獲
횡 宖橫鐄
효 哮嚆孝效斅曉梟涍淆爻肴酵驍
후 侯候厚后吼喉嗅帿後朽煦珝逅
훈 勛勳塤壎焄熏燻薰訓暈
훙 薨
훤 喧暄煊萱
훼 卉喙毁
휘 彙徽揮暉煇諱輝麾
휴 休携烋畦虧
휼 恤譎鷸
흉 兇凶匈洶胸
흑 黑
흔 昕欣炘痕
흘 吃屹紇訖
흠 欠欽歆
흡 吸恰洽翕
흥 興
희 僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲
힐 詰"; // 깔끔하진 않지만 일부러 포함 [사용의 편리성 증대]
$hanja_data = explode("\n",$temp); unset($temp); // 줄수 구함 & 변수 초기화
// 참고. file() 함수로 동일한 효과를 얻을 수 있으나 위 방법보다 느림
$hanja_line = sizeof($hanja_data); // 줄수 구함
for ($i=0; $i<=$hanja_line; $i++) { // 줄수만큼 반복 (마지막에 다음줄 없기 때문에 마지막값 포함)
unset($len,$hangul,$key); // 변수 초기화
$len = strlen($hanja_data[$i]); // 배열의 길이를 구함
$hangul = substr($hanja_data[$i],0,2); // 앞에서 2바이트 구함 (한글 한자는 2바이트)
for ($j=3;$j<$len;$j+=2) { // 길이만큼 반복 (앞의 한글 한자와 공백 이후부터 2바이트씩 증가)
$key = substr($hanja_data[$i],$j,2); // 한자를 한글자 가져옴
$hanja[$key] = $hangul; // $hanja[한자] = 한글; 기억
}
}
unset($hanja_data,$hanja_len); // 변수 초기화 [괜한 깔끔~ ^^]
}
hanja_hangul(); // ▷ 이렇게 함수 한번 호출함으로써 데이터 입력 끝!

function hanja ($string,$opt="kc",$head="(",$tail=")") {
global $hanja; // 전역변수 선언
$hs = hexdec("CA"); // 한자 첫바이트의 범위 시작값 (10진수로)
// 참고. 한자코드 범위 : XXYYh (XX="CAh~FDh",YY="A1h~FEh");
$len = strlen($string); // 문자열의 길이 구함
$check = 0; // 이어지는 경우 배열 한곳에 기록하기 위한 임시 변수
$c = -1; // 배열은 0부터 시작. 처음 한자 기록시 1 증가시키면 0이 되니까.[허접]
for ($i=0; $i<$len;) { // 문자열의 길이만큼 반복
$temp = ord($string[$i]); // 한바이트의 아스키값을 구함
if ($temp > 127) { // 해당 아스키값이 한글,한자 영역일 경우
if ($temp>=$hs) { // 한자 영역일 경우
if (!$check) { // 체크가 없을 경우
$c++; // 첨자 1 증가
$check = 1; // 이어짐 계속
$data[$c] = substr($string,$i,2); // 한자 한글자 배열에 저장
} else { // 체크가 있을 경우
$data[$c].= substr($string,$i,2); // 한자 한글자 배열에 추가
}
} else { // 한자 영역이 아닐 경우
$check = 0; // 이어짐 끝
}
$i+=2; // 한글, 한자 등 2바이트 영역이기 때문에 2 증가
} else {
$check = 0; // 이어짐 끝
$i++; // 숫자, 영문 등 1바이트 영역이기 때문에 1 증가
}
}
$size = sizeof($data); // 배열의 크기 구함
for ($i=0; $i<$size; $i++) { // 배열의 크기만큼 반복
$len2 = strlen($data[$i]); // ★ 문자열의 길이 구함
for ($j=0; $j<$len2; $j+=2) $hangul[$i].=$hanja[substr($data[$i],$j,2)]; // ★ 한글로 변환
switch ($opt) {
case "k": $string = str_replace($data[$i],$head.$hangul[$i].$tail,$string); break; // 한글만
case "c": $string = str_replace($data[$i],$head.$data[$i].$tail,$string); break; // 한자만
default: $string = str_replace($data[$i],$hangul[$i].$head.$data[$i].$tail,$string); // 한글(한자)로
}
}
return $string; // 문자열 반환
}

?>

// 파일명 : test.php
<?
include "htoh.php"; // PHP 문서 상단에 위 htoh.php 파일을 require나 include 합니다.

$sample = "東海물과 白頭山이 마르고 닳도록 하느님이 保佑하사 우리나라 만세"; // 예제 문자열

echo hanja($sample); // 함수호출
?>

실행하면
동해(東海)물과 백두산(白頭山)이 마르고 닳도록 하느님이 보우(保佑)하사 우리나라 만세
이렇게 출력됩니다.

주어지는 옵션에 따라 한글이나 한자만 출력하도록 지정한다거나, 앞뒤에
붙는 태그를 마음대로 지정할 수 있습니다. ^^

(출처 : "한자를 한글로 변환. ^^" - 『모이자』 조선족 커뮤니티)

HTML 서버 컨트롤


웹 서버 컨트롤이란?

웹 서버 컨트롤은 HTML 컨트롤과 마찬가지로 runat="server" 속성을 가진다. 또한 이 컨트롤을 포함한 웹페이지를 읽을 때 ASP.NET 런타임에 의해 서버에서 해당 기능을 처리하게 된다. 상호 작용할 수 있는 서버 이벤트를 발생시킬 수 있다는 부분도 HTML 서버 컨트롤과 동일하다. 더불어 코드 상에서 해당 컨트롤을 참조할 수 있도록 id 속성을 가진다는 것도 같다. 모든 면에서 HTML 서버 컨트롤과 거의 흡사하다.

무엇이 다른가?

HTML 서버 컨트롤과 웹 서버 컨트롤의 명백한 차이점이 있다면 웹 서버 컨트롤은 HTML 태그 이름 형식을 안취한다는 것이다. 이것은 HTML 서버 컨트롤이 HTML 태그와 긴밀히 연관이 있는 것과는 달리 웹 서버 컨트롤은 HTML 태그와 그다지 연관이 없기 때문이다. HTML 서버 컨트롤은 관련 HTML 태그로 클라이언트 측에 결과를 내보내지만 웹 서버 컨트롤은 관련 임무를 수행하기 위해 필요한 여러 HTML 태그를 합성하여 내보낸다. 대개 웹 서버 컨트롤의 기능이 좀 더 복잡하고 하나의 HTML 태그로는 처리 안되는 경우가 많다. 웹 서커 컨트롤의 오브젝트 모델은 일반적으로 HTML 서버 컨트롤보다 더 복잡하고 추상적이다.

어떻게 생겼나?

간단한 웹 서버 컨트롤의 예를 보면 다음과 같다.

<asp:label id="lblSample" runat="server" />


위의 코드는 단순한 레이블 컨트롤(label control)이다. 이 레이블에 텍스트를 할당하면 <span> 태그로 둘러 싸인 텍스트가 출력되어 나온다. 위의 코드를 이용한 가장 간단한 예제는 다음과 같다.

<%@ Page Language="VB" %>
<script-x runat="server">
        Sub Page_Load(Sender As Object, E As EventArgs)
                lblSample.Text = "Hello World!"
        End Sub
</script-x>

<html>
<head>
<title>ASP.NET Label Web Control Sample</title>
</head>
<body bgcolor="#FFFFFF">

<asp:label id="lblSample" runat="server" />

</body>
</html>


웹 서버 컨트롤의 예

위의 내용이 너무 단순하다고 생각하는 사람을 위한 또 다른 예제를 하나 보여주겠다.

calendarsample.aspx <%@ Page Language="VB" %>
<script-x runat="server">
    Sub btnSubmit_Click(Sender As Object, E As EventArgs)
        If calSample.SelectedDates.Count = 0 Then
            frmDateSelection.Visible = True
            lblSelectedDate.Visible = False
        Else
            frmDateSelection.Visible = False
            lblSelectedDate.Visible = True
            lblSelectedDate.Text = "You Selected: " _
                & calSample.SelectedDate
        End If
    End Sub
</script-x>

<html>
<head>
<title>ASP.NET Calendar Web Control Sample</title>
</head>
<body bgcolor="#FFFFFF">

<div align="center">

<form id="frmDateSelection" action="calendarsample.aspx"
    method="post" runat="server">

<asp:calendar id="calSample" runat="server" />

<asp:button id="btnSubmit" text="Submit Date Selection"
    onClick="btnSubmit_Click" runat="server" />

</form>

<asp:label id="lblSelectedDate" runat="server" />

</div>

</body>
</html>

'Web(웹) Study > ASP .NET' 카테고리의 다른 글

ASP 기본 다지기  (0) 2008.07.31
VBScript개요와 기본적인 사용법  (0) 2008.07.15
데이터그리드로 데이터 전송  (0) 2008.07.15
XML 파일 읽기  (0) 2008.07.15
Global.asa 파일의 구성  (0) 2008.07.15
VBScript-x개요와 기본적인 사용법









우리가 여기에서 배우게 될 VBScript-x는 그 내용의 기준을 Client Side VB Script-x가 아닌 ASP에서 사용될 Server Side VBScript-x를 위주로 학습될 것임을 다시 한번 밝혀두는 바입니다.



1. 작성법

작성하는 방법에는 두가지 방법이 있다.

1. Script-x tag를 이용하는 방법이고




<Script-x Language="VBscript-x" runat="server">

     Some VBScript-x Code....

</Script-x>



2. ASP에서 일반적으로 많이 사용되는 코딩하는 방법이다.


<%@Language=VBScript-x%>

<%

     Some VBScript-x Code....

%>




3. 대소문자의 구별이 없다.



4. 주석은 작은 따움표를(')를 이용하거나 Rem이라는 말을 사용합니다. 한 라인씩 밖에 주석처리가 되지 않습니다.


<%

'이것이 작은 따움표를 이용한 주석문입니다.

Rem 이것은 한 줄전체에 주석을 Rem으로 처리하는 방법입니다.

Dim a '이렇게 코딩과 어울려쓸 때에는 작은 따움표는 문장전체를 주석으로 하는 것과 별반 다를것이 없습니다.

Dim b : Rem 하지만 Rem을 이용한 주석의 경우에는 지금과 같이 조금 다른 방법이 사용됩니다.

%>


5. 마지막으로 긴 코딩이 너무 길어서 화면을 넘어 갈 경우 가독성이 많이 떨어지는데 이를 방지하기 위해 긴코딩의 중간에 줄나눔(Enter를 치고)을 하고 이 2줄의 코딩을 하나로 묶을 수 있는 연결자가 VBScript-x에는 존재한다.

바로 "_" 입니다.

주의) 문자열의 연결은 약간 그 모양새가 다르다. 반드시 해당 문자열을 종결가고 "&_"를 사용하여야 합니다.

그리고 시작하는 문자열에서는 문자열을 시작을 하고 사용하여야합니다.


<%

Dim a

a = "한머리의 즐거운 웹플밍세상" &_

"에 오신 것을 환영합니다." &_

"즐거운 공부되세요"

response._

write a

%>

'Web(웹) Study > ASP .NET' 카테고리의 다른 글

ASP 기본 다지기  (0) 2008.07.31
웹서버 컨트롤  (0) 2008.07.15
데이터그리드로 데이터 전송  (0) 2008.07.15
XML 파일 읽기  (0) 2008.07.15
Global.asa 파일의 구성  (0) 2008.07.15
WebForm 데이터그리드로 데이터 전송 :: 데이터 보내기  


기존의 ASP에서 각각의 ASP 페이지로 데이터를 전송하는 방법으로 쿠키나 히든필드, 쿼리문자열, 세션변수를 주로 사용했다. 이러한 기술은 ASP.NET에서도 사용할 수 있다. 하지만 ASP.NET은 데이터그리드나 데이터리스트 같은 서버사이드 컨트롤이 있기 때문에 기존 ASP 방식을 따라하는 것은 현명하다고 할 수 없겠다.

코드비하인드 vs 서버사이드 스크립트

ASP.NET으로 작업을 한다면 이 두가지 방식중에 하나를 사용해야 한다.


서버사이드 스크립트 : 이 방법은 단순히 aspx파일에 <script-x runat="server">... code ...</script-x>처럼 사용함으로 가능하다. 기존의 ASP와 유사한 방식이다.

코드비하인드 : 이 방식은 aspx와 로직을 구현하는 코드가 있는 vb 또는 cs 파일로 각각 다른 2개의 파일을 생성한다. 후자의 경우 DLL로 컴파일되어 웹서버로 전해진다. 이 방식은 비쥬얼 스튜디오 닷넷의 기본방식이다.

서버사이드 스크립트를 사용하여 데이터그리드로 데이터 전달

다음의 두 aspx를 만들자.


SendingPage.aspx : 데이터그리드 컨트롤에서 값을 입력받아서 두번째 ReceivingPage.aspx로 이동한다.

ReceivingPage.aspx : SendingPage.aspx로 부터 호출되며 데이터그리드의 데이터를 읽어들인다.

데이터 보내기

다음은 SQL서버의 pubs 데이터베이스의 authors 테이블로부터 값을 가져와서 데이터그리드를 생성한다.

<%@ Page Language="VB" ClassName="SendingPage" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script-x runat="server">
Public ReadOnly Property GridData() As System.Object
Get
' Datasource of Datagrid1 is a data table inside a dataset
Return DataGrid1.DataSource
End Get
End Property

Sub Button_Clicked (sender As Object, e As EventArgs)
Server.Transfer("ReceivingPage.aspx")
End Sub

Sub Page_Load(sender As Object, e As EventArgs)
'bind some relevant data to the grid at page load
GetData()
End Sub

Sub GetData()
Dim DS As System.Data.DataSet
Dim Con As System.Data.SqlClient.SqlConnection
Dim Ada As System.Data.SqlClient.SqlDataAdapter
Dim connStr as String
conStr = "server=localhost;uid=sa;pwd=;initial catalog=pubs"

Con = New System.Data.SqlClient.SqlConnection(connStr)

Ada = New System.Data.SqlClient.SqlDataAdapter(_
"select * from authors", Con)

DS = New System.Data.DataSet()
Ada.Fill(DS, "Table1")

'Fill the DataGrid
DataGrid1.DataSource = DS.Tables("Table1").DefaultView
DataGrid1.DataBind()
End Sub
</script-x>

<html>
<body>
<form runat="server">
<b>Visiting SendingPage.aspx</b>
<asp:datagrid id=DataGrid1 runat=server />

<asp:Button id="myButton" OnClick="Button_Clicked"
Text="Send Grid Data" runat=server />
</form>
</body>
</html>




잠시 코드를 보도록 하자. 서버사이드 스크립트 방식을 사용하기 위해서는 먼저 클래스 이름을 선언해야 한다.

<%@ Page Language="VB" ClassName="SendingPage" %>



그 다음으로 다른 페이지로 넘어갈 각 속성을 get을 사용하여 지정한다.

Public ReadOnly Property GridData() As System.Object
Get
' Datasource of Datagrid1 is a data table inside a dataset
Return DataGrid1.DataSource
End Get
End Property



SendingPage.aspx에서 ReceivingPage.aspx로 데이터를 보내기 위해서 사용자가 submit 버튼을 눌러야 한다. 이에 해당하는 button_clicked 이벤트 핸들러가 발동하면 Server.Transfer를 거쳐서 ReceivingPage.aspx로 데이터그리드 컨트롤이 보내지게 된다.

Sub Button_Clicked(sender As Object, e As EventArgs)
Server.Transfer("ReceivingPage.aspx")
End Sub



이번장에서 우리는 서버사이드 스크립트 방식을 사용하는 SendingPage.aspx의 코드와 구조에 대해서 보았다. 다음에는 요청을 받는 ReceivingPage.aspx에 대해서 보겠다.



제공 : 코리아인터넷닷컴, a 2002년 05월 30일


웹폼의 데이터그리드로 데이터 전송(2) (2) : 데이터 받기  


저번장에서 우리는 ASP.NET 웹페이지에서 어떻게 데이터를 보내는지 살펴보았다. 이번에는 ASP.NET에서 데이터를 받기 위해서 어떻게해야 하는지 알아보자.

데이터 받기

데이터를 받는 ReceivingPage.aspx는 사용자가 SendingPage.aspx에서 submit 버튼을 누르고 난후 실행된다. 여기서 데이터가 넘어올 페이지에 대해서 명시할 필요가 있다. 이는 ReceivingPage.aspx의 상단에 @Reference 디렉티브를 명시함으로 해결된다. @Reference 디렉티브는 @Page 디렉티브 아래에 기술하며 어떤곳에서 데이터가 넘어오는지를 알려준다.

<%@ Page Language="VB" %>
<%@ Reference Page="SendingPage.aspx" %>



이렇게함으로 ReceivingPage.aspx는 SendingPage.aspx로 부터 넘어오는 정보를 읽어낼 수 있다. 이 작업을 완수하기 위해서 우선 Context 개체의 핸들러 속성으로부터 HTTP Request 인스턴스를 받아야한다. 이 핸들러는 페이지가 요청되었다는 것을 알려준다. 우리가 SendingPage.aspx 핸들러를 취했을때 필요한 데이터를 잡아낼 수 있다.

Context 개체로부터 핸들러를 얻고 그것을 SendingPage 클래스의 인스턴스로 변환한다. 이 클래스는 SendingPage.aspx의 @Page 디렉티브에 표시되있다. 그리고 SendingPage 타입의 전역변수를 선언하고 Page_Load 이벤트 핸들러에서 이 전역변수에 Context의 핸들러를 저장한다.

<script-x runat="server">
Dim objSendingPage As SendingPage

Sub page_Load()
    If Not IsPostBack Then
       objSendingPage = CType(Context.Handler, SendingPage)
    End If
End Sub

...



페이지가 로드된후 objSendingPage 변수는 SendingPage.aspx의 정보를 담고있는 클래스의 인스턴스를 가지게 된다. 우리는 데이터그리드의 DataSource 속성에 접근하기 위해 이 변수를 사용하면 된다. ReceivingPage.aspx에서 데이터그리드를 하나 만들것인데 이름을 receivingDG라고 하자. 다음의 코드처럼하면 SendingPage의 데이터그리드의 값으로 receivingDG를 생성할 수 있다.

receivingDG.DataSource = objSendingPage.GridData
receivingDG.DataBind()



다음은 ReceivingPage.aspx의 전체 코드이다.

<%@ Page Language="VB" %>
<%@ Reference Page="SendingPage.aspx" %>
<script-x runat="server">

Dim objSendingPage As SendingPage

Sub Page_Load()
    If Not IsPostBack Then
       objSendingPage = CType(context.Handler, SendingPage)
    End If

    receivingDG.DataSource = objSendingPage.GridData
    receivingDG.DataBind()
End Sub
</script-x>

<html>
<body>
    <form id="Form1" method="post" runat="server">
       <b>데이터받기</b>
       <asp:DataGrid id="receivingDG" runat="server" />
    </form>
</body>
</html>



코드비하인드

앞에서 우리는 페이지의 상단에 @Reference라는 디렉티브를 선언하였다. 코드비하인드에서 이 디렉티브는 해도되고 안해도된다. 그리고 서버사이드 스크립트와 똑같이 핸들러를 구하면 된다. 다음은 코드비하인드에서의 코드이다.


public objSendingPage As sendingPage

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If Not IsPostBack Then
       objSendingPage = CType(context.Handler, SendingPage)
    End If

    receivingDG.DataSource = objSendingPage.GridData
    receivingDG.DataBind()

End Sub




여기서는 데이터그리드의 데이터를 이동하는 것을 다루었지만 다른 서버 컨트롤들도 각각의 데이터들에 대한 속성을 가지고 데이터 이동이 가능하다.

'Web(웹) Study > ASP .NET' 카테고리의 다른 글

ASP 기본 다지기  (0) 2008.07.31
웹서버 컨트롤  (0) 2008.07.15
VBScript개요와 기본적인 사용법  (0) 2008.07.15
XML 파일 읽기  (0) 2008.07.15
Global.asa 파일의 구성  (0) 2008.07.15
ASP.NET에서 XML 파일 읽기  


기존의 ASP에서 XML 데이터를 보기 위해서는 두가지 방법을 사용할 수 있었다. 첫째는 ADO 2.5를 사용하여 레코드셋으로 XML 데이터를 불러들여서 이를 웹페이지에 보여주는 방법이다. 두번째는 MSXML 컴포넌트를 사용하여 XML 파일의 내용을 읽어들여서 XSLT를 사용하여 보여주는 방법이다. 이와 유사한 방법으로 만약 여러분이 데이터베이스의 결과처럼 데이터 컬렉션처럼 사용하고 싶다면 XML Stream을 사용하여도 된다.

ASP.NET에서도 역시 다양한 방법을 사용할 수 있다. XSL을 통해서 XML 데이터를 보고자 한다면 서버컨트롤을 사용하면 된다.(<asp:xml runat="server" ... />) 만약 각 노드마다 다양한 작업을 수반한다면 MSXML 컴포넌트와 비슷한 기능을 수행하는 System.Xml 네임스페이스를 추가하여 사용하면 된다. 여기에 데이터 그리드를 추가하여 보여준다면 정렬등의 작업을 아주 손쉽게 할 수 있다. 이 글에서는 XML 데이터를 데이터 그리드를 사용하여 쉽게 보여줄수 있다는 것을 알려줄것이며 또한 XML에 쉽게 기록할 수 있다는 것도 다룰 것이다.

데이터셋에 XML 데이터 넣기

데이터셋은 프로바이더 중립적이다. 이 말은 데이터 프로바이더가 SQL 데이터 프로바이더이건 OLEDB 데이터 프로바이더이건 XML 파일이건간에 가리지 않는다는 것이다. 또한 비연결 데이터 저장 객체이기 때문에 데이터 프로바이더와 한번만 연결하여 데이터를 가지고 온 후에는 데이터 프로바이더와 연결하지 않고도 데이터를 다룰 수 있다. 하지만 데이터리더에 비해 강력한 반면 성능은 나쁘다.

XML 파일로 부터 데이터셋을 생성하는 것은 매우 쉽니다. 단순히 ReadXml 메서드를 호출하면 된다. 다음은 ReadXml 메서드를 사용하여 XML 데이터를 불러들여 데이터셋에 저장하고 데이터그리드에 보여주는 예이다.

<%@ import Namespace="System.Data" %>
<script-x runat="server">
sub Page_Load(sender as Object, e as EventArgs)
Dim myDataSet as New DataSet()

myDataSet.ReadXml(Server.MapPath("books.xml"))

dgBooks.DataSource = myDataSet
dgBooks.DataBind()

dgBooksPretty.DataSource = myDataSet
dgBooksPretty.DataBind()
end sub
</script-x>

<html>
<body>
<b>The Contents of the XML File
<a href="/demos/books.xml"><code>books.xml</code></a></b><br />
<asp:datagrid id="dgBooks" runat="server" />

<p align="center">
<b>A Nicer Looking DataGrid Representation of the XML File
<a href="/demos/books.xml"><code>books.xml</code></a></b><br />
</p>
<asp:datagrid id="dgBooksPretty" runat="server"
AutoGenerateColumns="False"
Font-Name="Verdana"
Font-Size="Small"
HorizontalAlign="Center"
ItemStyle-BackColor="#FFFFCC"
AlternatingItemStyle-BackColor="#EEEEEE">

<HeaderStyle BackColor="Red" HorizontalAlign="Center"
ForeColor="White" Font-Bold="True" />

<Columns>
<asp:BoundColumn HeaderText="Title" DataField="title" />
<asp:BoundColumn HeaderText="Author" DataField="author" />
<asp:BoundColumn HeaderText="Year" DataField="year" />
</Columns>
</asp:datagrid>




Import 디렉티브를 사용하여 System.Data 네임스페이스를 명시하였다. 이 네임스페이스에는 데이터셋 클래스각 포함되어 있다. 다음에는 Page_Load 이벤트 핸들러에서 새로운 데이터셋을 하나 생성하고 ReadXml 메서드를 사용하여 book.xml 파일에서 읽어온 내용을 데이터셋에 저장하고 데이터그리드의 DataSource 속성에 데이터셋을 지정하고 DataBind() 메서드를 사용하여 웹페이지에 보여준다.

데이터셋의 내용을 XML 파일로 기록

앞에서 보았듯이 XML 파일에서 데이터를 읽어들여서 생성한 데이터셋에 저장하는 것이 쉽다는 것을 보았다. 이번에는 반대로 데이터셋의 내용을 XML 파일에 저장하는 것을 보도록 하자. 이때는 WriteXml 메서드를 사용하면 된다.

<%@ Import Namespace="System.Data" %>
<script-x runat="server">
sub Page_Load(sender as Object, e as EventArgs)
Dim myDataSet as New DataSet()

'Populate the DataSet somehow
...

'Write the DataSet's contents to an XML file
myDataSet.WriteXml(filename)



명시한 파일로 XML 데이터를 쓰는 것을 보여주고 있다. 만약 여러분이 XML 데이터뿐만 아니라 XML 스키마까지 같이 기록하고 싶다면 myDataSet.WriteXml(filename, XmlWriteMode.WriteSchema)라고 수정해주면 된다. ADO 2.5를 사용해도 이같은 기능을 수행할 수 있지만 사람이 보기에는 매우 어렵다. 하지만 ADO.NET의 데이터셋은 가독성도 좋다. 매우 직관적이 않은가?

'Web(웹) Study > ASP .NET' 카테고리의 다른 글

ASP 기본 다지기  (0) 2008.07.31
웹서버 컨트롤  (0) 2008.07.15
VBScript개요와 기본적인 사용법  (0) 2008.07.15
데이터그리드로 데이터 전송  (0) 2008.07.15
Global.asa 파일의 구성  (0) 2008.07.15
 

이파일은 아주 유용한 파일입니다... 유용하다 못해 없으면 넘넘 짜증이 나죠. 이파일이 없다구 생각하면 프로그램이 넘 복잡해 질 수도 있을 것입니다. 아주 유용한 파일 이죠... 잘 알아 두시면 정말 편리 하게 사용 하실 수 있으실 겁니다. 그리고 지금 제가 아래 설명할 것들을 이해하셔야 Application 객체들어갈때 이해가 달 되실 겁니다. 눈크게 뜨고 보도록하죠............캬캬

Global.asa 파일의 구성...

이 파일의 구성은 크게 4가지로 나눕니다. 구성이라기 보다는 함수 라구 해야하나.. 어재든 크게 4가지로 나누어져 있습니다.

Sub Application_OnStart

End Sub

Sub Application_OnEnd


End Sub

Sub Session_OnStart

End Sub

Sub Session_OnEnd

End Sub

이렇게 4가지 함수가 들어가 있습니다.

우선 global.asa파일을 만듭니다. 코딩은...


  • <SCRIPT-x LANGUAGE="VBScript-x" RUNAT="Server">

    Sub Application_OnStart

    End Sub

    Sub Application_OnEnd


    End Sub

    Sub Session_OnStart

    End Sub

    Sub Session_OnEnd

    End Sub

    </SCRIPT-x>


일단은 이렇게 하시고 저장 하시기 바랍니다.

각 함수는 언제 실행되는가???

global.asa파일의 실행...

접속자가 asp파일을 실행하면 .. 그러니까 어떤 사람이 특정 사이트(물론 asp로 된 사이트) 에 들어오면 우리 눈에는 보이지 않지만 그 사이트의 global.asa파일이 먼저 실행 되고 나서 접속자가 실행한 asp파일이 실행 됩니다. global.asa파일이 없다면 사용자가 요청한 asp파일이 실행되겠죠.. (당연한 말이죠...T.T)

Sub Application_OnStart와 Sub Session_OnStart함수의 실행

실행될때 현재 사이트에 아무런 사람이 없다면, 음... 현재 사이트에 아무선 접속자가 없다면 Sub Application_OnStart 부터 End Sub 까지 실행이 되고 난후에 Sub Session_OnStart 부터 Session_OnEnd까지 실행이 됩니다. 하지만 현재 사이트에 한명이상이 있다면 그러니까.. 두번째부터 들어오는 사용자 부터는 Sub Application_OnStart는 실행되지 않고 Sub Session_OnStart만이 실행됩니다. 이것은 매우 중요합니다. 꼭 알아두세요.. 꼭 기억하시길....

Sub Application_OnEnd와 Sub Session_OnEnd함수의 실행

그러면 Sub Session_OnEnd와 Sub Application_OnEnd
은 언제 실행이 될까요.. 이것들은 Session이 아웃될때(이것에 대한것은 sessoin 객체를 설명할때 설명드리죠) 실행이 되고, Session이 아웃될때 그 접속자가 마지막 접속자라면, 다시 말해 이 사람이 나가면 사이트에 한명의 사용자도 없을때는 Sub Application_OnEnd 함수까지 실해이 됩니다. 반대로 이 사람이 나가도 현재 사이트에 접속되있는 사람이 있다면, Sub Session_OnEnd함수만 실행이 됩니다. Sub Application_OnEnd이 함수는 실행되지 않습니다. 이것도 아주 매우 정말로 중요합니다. 꼭 기억해 두세요...

global.asa에 대한건 여기까지 입니다.... ^^;

'Web(웹) Study > ASP .NET' 카테고리의 다른 글

ASP 기본 다지기  (0) 2008.07.31
웹서버 컨트롤  (0) 2008.07.15
VBScript개요와 기본적인 사용법  (0) 2008.07.15
데이터그리드로 데이터 전송  (0) 2008.07.15
XML 파일 읽기  (0) 2008.07.15
<html>
<head>
<title>레이어 셀렉트메뉴</title>
<script type="text/javascript" src="http://www.blog4u.kr/attach/1/cfile8.uf@1336903C504870822B3785.js">
</script>
<style>
.selectBoxSelectedAreaGlobal {color:#626262; font-size:12px; font-family:dotum; font-weight:normal; background-color:#f5f5f5; padding-top:2px; line-height:17px; padding-left:5px; letter-spacing:-1px;}
.selectBoxSelectedAreaFocusGlobal {color:#626262; font-size:12px; font-weight:normal; font-family:dotum; background-color:#f5f5f5; padding-top:2px; line-height:17px; padding-left:5px; letter-spacing:-1px;}
.selectBoxOptionGlobal {color:#626262; font-size:12px; font-family:dotum; font-weight:normal; background-color:#f5f5f5; padding-top:2px; line-height:17px; padding-left:5px; letter-spacing:-1px;}
.selectBoxOptionOverGlobal {color:#626262; font-size:12px; font-family:dotum; font-weight:normal; background-color:#e6e6e6; padding-top:2px; line-height:17px; padding-left:5px; letter-spacing:-1px;}
.selectBoxOptionInnerLayer {overflow:auto;background-color:#f5f5f5;
    scrollbar-face-color:#F3F3F3;
    scrollbar-shadow-color:#6C6C6C;
    scrollbar-highlight-color:#FFFFFF;
    scrollbar-3dlight-color:#C9C9C9;
    scrollbar-darkshadow-color:#FFFFFF;
    scrollbar-track-color:#F3F3F3;
    scrollbar-arrow-color:#000000;
}
</style>
</head>
<body>
    <select id="leftSelectBoxGlobal" style="width:159px;height:21px;display:none;">
        <option value="1">서명</option>
        <option value="2">저자</option>
        <option value="3">출판사</option>
    </select>
    <script>
        makeSelectBoxGlobal("leftSelectBoxGlobal", "selectBoxSelectedAreaGlobal", "#e6e6e6", "http://www.blog4u.kr/attach/1/cfile8.uf@12669C3A50487083080605.gif", "selectBoxOptionGlobal", "selectBoxSelectedAreaFocusGlobal", "selectBoxOptionOverGlobal");
</script>
</body>
</html>  
사용자 삽입 이미지
소스의 기본-샵의 레이아웃 전체 사이즈가 900픽셀이고 자동스크롤되면서 슬라이드되는 것을 좌측과 우측에 동시 적용이 되며, 좌측과 우측에 나타날 내용의 폭을 48픽셀로 하였슴(이 픽셀값은 자신의 샵에 맞게 수정 가능).
스킨폴더의 head.html 파일의 임의의 곳에 추가하시면 됩니다.

[소스 시작]
[code2]<!--왼쪽스크롤시작-->
<script language="JavaScript">
<!--
// 스크롤메뉴
var bNetscape4plus = (navigator.appName == "Netscape" && navigator.appVersion.substring(0,1) >= "4");
var bExplorer4plus = (navigator.appName == "Microsoft Internet Explorer" && navigator.appVersion.substring(0,1) >= "4");

function always_pos1()
{
var yMenuFrom, yMenuTo, yButtonFrom, yButtonTo, yOffset, timeoutNextCheck;

if ( bNetscape4plus ) { // 네츠케이프 용 설정
yMenuFrom = document["scrollmenu1"].top;
yMenuTo = top.pageYOffset + 100; // 화면 위쪽으로 부터의 위치
}
else if ( bExplorer4plus ) { // 익스플로러 용 설정
yMenuFrom = parseInt (scrollmenu1.style.top, 10);
yMenuTo = document.body.scrollTop + 100; // 화면 위쪽으로 부터의 위치
}

timeoutNextCheck = 500;

if ( Math.abs (yButtonFrom - (yMenuTo + 152)) < 6 && yButtonTo < yButtonFrom ) {
setTimeout ("always_pos1()", timeoutNextCheck);
return;
}

if ( yButtonFrom != yButtonTo ) {
yOffset = Math.ceil( Math.abs( yButtonTo - yButtonFrom ) / 10 );
if ( yButtonTo < yButtonFrom )
yOffset = -yOffset;

if ( bNetscape4plus )
document["divLinkButton"].top += yOffset;
else if ( bExplorer4plus )
divLinkButton.style.top = parseInt (divLinkButton.style.top, 10) + yOffset;

timeoutNextCheck = 10;
}
if ( yMenuFrom != yMenuTo ) {
yOffset = Math.ceil( Math.abs( yMenuTo - yMenuFrom ) / 20 );
if ( yMenuTo < yMenuFrom )
yOffset = -yOffset;

if ( bNetscape4plus )
document["scrollmenu1"].top += yOffset;
else if ( bExplorer4plus )
scrollmenu1.style.top = parseInt (scrollmenu1.style.top, 10) + yOffset;

timeoutNextCheck = 10;
}

setTimeout ("always_pos1()", timeoutNextCheck);
}
function OnLoad()
{
var y;

// 프레임 에서 벗어나게 하는 함수입니다. 프레임에 넣으려면 삭제하세요
if ( top.frames.length )
// top.location.href = self.location.href;

// 페에지 로딩시 포지션
if ( bNetscape4plus ) {
document["scrollmenu1"].top = top.pageYOffset + 100;
document["scrollmenu1"].visibility = "visible";
}
else if ( bExplorer4plus ) {
scrollmenu1.style.top = document.body.scrollTop + 100;
scrollmenu1.style.visibility = "visible";
}

always_pos1();
return true;
}
// -->
</script>
<!--왼쪽스크롤끝-->
<!---left banner start-->
<div id="scrollmenu1" style="position:absolute;right:expression(((document.body.clientWidth+900)/2)-0);top:100px;z-index:101">
<table width="48" border=0 cellpadding=0 cellspacing=0>
<tr>
<td>
<!-- 좌측에 보여주고자 하는 내용-->
</td>
</tr>
</table>
<script>OnLoad();</script>
</div>
<!--left banner stop--->

<!--오른쪽스크롤시작-->
<script language="JavaScript">
<!--
// 스크롤메뉴
var bNetscape4plus = (navigator.appName == "Netscape" && navigator.appVersion.substring(0,1) >= "4");
var bExplorer4plus = (navigator.appName == "Microsoft Internet Explorer" && navigator.appVersion.substring(0,1) >= "4");

function always_pos2()
{
var yMenuFrom, yMenuTo, yButtonFrom, yButtonTo, yOffset, timeoutNextCheck;

if ( bNetscape4plus ) { // 네츠케이프 용 설정
yMenuFrom = document["scrollmenu2"].top;
yMenuTo = top.pageYOffset + 100; // 화면 위쪽으로 부터의 위치
}
else if ( bExplorer4plus ) { // 익스플로러 용 설정
yMenuFrom = parseInt (scrollmenu2.style.top, 10);
yMenuTo = document.body.scrollTop + 100; // 화면 위쪽으로 부터의 위치
}

timeoutNextCheck = 500;

if ( Math.abs (yButtonFrom - (yMenuTo + 152)) < 6 && yButtonTo < yButtonFrom ) {
setTimeout ("always_pos2()", timeoutNextCheck);
return;
}

if ( yButtonFrom != yButtonTo ) {
yOffset = Math.ceil( Math.abs( yButtonTo - yButtonFrom ) / 10 );
if ( yButtonTo < yButtonFrom )
yOffset = -yOffset;
if ( bNetscape4plus )
document["divLinkButton"].top += yOffset;
else if ( bExplorer4plus )
divLinkButton.style.top = parseInt (divLinkButton.style.top, 10) + yOffset;
timeoutNextCheck = 10;
}
if ( yMenuFrom != yMenuTo ) {
yOffset = Math.ceil( Math.abs( yMenuTo - yMenuFrom ) / 20 );
if ( yMenuTo < yMenuFrom )
yOffset = -yOffset;
if ( bNetscape4plus )
document["scrollmenu2"].top += yOffset;
else if ( bExplorer4plus )
scrollmenu2.style.top = parseInt (scrollmenu2.style.top, 10) + yOffset;
timeoutNextCheck = 10;
}
setTimeout ("always_pos2()", timeoutNextCheck);
}
function OnLoad()
{
var y;
// 프레임 에서 벗어나게 하는 함수입니다. 프레임에 넣으려면 삭제하세요
if ( top.frames.length )
// top.location.href = self.location.href;
// 페이지 로딩시 포지션
if ( bNetscape4plus ) {
document["scrollmenu2"].top = top.pageYOffset + 100;
document["scrollmenu2"].visibility = "visible";
}
else if ( bExplorer4plus ) {
scrollmenu2.style.top = document.body.scrollTop + 100;
scrollmenu2.style.visibility = "visible";
}
always_pos2();
return true;
}
// -->
</script>
<!--오른쪽스크롤끝-->
<!---right banner start-->
<div id="scrollmenu2" style="position: absolute; left: expression(((document.body.clientWidth+900)/2)-0); top:100px;z-index:102">
<table width="48" border=0 cellpadding=0 cellspacing=0>
<tr>
<td>
<!-- 우측에 보여주고자 하는 내용-->
</td>
</tr>
</table>
<script>OnLoad();</script>
</div>
<!--right banner stop>[/code2]
DTD
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ko" xml:lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


CSS
* {
    font-family:Tahoma, Gulim;
    font-size:12px;
    color:#333333;
    margin:0;
    padding:0;
    line-height:120%;
}
ul, ol {
    list-style:none;
}
a {
    text-decoration:none;
}
img {
    float:left;
    border:0;
}
div {
    font-size:0;
}
input {
    line-height:130%;
}
input, textarea {
    font-size:11px;
    color:#333333;
}
table.collapse {
    border-collapse:collapse;
    margin:1px 0 0 1px;
}
table.collapse td {
    border-style:solid;
    border-width:1px;
}

table.collapse {
    margin:expression("0"); /* validator 통과하고 싶다면 <!--[if IE]> 이용 */
}

#wrap {
    position:relative;
    width:980px;
    margin:0 auto;
}


#wrap 은 가운데 정렬용 div 입니다.

table.collapse 는 FF 가 문제 입니다.
셀에 테두리 다 쳐 놓고 margin 의 left 와 top 을 -1 해서 테두리를 겹치는거네요.
그래서 테이블 자체가 좌,상단이 -1 됩니다.
border-width 에 의해 - 가 더 많이 되므로 일일히 처리해야 합니다.

그리고 IE 에서 block 요소 안에서 float 를 하면, 맨 마지막 요소의 margin-bottom 이 안먹습니다.
block 요소 자체에 padding 을 주고 div 하나 더 씌우는 등의 작업이 필요합니다.

IE6 에서 중첩 block float 요소의 margin left,right 가 x2 되는 현상은 display:inline 으로 해결합니다.
float 가 되면 display:none 이 아닌 이상 display 속성이 무시되는것이 표준이기 때문에,
표준에서 벗어난 것은 아닙니다.

또, IE6 에서 margin-top:-10px 처럼 이용하면 위가 잘립니다.
block 중첩한 후 position:relative; top:-10px; 로 해야 합니다.

IE6 에서 div 는 속이 비어도 기본 글꼴 크기가 적용됩니다. 때문에 font-size:0 입니다.
글을 쓸 때는 p 태그를 쓰면 됩니다.
[editableText.js]

function createEditor(callback){
  var editor = new Editor();
  editor.callback = callback;

  try{
      document.addEventListener('click',clickEventHandler,false);
  }catch(e){
      document.attachEvent('onclick',clickEventHandler);
  }

  return editor;
}
function clickEventHandler(e){
  var evt = e || window.event;
  var target;

  if(evt.target){
      target = evt.target;
  }else{
      target = evt.srcElement;
  }

  if(target.className.search('editable') > -1){
      editor.editing(target);
  }
}

function Editor(){
  this.autosave = false;
  this.source = null;
  this.callback = null;
  this.container = null;
  this.frm = document.createElement('INPUT');
  this.frm.className = 'editor';
  this.frm.model = this;

  this.frm.onkeydown = function(e){
      var evt = e || window.event;

      if(evt.keyCode == 13){
          try{
              evt.preventDefault();
          }catch(ex){
              evt.returnValue = false;
          }

          this.model.complete();
      }
  }

  this.frm.onblur = function(e){
      if(this.model.autosave == true){
            this.model.complete();
        }else{
            this.model.cancel();
        }
  }
}

Editor.prototype.editing = function(obj){
  try{
      this.container = obj;

      if(obj.hasChildNodes() == false){
          obj.appendChild(document.createTextNode(''));
      }

      this.source = obj.firstChild;
      this.frm.value = this.source.nodeValue;
      this.frm.style.width = '100%';

      if(this.container.style.textAlign != undefined && this.container.style.textAlign != ''){
            this.frm.style.textAlign = this.container.style.textAlign;
        }else if(this.container.align != undefined && this.container.align != ''){
            this.frm.style.textAlign = this.container.align;
        }else{
            this.frm.style.textAlign = 'left';
      }

      this.container.replaceChild(this.frm,this.source);
      this.frm.focus();
      this.frm.value += '';
  }catch(e){
  }
}

Editor.prototype.cancel = function(){
  this.finish();
}

Editor.prototype.complete = function(){
  this.save();
  this.finish();

  if(this.callback instanceof Function){
      this.callback(this.container);
  }else{
  }
}

Editor.prototype.finish = function(){
  this.container.replaceChild(this.source,this.frm);
}

Editor.prototype.save = function(){
  this.source = document.createTextNode(this.frm.value);
}


모듈을 페이지에 로드시키고 에디터 객체를 생성하면 준비는 끝.

<script type="text/javascript" src="editableText.js"></script>
<script type="text/javascript">
var editor = createEditor(callback);

function callback(obj){
}
</script>


사용자가 문서의 텍스트 부분을 클릭하면 텍스트 노드를 담고있는 container 객체의 className 속성에 'editable' 가 있는지 확인한 후 에디터 객체(INPUT)에 텍스트를 전달하고 텍스트노드와 에디터를 바꿔치기한다.

에디터는 싱글턴(singleton)으로 하나의 에디터가 문서 전역에서 동작한다.

autosave 속성이 true로 설정되면 에디터에서 수정후 포커스가 다른 곳으로 이동하면 자동으로 수정한 내용이 원본 텍스트 노드에 그대로 적용이 되고 반대로 false면 원 상태로 되돌린다.
autosave를 적용하지 않으면 사용자는 데이터 수정 후 엔터키를 눌러야 수정한 내용이 반영된다.

callback 함수를 지정하면 save() 메서드를 실행 후 callback 함수를 호출한다.
xmlHttpRequest 객체를 사용할 경우 동적으로 DB의 내용을 수정 할 수 있다.

원래는 source를 <span>태그에만 할당 하려했으나 셀작업에 쓰는게 더 좋을 것 같아서 'edtiable'을 className으로 갖는 모든 객체로 수정하였다.
하지만 변경 후 맘에 안드는 것이, 원글 너비(offsetWidth)의 반영이다.
<span>,<div>등 block 객체에 edtiable 을 적용하면 원글의 사이즈에 맞게 에디터의 사이즈를 조절할 수 있는 반면 테이블의 셀(TD)에 적용 할 경우 테이블 셀 크기에 맞춰버리니 맞춤 사이즈는 포기할 수 밖에 없다....
방법을 아시는 분은 코멘트를 부탁...^^;


*주의*
Editor는 멀티라인 편집을 지원하지 않는다.
<span>,<td>,<div>,<p> 의 엘리먼트에서 오직 가장 처음에 위치한 텍스트 노드를 편집 할 수 있다.
멀티라인 편집을 위해 Editor 객체에 에디터를 input과 textarea 두개로 구분하여 childNodes.lenth로 멀티라인 여부를 판별한 후 해당 엘리먼트에 맞는 에디터를 쓰게끔 리펙토링을 시도하였으나,
editing() 메서드와 finish() 메서드에서 replaceChild를 쓸 수 없고,
텍스트 노드 사이의 태그를 검출해야 하며, 멀티라인의 경우 줄바꿈 처리를 하는 등 코드가 복잡해지는 관계로 단문 인라인 엘리먼트에 이 스크립트를 사용할 것을 당부하는 것으로 대신한다.

'Web(웹) Study > Java Script' 카테고리의 다른 글

레이어 셀렉트메뉴  (0) 2008.07.15
가로정렬 좌우 스크롤 배너  (0) 2008.07.09
HTC for rainEditor v 10(위즈윅 웹편집기)  (0) 2008.07.09
OFCJS (Open Flash Chart)  (2) 2008.07.09
아이프레임 크기 자동조절  (0) 2008.07.03

- Install files & The Code


지도 HTC 서비스를 위해서는 몇가지 파일이 필요합니다.
     1. [ bindings.xml ]- FireFox 용 HTC binding file
     2. [ moz-behaviors.xml ] - FireFox 용 HTC behaviors
     3. [ rainmap.htc ] - 레인맵 HTC 파일
     4. 당 서비스는 비상업용 사이트에서는 이용가능하나 상업용 사이트는 사용을 불허합니다.


Create HTC Style

<style>

.rainmap {
    behavior: url(/HTCCSS/rainmap.htc); /* for IE */
    -moz-binding: url(/HTCCSS/bindings.xml#rainmap.htc); /* for FireFox */
}
</style>



- Yahoo Map


야후 맵을 가져오기
     . 장점 : 검색정보가 아주 좋음, 위성 지도가 지원됨(성능은 별로)
     . 단점 : 위성 지도가 별로 선명 하지 않음, 지도 색상이 좋음(내생각)


사용자 삽입 이미지

 
Create HTML Code

    <div class="rainmap">

<m_type data='Y' ></m_type>
<m_zoom data='15' ></m_zoom>
<m_view data='1' ></m_view>
</div>



- Google Map


구글 맵을 가져오기

     . 장점 : 위성 사진이 선명함
     . 단점 : 한국 지도가 거의 사용이 불가함(쓸모가 없음)


사용자 삽입 이미지

 
Create HTML Code

<div class="rainmap">

<m_type data='G' ></m_type>
<m_zoom data='15' ></m_zoom>
<m_view data='1' ></m_view>
</div>



- Naver Map


네이버 맵을 가져오기
     . 장점 : 도로 정보가 좋음
     . 단점 : 위성 지도가 없음. 한국 지도만 지원됨


사용자 삽입 이미지

 
Create HTML Code

    <div class="rainmap">

        <m_type data='N' ></m_type>
        <m_zoom data='15' ></m_zoom>
        <m_view data='1' ></m_view>
    </div>




- Code Explain


기본 태그의 사용 규칙은 다음과 같습니다.
     . 구조 : <tag data='value' ></tag>
     . 주의 : <tag data='value' /> // 이런 방식은 FireFox 에서 안됨    



Create HTML Code

<div class="rainmap" style="width:500px;height:300px" > // 지도의 크기 지정

<m_type data='N' ></m_type> // 지도 API 서비스 회사 (N: 네이버, G : 구글, Y : 야후)
<m_zoom data='15' ></m_zoom> // 확대 레벨 (1 - 20)
<m_view data='1' ></m_view> // 0 : 지도, 1 : 위성지도, 2, 하이브리드 지도
<m_lat data='375559080' ></m_lat> // 위도 37.5559080 X 10000000
<m_lon data='1269706150' ></m_lon> // 경도 126.9706150 X 10000000
</div>

rainhtcMAP_API.zip

'Web(웹) Study > OpenAPI' 카테고리의 다른 글

OpenAPI 라는 것은...?  (0) 2008.09.02
국내외 오픈 API  (0) 2008.09.02

HTC for rainEditor v 10(위즈윅 웹편집기)



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

- Install files & The Code


레인에디터 HTC 서비스를 위해서는 몇가지 파일이 필요합니다.
1. [ bindings.xml ]- FireFox 용 HTC binding file
2. [ moz-behaviors.xml ] - FireFox 용 HTC behaviors
3. [ raineditor.htc ]- 레인에디터 HTC 파일
4. 당 서비스는 비상업용 사이트에서는 이용가능하나 상업용 사이트는 사용을 불허합니다.


<script TYPE="text/JavaScript" LANGUAGE="JavaScript1.2"
    SRC="http://file.cafen.net/editor/prototype.js"></script>
<script TYPE="text/JavaScript" charset="euc-kr" LANGUAGE="JavaScript1.2"
    SRC="http://file.cafen.net/editor/rain_util.js"></script>
<script TYPE="text/JavaScript" LANGUAGE="JavaScript1.2"
    SRC="http://file.cafen.net/editor/swfupload.js"></script>
<script TYPE="text/JavaScript" charset="utf-8" LANGUAGE="JavaScript1.2"
    SRC="http://file.cafen.net/editor/xmlhttp.js"></script>
<script TYPE="text/JavaScript" charset="euc-kr" LANGUAGE="JavaScript1.2"
    SRC="http://file.cafen.net/editor/RainEditor_v10s.js"></script>

<style>
.raineditor {
    behavior: url(/HTCCSS/raineditor.htc); /* for IE */
    -moz-binding: url(/HTCCSS/bindings.xml#raineditor.htc); /* for FireFox */
}
</style>


- 짧은 메모형 에디터


사용자 삽입 이미지
 

<textarea name=contents01 class="editorhtc" skin=blue toolbar=small canbenull=true width=450 height=100>
<font size=3>에디<u>터</u> <b>테</b>스</font>터
</textarea>


- 단순형 에디터


사용자 삽입 이미지
 

<textarea name=contents01 class="editorhtc" skin=black toolbar=simple canbenull=true width=550 height=200>
<font size=3>에디<u>터</u> <b>테</b>스</font>터
</textarea>


- 무첨부 에디터


사용자 삽입 이미지
 

<textarea name=contents01 class="editorhtc" skin=black toolbar=simple canbenull=true width=550 height=200>
<font size=3>에디<u>터</u> <b>테</b>스</font>터
</textarea>


- 기본형 에디터


사용자 삽입 이미지
 

<textarea name=contents01 class="editorhtc" skin=gray toolbar=base canbenull=true width=550 height=200>
<font size=3>에디<u>터</u> <b>테</b>스</font>터
</textarea>


- 고급형 에디터


사용자 삽입 이미지
 

<textarea name=contents01 class="editorhtc" skin=whitenblack toolbar=full canbenull=true width=550 height=200>
<font size=3>에디<u>터</u> <b>테</b>스</font>터
</textarea>

HTC for OFCJS
- (Open Flash Chart for Javascript)


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

- Install files & The Code


오픈플레쉬 차트 서비스를 위해서는 몇가지 파일이 필요합니다.
1. [ bindings.xml ]- FireFox 용 HTC binding file
2. [ moz-behaviors.xml ] - FireFox 용 HTC behaviors
3. [ ofcjs.htc ]- 오픈 플레쉬 차트 HTC 파일
4. 당 서비스는 비상업용 사이트에서는 이용가능하나 상업용 사이트는 사용을 불허합니다.


<script type="text/javascript" src="http://chart.cafen.net/JS/swfobject.js"></script>
<script type="text/javascript" charset="utf-8" src="http://chart.cafen.net/JS/rainOpenSWFChart.js"></script>

<style>
.charthtc {
    behavior: url(css/ofcjs.gif);
    -moz-binding: url(css/bindings.xml#ofcjs.htc);
}
</style>

- [ Charts ] - Data

 
사용자 삽입 이미지


<div class="charthtc" style="width:680px;height:200px">
<c_title text='Many data lines' cstyle='{font-size: 20px; color: #736AFF}'></c_title>
<c_data data='15,18,14,14,14,16,19,14,15,18,15,14'></c_data>
<c_data data='9,9,12,9,10,10,12,8,13,11,13,11'></c_data>
<c_data data='6,1,7,1,2,1,4,2,2,7,2,4'></c_data>
<c_line text='Page views' color='#9933CC' size=10 width=2></c_line>
<c_linedot text='Downloads' color='#CC3399' size=10 width=3 dotsize=5></c_linedot>
<c_linehollow text='Bounces' color='#80a033' size=10 width=2 dotsize=4></c_linehollow>
</div>


- [ Charts ] - Bar Chart


사용자 삽입 이미지
 

<div class="charthtc" style="width:680px;height:200px">
<c_title text='Bar Chart' cstyle='{font-size: 20px;}'></c_title>
<c_data data='5,8,6,5,9,7,5,9,9'></c_data>
<c_barfilled text='Page views' alpha=50 color='#9933CC' outline='#8010A0' size=10></c_barfilled>
<c_xlabels data='January,February,March,April,May,June,July,August,September'></c_xlabels>
<c_xaxissteps data=2></c_xaxissteps>
<c_xlabelstyle size=10 color=#9933CC' orientation=0 step=2></c_xlabelstyle>
<c_ymax data=10></c_ymax>
<c_ylabelsteps data=4></c_ylabelsteps>
<c_ylegend text='Open Flash Chart' size=12 color='#736AFF'></c_ylegend>
</div>


- [ Charts ] - Bar Chart 2


사용자 삽입 이미지
 

<div class="charthtc" style="width:680px;height:200px">
<c_title text='Bar Chart' cstyle='{font-size: 20px; color: #736AFF}'></c_title>
<c_data data='3,3,2,2,3,3,4,2,3'></c_data>
<c_data data='6,6,6,7,6,8,8,8,9'></c_data>
<c_data data='4,3,3,2,7,6,3,9,8'></c_data>
<c_bar text='Me' alpha=50 color='#0066CC' size=10></c_bar>
<c_bar text='You' alpha=50 color='#9933CC' size=10></c_bar>
<c_bar text='Them' alpha=50 color='#639F45' size=10></c_bar>
<c_xlabels data='January,February,March,April,May,June,July,August,September'></c_xlabels>
<c_xlabelstyle size=10 color=#9933CC' orientation=0 step=2></c_xlabelstyle>
<c_xaxissteps data=2></c_xaxissteps>
<c_ymax data=10></c_ymax>
<c_ylabelsteps data=2></c_ylabelsteps>
<c_ylegend text='Open Flash Chart' size=12 color='#736AFF' ></c_ylegend>
</div>


- [ Charts ] - Bar Chart Glass


사용자 삽입 이미지
 
<div class="charthtc" style="width:680px;height:200px">
<c_title text='Glass Bars' cstyle='{font-size:20px; color: #bcd6ff; margin:10px;
background-color: #5E83BF; padding: 5px 15px 5px 15px;}'></c_title>
<c_data data='5,5,3,2,4,2,3,3,4,3'></c_data>
<c_data data='-5,7,-2,9,-1,8,-3,4,6,7'></c_data>
<c_barglass alpha='75' color='#D54C78' text='2006' size=10></c_barglass>
<c_barglass alpha='75' color='#3334AD' text='2007' size=10></c_barglass>
<c_xaxiscolour data='#909090' grid='#ADB5C7'></c_xaxiscolour>
<c_yaxiscolour data='#909090' grid='#ADB5C7'></c_yaxiscolour>
<c_xlabels data='January,February,March,April,May,June,July,August,September,October'></c_xlabels>
<c_ymin data=-5></c_ymin>
<c_ymax data=10></c_ymax>
<c_ylabelsteps data=6></c_ylabelsteps>
<c_ylegend text='Open Flash Chart' size=12 color='#736AFF' ></c_ylegend>
</div>


- [ Charts ] - Bar Chart 3D


사용자 삽입 이미지
 

<div class="charthtc" style="width:680px;height:200px">
<c_title text='3D Bar Chart' cstyle='{font-size:20px; color: #FFFFFF; margin: 5px;
    background-color: #505050; padding:5px; padding-left: 20px; padding-right: 20px;}'></c_title>
<c_data data='3,3,2,5,5,5,4,4,5,2'></c_data>
<c_data data='9,5,7,5,8,9,8,5,9,7'></c_data>
<c_xaxis3d data='12'></c_xaxis3d>
<c_bar3d alpha='75' color='#D54C78' text='2006' size=10></c_bar3d>
<c_bar3d alpha='75' color='#3334AD' text='2007' size=10></c_bar3d>
<c_xaxiscolour data='#909090' grid='#ADB5C7'></c_xaxiscolour>
<c_yaxiscolour data='#909090' grid='#ADB5C7'></c_yaxiscolour>
<c_xlabels data='January,February,March,April,May,June,July,August,September,October'></c_xlabels>
<c_ymax data=10></c_ymax>
<c_ylabelsteps data=5></c_ylabelsteps>
<c_ylegend text='Open Flash Chart' size=12 color='#736AFF' ></c_ylegend>
</div>



- [ Charts ] - Bar Chart Sketch


사용자 삽입 이미지
 
<div class="charthtc" style="width:680px;height:200px">
<c_title text='Bar Chart Sketch' cstyle='{font-size:20px; color: #FFFFFF; margin: 5px;
    background-color: #505050; padding:5px; padding-left: 20px; padding-right: 20px;}'></c_title>
<c_data data='4,3,2,3,5,4,4,4,2,5'></c_data>
<c_data data='7,5,9,5,7,9,5,9,9,9'></c_data>
<c_barsketch alpha='75' offset=6 color='#D54C78' text='2006' size=10></c_barsketch>
<c_barsketch alpha='75' offset=6 color='#3334AD' text='2007' size=10></c_barsketch>
<c_xaxiscolour data='#909090' grid='#ADB5C7'></c_xaxiscolour>
<c_yaxiscolour data='#909090' grid='#ADB5C7'></c_yaxiscolour>
<c_xlabels data='January,February,March,April,May,June,July,August,September,October'></c_xlabels>
<c_xlabelstyle size=10 color=#9933CC' orientation=2></c_xlabelstyle>
<c_ymax data=10></c_ymax>
<c_ylabelsteps data=5></c_ylabelsteps>
<c_ylegend text='Open Flash Chart' size=12 color='#736AFF' ></c_ylegend>
</div>




- [ Charts ] - Area
사용자 삽입 이미지
 

<div class="charthtc" style="width:680px;height:200px">
<c_title text='Area Chart' cstyle='{font-size:20px; color: #FFFFFF; margin: 5px;
    background-color: #505050; padding:5px; padding-left: 20px; padding-right: 20px;}'></c_title>
<c_data data='0,0.377471728511,0.739894850386,1.07282069945,1.36297657271,1.59879487114,1.77087426334,1.87235448698,1.89918984578,1.85031049867,1.72766511097,1.53614316726,1.28338004305,0.979452606461,0.636477485296,0.268128015314,-0.110910872512,-0.485528093851,-0.84078884226,-1.16252999279,-1.43792474109,-1.65599396759,-1.80804394039,-1.8880129069,-1.89271275679,-1.82195612186,-1.67856384587,-1.46825252636,-1.19940661196,-0.882744140886,-0.530889446578'></c_data>
<c_areahollow width=2 alpha=25 dotsize='3' color='#CC3399' text='2006' size=10 fillcolor=#773399></c_areahollow>
<c_xaxiscolour data='#909090' grid='#ADB5C7'></c_xaxiscolour>
<c_yaxiscolour data='#909090' grid='#ADB5C7'></c_yaxiscolour>
<c_xlabels data='0.00,0.38,0.74,1.07,1.36,1.60,1.77,1.87,1.90,1.85,1.73,1.54,1.28,0.98,0.64,0.27,-0.11,-0.49,-0.84,-1.16,-1.44,-1.66,-1.81,-1.89,-1.89,-1.82,-1.68,-1.47,-1.20,-0.88,-0.53'></c_xlabels>
<c_xlabelstyle size=10 color=#9933CC' orientation=2></c_xlabelstyle>
<c_ymin data=-2></c_ymin>
<c_ymax data=2></c_ymax>
<c_ylabelsteps data=5></c_ylabelsteps>
<c_ylegend text='Open Flash Chart' size=12 color='#736AFF' ></c_ylegend>
</div>


- [ Charts ] - Bar + Line Chart


사용자 삽입 이미지
 
<div class="charthtc" style="width:680px;height:200px">
<c_title text='Many data lines' cstyle='{font-size: 20px; color: #736AFF}'></c_title>
<c_data data='16,19,16,19,16,17,18,16,17,17'></c_data>
<c_data data='10,11,8,11,13,13,12,12,10,9'></c_data>
<c_data data='7,1,7,4,5,1,4,1,7,6'></c_data>
<c_bar text='Page views' color='#9933CC' size=10 width=2></c_bar>
<c_bar text='Downloads' color='#CC3399' size=10 width=3></c_bar>
<c_linedot text='Bounces' color='#80a033' size=10 width=2 dotsize=4></c_linedot>
<c_xlabels data='January,February,March,April,May,June,July,August,September,October'></c_xlabels>
<c_xlabelstyle size=10 color=#9933CC' orientation=2></c_xlabelstyle>
</div>


- [ Charts ] - Pie Chart


 
사용자 삽입 이미지

<div class="charthtc" style="width:300px;height:200px">
<c_pie alpha=60 color='#505050' gradient=true cstyle='{font-size: 12px; color: #404040;}' ></c_pie>
<c_pievalues data='10,12,7,9,10' text='IE,Firefox,Opera,Wii,Other'></c_pievalues>
<c_pieslicecolours data='#d01f3c,#356aa0,#C79810'></c_pieslicecolours>
<c_tooltip data='#val#%'></c_tooltip>
</div>

<div class="charthtc" style="width:300px;height:200px">
<c_pie alpha=60 color='#505050' gradient=false cstyle='{font-size: 12px; color: #404040;}' ></c_pie>
<c_pievalues data='10,12,7,9,10' text='IE,Firefox,Opera,Wii,Other'></c_pievalues>
<c_pieslicecolours data='#d01f3c,#356aa0,#C79810'></c_pieslicecolours>
<c_tooltip data='#val#%'></c_tooltip>
</div>


- [ Charts ] - Scatter Chart


 
사용자 삽입 이미지

<div class="charthtc" style="width:680px;height:200px">
<c_title text='Scatter Chart' cstyle='{font-size: 20px; color: #736AFF}'></c_title>
<c_value x='15' y='9' size='18'></c_value>
<c_value x='11' y='19' size='6'></c_value>
<c_value x='9' y='13' size='11'></c_value>
<c_value x='20' y='4' size='11'></c_value>
<c_value x='12' y='18' size='12'></c_value>
<c_value x='15' y='16' size='9'></c_value>
<c_value x='8' y='5' size='15'></c_value>
<c_value x='6' y='3' size='20'></c_value>
<c_value x='14' y='8' size='8'></c_value>
<c_value x='5' y='8' size='9'></c_value>
<c_value x='15' y='7' size='6'></c_value>
<c_value x='18' y='6' size='5'></c_value>
<c_value x='18' y='4' size='4'></c_value>
<c_value x='20' y='15' size='18'></c_value>
<c_value x='15' y='2' size='3'></c_value>
<c_scatter text='Downloads' color='#CC3399' size=10 width=2></c_scatter>
<c_value x='18' y='8' size='17'></c_value>
<c_value x='10' y='13' size='16'></c_value>
<c_value x='4' y='2' size='19'></c_value>
<c_value x='7' y='3' size='4'></c_value>
<c_value x='5' y='1' size='19'></c_value>
<c_value x='12' y='14' size='16'></c_value>
<c_value x='11' y='15' size='8'></c_value>
<c_value x='16' y='8' size='5'></c_value>
<c_value x='3' y='16' size='11'></c_value>
<c_value x='16' y='13' size='10'></c_value>
<c_value x='1' y='19' size='19'></c_value>
<c_value x='11' y='18' size='19'></c_value>
<c_value x='17' y='0' size='11'></c_value>
<c_value x='5' y='18' size='14'></c_value>
<c_value x='1' y='19' size='15'></c_value>
<c_scatter text='Uploads' color='#80a033' size=10 width=2></c_scatter>
<c_xmin data=0></c_xmin>
<c_xmax data=20></c_xmax>
<c_ymin data=0></c_ymin>
<c_ymax data=20></c_ymax>
<c_xlegend data='Open Flash Chart' color=#464646 size=16></c_xlegend>
</div>


태그!!
  applet - object 태그로 사용합니다.
  basefont - CSS로 대체해 사용합니다.
  center - CSS inline
  dir, menu - ol or ul 태그를 대신 사용합니다.
  font - CSS font-family, font-size 등...
  iframe - 사용 불가
  isindex - input 태그로 사용합니다.
  s, strike - CSS text-decoration: strike-through
  u - CSS text-decoration: underline

속성!! (괄호 속은 해당하는 태그)
  align (caption, img, input, object, legend, table, hr) - 사용 불가
  align (div, h1, h2, h3, h4, h5, h6, p) -  CSS text-align 으로
  alink (body) - CCS에서 a:link 
  background (body, table, tr, td, th) - CSS background 
  border (img, object) - CSS border 
  clear (br) - CSS에서 clear 
  compact (dl, ol, ul) - CSS line-height 
  height (table) - 사용 불가
  height (td, th) - 사용 불가; 대신의 셀 속의 내용에 맞춰서 크기가 조정되도록 하세요.
  hspace (img, object) - CSS padding
  language (script) - type / MIME type 사용
  link (body) - CSS a:link
  name (img) - id를 이용하세요.
  noshade (hr) - 사용 불가 
  nowrap (td, th) - CSS white-space: pre 
  size (hr) - CSS margin-left, margin-right
  start (ol) - 사용 불가
  target (a) - 사용 불가
  text (body) - CSS color 
  type (li, ol, ul) - CSS list-style
  value (li) - 사용 불가
  version (html) - 사용 불가
  vlink (body) - CSS a:visited 
  vspace (img, object) - CSS padding 
  width (hr, pre) -  CSS width
  width (td, th) - 사용 불가


추가적인 TIP으로,
  XHTML 1.0 Strict를 사용하면서 table로 레이아웃을 짜려는 건 바보 같은 일입니다. (절대 불가능!) ;;
  XHTML 1.0 Transitional에서도 table로 레이아우 짜는 건 거의 불가능 합니다.
  쉽게 말해서 table 쓰지 마세요. 대신 div 등을 이용합니다.

  가능한 속성들은 모두 CSS로 해주세요.
아이프레임의 새로길이를 가져올 파일의 길이에 따라 자동으로 조절되도록 하기 위한 소스팁입니다...

여러가지 방법이 있지만 두가지 정도를 올려봅니다..

1. 프로그램으로 처리할 경우

스크립트 소스를 아래와 같이 넣어준 후 해당 iframe에 onload="iframe_autoresize(this)"를 넣어주세요...
===스크립트 처리===
<script>
function iframe_autoresize(arg) {
arg.height =
eval(arg.name+".document.body.scrollHeight");
}
</script>
===해당 iframe처리===
<iframe src="가져올 파일경로" onload="iframe_autoresize(this)">


2. 자바스크립트만으로 처리할 경우

<a href="파일링크" target="vision"> 첫번째파일</a>
<a href="파일링크" target="vision"> 두번째파일</a>
<iframe id="free_size" src="가져올 파일경로" width=10 height=10 marginwidth=0 marginheight=0 hspace=0 vspace=0 frameborder=0 scrolling=no name="vision"></iframe>

링크경로에 target="vision"을 꼭 넣어주시고,
해당위치에 iframe을 넣은 후 id값을 위와 같이 넣어줍니다. id명은 원하시는대로 바꾸시면 되구요.. 넓이와 높이값은 제조정되기에 그냥 10으로 넣었습니다... 그리고 가져오는 해당 파일의 내용을 아래와같이 <div>안에 넣어주시고 아래의 스크립트를 넣어주시면 됩니다....^^

<div align=center id="page_content" style="position:absolute;left:0;top:0;width:100%">
<table>
<tr><td>내용부분</td></tr>
</table>
</div>
<script language="JavaScript1.2">
function iframe_reset(){
dataobj=document.all? document.all.page_content : document.getElementById("page_content")

dataobj.style.top=0
dataobj.style.left=0

pagelength=dataobj.offsetHeight
pagewidth=dataobj.offsetWidth

parent.document.all.free_size.height=pagelength
parent.document.all.free_size.width=pagewidth
}
window.onload=iframe_reset
</script>

XHTML1.0 와 XHTML1.1의 차이

사용자 삽입 이미지


XHTML의 기본은 XML과 HTML의 장점의 혼용이였습니다.
서로 같은 작성방법을 가지고 있는 XML과 HTML은 마크업(Mark Up)이라는 언어로 정보를 가지고 표준화 또는 데이터로서의 기능을 가지거나(XML) 또는 정보를 담고 표현해주는(HTML) 역할을 담당해왔던 웹문서 였습니다. 이 두개의 마크업 언어를 하나로 통합하고 정보로서의 가치 및 표현이 가능한 문서로서 표준화 하여 재활용 하도록 추진하고 발전시키고자 했던 것이 XHTML 1.0 이였습니다.


HTML4.01 (HyperText Markup Language)
HTML 의 기본 배경은 SGML(Standard Generalized Markup Language / ISO 8879)에서 웹에 필요한 엘리먼트만을 새로이 재선언 한 언어입니다. 웹이 시작되면서 부터 HTML이라는 언어는 시작 되었으며 HTML4.01 버젼을 가장 최상위 버젼으로 하고 HTML5가 현재 제작되고 있습니다.


HTML4.01의 특징
HTML은 웹에 필요한 기본적인 항목들을 DTD를 활용하여 선언하여 놓고 그에 따라 문서를 작성하는 방식입니다. 즉 문서를 만드는데 필요한 도구들의 집합이라고 볼수 있습니다. 확장이 불가능하지만 정보를 보여주고 표현하는데에는 문제점이 없을정도로 확장되어있습니다.


XML1.0 (Extensible Markup Language)
XML의 기본 배경은 SGML에서 가장 간단하고 손쉽게 정보의 정의를 선언할수 있도록 한 언어로 자유롭게 정보를 확장할수 있습니다.


XML의 특징
XML 은 특별한 형식을 가지고 있지는 않습니다. 하지만 작성된 웹문서를 재활용할수 있는 방안들이 많습니다.(XST , Xpath , XLink 등) 이유는 만들어진 계기 자체가 정보를 작성함에 있어 간단하고 손쉽게 작성할수 있도록 하기 위해 HTML처럼 미리 정의해 놓은 엘리먼트가 없기 때문입니다. 그렇기 떄문에 정보를 담기에는 최적의 환경을 제공합니다. 하지만 반대로 말한다면 정보가 어떠한 의미로 어떠하게 사용해야 하는것인지에 대해 정확하게 선언해야 합니다.(DTD를 활용)



XHTML1.0 (The Extensible HyperText Markup Language 1.0)
XHTML1.0은 부제가 곧 XHTML의 이름인 것과 같이 “확장이 가능한 웹문서” 라는 것 이며 XML의 데이터로서의 기능과, HTML의 표현이 가능하도록 하는 방법을 가장 큰 이슈로 발전하였습니다.


XHTML1.0의 특징
XML 의 DTD작성 방법을 이용하여 기본적으로 사용하는 XHTML DTD 와는 별개로 또 추가적인 DTD를 사용(확장/Extensible)하여 데이터로서의 새로운 정보의 분류와 수없이 많은 디바이스들에게 현문서의 정보양식 및 표준, 확장을 제시합니다.
각 엘리먼트는 어떠한 의미를 가지고 어떠한 방법으로 표현하는 가에 대한 것이 중점적으로 설명되며, 그것은 XHTML을 지원하는 모든 디바이스는 지켜야만 합니다.


XHTML1.1(Module-based XHTML)
XHTML1.1 은 부제와 같이 모듈을 기본으로 하는 XHTML입니다. XHTML을 추상적인 기준에 따라 분류하여 일정한 목적에 따라 필요 있는, 없는 정보를 분류하고 그에 따른 모듈화된 엘리먼트를 적용하도록 하는 방향으로 지원합니다.
모듈화를 기본으로 하기 떄문에 실제적으로 엘리먼트의 소개 보다는 모듈적인 부분에서 접근하게 됩니다. 엘리먼트의 의미 보다는 모듈의 사용처 및 모듈에 대한 설명, 그리고 그런 모듈을 만드는 방법(XHTML 모듈방법론 / XHTML™ Modularization 1.1 )을 소개하며 이런 방법론 및 기본이 되는 모듈을 총체적으로 XHTML1.1이라 칭합니다.


XHTML1.1의 특징
가 장 큰 기준은 사용하는 엘리먼트는 XHTML1.0과 크게 틀리지 않지만. XHTML1.1에서 추가된 루비요소(ruby) 와 가상모듈(Abstract Modules) 그리고 모듈화가 되어있는 MOD파일이 리스트화 되어있으며. 1.1은 이런 MOD를 가져오거나(include) 또는 베재(igone)하여 새로운 DTD를 생성하게 됩니다.



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


XHTML1.0와 XHTML1.1의 차이
XHTML1.0 (이하 1.0)와 XHTML1.1(이하 1.1)의 실제 엘리먼트의 차이는 거의 없습니다.(1.1에 루비요소만 추가) 즉 1.0을 사용하던 퍼블리셔는 1.1의 유효성 검사를 패스하는데는 큰 문제가 없습니다. 1.0으로 검사를 통과했다면 1.1도 당연하게 패스가 됩니다. 하지만 1.0와 1.1는 접근하는 개념이 틀리며 그것이 "가상모듈"입니다. 1.0을 사용할수 있다 라는 전제하에 아래의 설명을 보셔야 합니다.


루비요소(ruby)

사용자 삽입 이미지

같은 뜻을 가진 서로 다른 언어를 표현하기 위해 나온 엘리먼트.
실제적으로 공공장소 에서 기본적으로 표현하는 경우인 "비상구" 는 EXIT 라는 영문으로도 사용합니다. 그에 따라 한글 "비상구"와 영문"EXIT" 는 같은 뜻이며 혼용으로 사용하기 위해 위와 같이 표현할수 있도록 해주는 것이 루비 요소 입니다.



가상(추상)모듈(Abstract Modules)

사용자 삽입 이미지


실제적으로 모듈이 된것이 아닌, 모듈이 된거 같은 의미를 가지고 있다 라는 뜻으로 모듈 이라는 말보다는 가상모듈 이라는 것으로 실제적으로 XHTML을 모듈화를 표현 하였다.



MOD(Module Definition)

사용자 삽입 이미지


모든 웹문서는 DTD에 의해 정의되고 브라우저에 의해 표현됩니다. 가상모듈 을 포함한 모든 DTD를 분해하여 하나씩의 모듈의정의를 내린 DTD언어로 된 문서입니다. 실제적으로 1.1의 DTD는 이런 MOD들이 모여서 새로운 DTD가 됩니다.


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


XHTML1.1로의 전환의 이유

W3C에서는 이유를 아래와 같이 설명하고 있습니다.


 

“단 순히 웹 문서에만 사용되던 HTML이 다양한 분야와 기기(모바일 기기, 디지탈 TV 등)에 점점 더 많이 적용되고 있는데 이들 각각은 서로 요구하는 조건이나 구현상의 한계가 다르므로 기존의 규격을 일괄적으로 적용시키기가 어렵다.”

 

“이 런 문제를 해결하기 위해 도입된 모듈화를 통해서 서비스나 기기를 디자인할 때 표준에 맞게 만들어진 블록을 사용하고, 표준에 맞는 방법으로 어떤 블럭을 사용했는지 알려주는 방식으로 해당 기기가 어떤 모듈을 지원하는지 컨텐츠 커뮤니티(content community)에 명확하게 알려줄 수 있다. 그러면 컨텐츠 커뮤니티는 필요한 특정 모듈을 지원하는 이미 만들어진 기반(installed base)에만 신경을 써서 컨텐츠를 만들어낼 수 있다.”

“표준화된 방식을 사용함으로써 소프트웨어는 기기에 맞게 컨텐츠를 처리할 수 있고, 기기는 필요한 모듈을 처리하기 위한 소프트웨어를 자동으로 불러올(load) 수 있게 된다.”

 

“또한, 모듈화와 XML의 확장성을 이용해서 XHTML 표준을 어기지 않고도 XHTML 문서의 레이아웃과 디자인의 확장성을 높일 수 있다.”


즉 일괄적인 문서에 디바이스를 맞추는것이 아닌 애초에 디바이스를 고려한 웹문서를 제작할수 있도록 하는 것을 기본 목표로 합니다. 불필요한 정보와 디바이스에 따른 정확한 컨덴츠를 지원하여 표준이라는 이름에 더 맞도록 지원하도록 하는것을 기본으로 합니다. 또한 XHTML이라는 장점으로 브라우져에게는 확실하게 문서의 정보를 보여줄수 있다 라는 장점을 가질수 있습니다.

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


마치며
XHTML1.1 은 XML의 특징과 HTML의 특징을 가져온 XHTML1.0을 기반으로 하며 1.0이 웹문서의 표준화를 기본컨셉으로 하였다면 1.1은 표준화를 기본으로 하여 추상적인 정의로 엘리먼트를 모아서 새로운 모듈을 만들고 그런 모듈들끼리 모아서 사용자에게 효율적인 정보 제공을 위한 DTD 및 웹문서를 만들기 위해 만들어 진 언어입니다.


아직은 1.1이 이른 발전일지 모르지만, 이미 XHTML은 새로이 발전하고 있으며 1.1을 한단계 더 업한 XHTML2.0 에서는 모듈화 뿐만이 아니라 좀더 구조적으로 변화하고 표현하는것이 적어지는 확실한 구조적인 모습으로 새로이 변모하고 있습니다. 1.1을 좀더 확실하게 이해 하고 사용할수 있다면 새롭게 다가오는 웹문서의 미래에 좀더 유연하게 대처할수 있지 않을까 한번 생각해봅니다.

'Web(웹) Study > XML & XSL' 카테고리의 다른 글

XHTML (Extensible Hypertext Markup Language)  (0) 2008.07.01
자바스크립트에서 XML 생성  (0) 2008.03.26
xsl사용하기  (0) 2008.01.18
xml을 양식화하기  (0) 2008.01.18
내부 dtd선언  (0) 2008.01.18

XHTML (Extensible Hypertext Markup Language)

W3C에서 설명하는 바에 따르면, "XHTML은
XML 응용으로서의 HTML 4를 다시 공식화한 것"이다. 두 가지 용어 모두가 다 생소한 독자를 위해 부연설명을 하면, HTML은 웹상에서 보일 수 있도록 작성자가 문서 내에 집어넣는 일련의 코드 (즉, 마크업 언어)들이며, HTML 4는 그것의 최신 버전이다. XML은 웹상에서 공유될 어떤 종류의 데이터를 정의하는 방법에 관한, 일련의 구조화된 규칙이다. 그것은 누구라도 특정한 목적을 위한 일련의 마크업 세트를 발명할 수 있으므로, "확장될 수 있는" 마크업 언어라고 불리는데, 모든 사람들이 그것을 사용하는 한, XML은 웹페이지의 표현을 묘사하는 것을 포함하여, 여러 가지 목적에 채택되고, 또 사용될 수 있다. 그러한 경우로, XML의 형태로 HTML을 다시 구성하는 것이 바람직하게 보였다. 그 결과가 바로, 웹페이지를 표현하기 위한 XML의 특별한 응용인 XHTML인 것이다.

XHTML은 실제로, HTML 4의 후속 버전이다. 비록 이것이 XHTML 1.0으로 불리지만, HTML 5라고 생각해도 좋을 것이다. XHTML에서는, 모든 HTML 4 마크업 태그들과 속성들이 계속 지원될 것이다. 그러나, HTML과는 달리, XHTML은 그것을 사용하는 누구에 의해서라도 확장하는 것이 가능하다. 이미 존재하는 것에 새로운
태그와 속성들이 정의되고, 추가될 수 있으며, 웹페이지 내에 콘텐츠와 프로그램을 삽입하기 위한 새로운 방법을 만드는 것도 가능하다. 외관상으로는, XHTML 파일이 다소 더 정교한 HTML 파일처럼 보인다.


장 점
W3C의 얘기를 다시 인용하면, 장점은 "확장성과 이식성"이다. 확장성이란, 웹 전달과 표현에 관한 새로운 아이디어가 생기면, 다음 버전의 HTML이나 브라우저의 지원을 기다리지 않고서도 즉시 구현할 수 있게된다. 새로운 태그들이나 속성들이 새로운 가능성들을 표현하기 위해 정의될 수 있으며, 수신 측의 일부 프로그램이 그것을 이해할 수 있고 그것들 상에서 동작할 수 있다고 가정하면, 이전에는 절대로 일어나지 않았던 웹페이지 상에 새로운 것들이 일어날 수도 있다. XHTML에 관한 특이한 확장 판들로는, 수학적인 표현, 벡터그래픽, 그리고 멀티미디어 애플리케이션 등이 예정되어 있다.

만약 확장성이 보다 복잡한 페이지와 더 큰 프로그램으로 가게 될 것 같으면, 웹페이지들이 이전에 비해 더 간단하게 만들어짐으로써 소형장치들이 그것을 처리할 수 있도록 하기 위한, 이식성에 관한 장점이 중요성을 갖는다. 이것은 이동형 장비와,
마이크로프로세서, 프로그램 및 소형 메모리가 내장된 가정용 제품들 들에서는 중요하다. XHTML은 마크업 복잡도에 몇 개의 수준을 정의하며, 각 문서의 시작부분에는 복잡도 수준을 나타낸다. 소형 장치들 내의 프로그램은 소형 프로그램과 메모리로도 처리할 수 있도록, 복잡도가 가장 낮은 수준으로 기술된 XHTML 파일들을 기대할 수 있다.


차이점과 특색
규격과 지침서를 읽으면 더 많은 내용을 알 수 있겠지만, 여기에서는 XHTML의 일부 특색과, HTML 4와의 차이점만을 기술한다.

XHTML은 코딩 규칙을 엄격하게 준수할 것을 요구한다. 특히, 그 중에서도, 태그를 열었으면, 닫는 태그도 반드시 사용해야하고, 모든 태그들은 소문자로 기술되어야한다. HTML은 표기에 관한 한 훨씬 덜 엄격했으며, 브라우저들은 이에 관해 더욱 관대한 경향이 있었다.

이것은 XHTML 파일이 HTML 보다 분주해지는 경향이 있을 거라는 것을 의미한다. 그러나, 그들은 코딩에 있어 더 많은 정돈을 엄격히 요구하므로 읽기에 반드시 어렵지만은 않을 것이다. 추가로, 주요 편집 및 파일 작성도구들은 아마도 읽기 쉽도록 페이지를 배치할 것이다.

XHTML은 콘텐츠와 스타일시트와의 결합에 관한 생각을 보다 구조적이고 개념적인 방법으로 그리고 그것을 표현하는 보다 창조적인 방법 등을 장려하는 듯하다.

XHTML은 문득 새로운 태그들을 생각해내고 추가하는 사람들, 그리고 브라우저나, 그것을 지원하는 다른 애플리케이션들을 개발하는 사람들을 위한 쉬운 방법을 제공할 것이다.

XHTML 규격은 현재 W3C의 실무초안 단계에 있다.

'Web(웹) Study > XML & XSL' 카테고리의 다른 글

XHTML1.0 와 XHTML1.1의 차이  (0) 2008.07.01
자바스크립트에서 XML 생성  (0) 2008.03.26
xsl사용하기  (0) 2008.01.18
xml을 양식화하기  (0) 2008.01.18
내부 dtd선언  (0) 2008.01.18

CSS의 display 속성은 해당 엘레멘트가 화면에 어떻게 보여지는지를 결정하는 역할을 합니다.
display 속성의 값은 다 따지면 19가지나 되지만, 실제로 자주 쓰이는 것은 inline과 block, inline-block, none 값이며, 이외의 것은 브라우저에서 지원하지 않는 것도 많기 때문에 불안정해서 사용되지 않는다고 하네요.

block : 블록박스로 만든다.
inline : 인라인 박스로 만든다.
inline-block : 블록박스로 만들어지지만, 인라인 박스처럼 배치된다. (CSS2.1 권고후보에 추가)
none : 박스를 만들지 않으며 시각적으로 완전히 보이지 않는다.
inherit : 상위 요소의 display속성을 상속받는다.

table : 블록레벨의 표로 만든다. (table)
inline-table : 인라인레벨의 표로 만든다. (table)
table-row : 행으로 만든다 (tr 기본 속성)
table-row-group : 본체 행 그룹으로 만든다. (tbody 기본 속성)
table-header-group : 헤더 행 그룹으로 만든다. (thead 기본 속성)
table-footer-group : 푸터 행 그룹으로 만든다. (tfoot 기본 속성)
table-column : 열로 만든다. (col 기본 속성 - 보이지 않음)
table-column-group : 열 그룹으로 만든다. (colgroup 기본 속성 - 보이지 않음)
table-cell : 하나의 셀로 만든다. (td 기본 속성)
table-caption : 캡션으로 만든다. (caption 기본 속성)

list-item : li요소와 같은 블록박스와 목록항목의 인라인박스로 만든다.
run-in : 런인박스로 만든다.
compact : 콤팩트 박스로 만든다. (CSS2.1권고후보에서 삭제)
marker : 그 요소의 전후에 생성된 내용을 마커로 정의한다. (CSS2.1권고후보에서 삭제)


기본적으로 모든 요소들은 디폴트 display 속성이 지정되어 있으며 이를 자유롭게 변경할 수 있습니다. 예를 들면, 인라인 요소인 <span>요소에 display속성을 block으로 지정하면 <div>태그와 같은 역할을 하게 되는 것이죠.
사실 이번 기회에 책이나 인터넷을 찾아보고 조사하긴 했지만, 저도 실제로 사용하는 것은 위쪽의 다섯가지 정도밖에 안되는 것 같습니다.

display 속성 중에 주목할 만한 것은 table-cell 이라는 값인데요... 이게 테이블에서 <td>태그와 같은 속성을 가지게 해줍니다. 아시다시피 <td>태그는 기본적으로 상하 중앙 정렬이 됩니다.
레이아웃을 잡아보셨다면 아시겠지만, <div>태그는 상하 중앙정렬이 지원되지 않지요. 이럴 때 div태그에 display:table-cell; 속성을 주시면, 상하로 중앙 정렬이 가능하게 됩니다.
다만 이게 또 문제많은 IE에서 지원하지 않는다는 것이 참 아쉽습니다. -_-;;; (FF는 지원됩니다.) 레이아웃에서 상하 중앙정렬에 관한 포스트는 다음 기회로 미루기로 하지요.

아무튼 float 속성과 마찬가지로 display 속성을 잘 활용하면 CSS로 더 정밀한 레이아웃을 잡을 수 있습니다. 모르고 막 쓰던 display 속성을 이제는 제대로 알고 사용하는 것은 어떨까요?

최근 웹 2.0 시대에 들어서 RIA가 대세가 됨에 따라... 마치 플래시와 같은 동적인 UI를 구현하기 위해서 자바스크립트 개발의 중요성이 많이 부각되었습니다.
이러한 개발을 도와주는 도구로 각종 컴포넌트와 편리한 명령어를 담은 자바스크립트 프레임워크가 많이 개발되어 있습니다. 잘 알려진 자바스크립트 프레임워크로는 Prototype.js, Dojo Toolkit, MooTools, jQuery 등이 사용되고 있죠.

사용자 삽입 이미지

그런데... 이러한 프레임워크라는 개념이 CSS에도 도입이 된 것 같습니다.
저도 나름 새로운 사이트를 들어갈 때나, 프리랜스로 작업할 때 CSS의 기초로 사용하는 파일을 가지고 있구요.. 이를 바탕으로 작업을 진행합니다. 이것의 확장된 개념이라고 할 수도 있을까요?
그와 더불어 디자이너 입장에서도 디자인을 하면서 CSS를 더 잘 설계할 수 있도록 도와주는 기능이 있는 것 같습니다. (그리드)

공식 사이트 :
Google code : http://code.google.com/p/blueprintcss/
blog : http://bjorkoy.com/past/2007/8/28/blueprint_05_the_experiment/


기능 :
An easily customizable grid (그리드 기능)
Sensible typography (센시티브한 타이포그라피. 다만 영문쪽 이야기겠죠?)
Relative font-sizes everywhere (상대크기 폰트)
A typographic baseline
Perfected CSS reset
A stylesheet for printing (프린터를 위한 스타일시트)
Compressed version (사이즈를 줄인 압축버전)
No bloat of any kind (부풀어오른게 없다...? 최적화시켰다는 이야기일까요...?)

예정된기능 :
Support for PNG transparency in IE5.5+ (js) (js파일을 통해 IE5.5버전부터 png이미지 지원)
Liquid layout version (유연한 레이아웃)


샘플 :
Grid - http://bjorkoy.com/blueprint/grid-test.html
Typography - http://bjorkoy.com/blueprint/typography-test.html

블로그에 가보니 BP 0.6버전의 스트레스 테스트를 하고 있다고 하는군요.
개인적으로는 다음 버전에서 IE5.5이상의 png 지원이 끌립니다. 쓰고 싶은 png파일 마음껏 쓰고 싶어요.

일단 한번 훑어보긴 했는데, 아직은 강력한 기능은 없어서인지, 왜 써야하는가...? 라는 건 잘 모르겠습니다.

CSS에서 사용하는 다중 선택자(Multi Class)란 동일 엘리먼트에 여러개의 선택자(id, class)를 동시에 적용하기 위한 목적으로 여러개의 선택자를 사용하는 것을 말합니다.
CSS1에서 선택자의 개념이 사용된 후, CSS2에서 다중 선택자가 추가되어 사용되고 있는데요, CSS를 사용해 웹사이트를 개발하다 보면 다중선택자는 정말 편리한 존재입니다.

사용자 삽입 이미지

<style>
.foo { background:yellow; }
.bar { border:solid 4px red; }
.foo.bar { border-style: dashed; }
</style>

<div class="foo">foo</div>
<div class="bar">bar</div>
<div class="foo bar">foo bar</div>

아마 기존에 다중 선택자에 대한 자료를 찾아보셔서 알고 계신 분은 foobar 라는 단어가 익숙하실 지도 모르겠습니다. (웃음)
위의 코드는 다중 선택자를 적용하여 foo 클래스와 bar 클래스의 속성을 하나의 엘리먼트에 동시에 적용한 예제입니다. 또한 클래스를 붙여서 선언하게 되면 평소에는 적용되지 않다가 두 클래스가 동시에 적용될 경우에만 별도의 효과를 주는 것도 가능합니다.
이렇게 여러 개의 클래스를 하나의 엘리먼트에 적용하여 서로 다른 효과를 동시에 적용할 수 있고, 이 다중 선택자는 3개 이상도 사용이 가능합니다.
만약 클래스 내의 css속성이 겹친다면 뒷쪽에 선언된 클래스의 css속성을 우선하지만(덮어쓰기 효과) 만약 !important 가 속성에 포함되어 있을 경우 순서에 상관없이 해당 속성을 우선 적용하게 됩니다.

그래서 CSS개발하시는 분은 대부분 다중 선택자를 매우 유용하게 사용하고 있지만, IE6에서는 관련 버그가 존재하기 때문에 사용에 주의해야 합니다. (또 IE6이 문제입니다! -_-)


1. id와 class 를 동시 조합하여 이용시, 나중에 선언된 다중 선택자 구문 무시
이 부분은 NHN NULI의 css가이드를 참고하였습니다. IE6의 경우 id와 class를 다중 선택자로 적용할 때에 나중에 선언된 다중 선택자를 무시하는 버그가 존재합니다.

사용자 삽입 이미지

<style>
#id.class1{background:#f00;}
#id.class2{background:#0f0; width:200px;} /* Does not exist in the IE6 */
#id2.class2{background:#00f; width:200px;}
#id2.class3{background:#0f0; width:300px;} /* Does not exist in the IE6 */
#id.class3{background:#f00; width:300px; font-weight:bold;} /* Does not exist in the IE6 */
</style>
<div id="id" class="class1">class1</div>
<div id="id" class="class2">class2</div>
<div id="id2" class="class2">class2</div>
<div id="id2" class="class3">class3</div>
<div id="id" class="class3">class3</div>

원래 위의 예제에서는 그림처럼 보이는 것이 바른 렌더링입니다. 하지만 IE6에서는 예제에서 2, 4, 5번째 줄에 해당하는 부분을 무시하게 됩니다. 아래 이미지처럼요.

사용자 삽입 이미지


따라서 불쌍한 IE6 을 위해서라면, 붙여서 쓰는 다중 선택자를 사용할 때에는 id와 class를 동시에 사용하지 않고, class만 사용하는 것을 권장합니다.

2. class 조합하여 이용시, 앞에 선언된 class 무시
하지만 불쌍한 IE6을 생각해서 class만 가지고 다중 선택자를 구성했음에도 불구하고, 특정 상황에서는 또 오작동을 해버립니다.
class만으로 다중 선택자를 구성할 때 예를 들어 .foo.bar{} 라는 클래스를 구성하면 IE6은 앞의 .foo를 무시하고 .bar{} 라는 클래스로 인식하게 됩니다.
원래 코드
.foo { background:yellow; }
.bar { border:solid 4px red; }
.foo.bar { border-style: dashed; }
IE6이 인식하는 코드
.foo { background:yellow; }
.bar { border:solid 4px red; } /* border 속성 중 border-style 속성이 삭제됨 */
.foo.bar { border-style: dashed; } /* bar class의 border-style 속성이 오버라이딩됨 */

이를 이미지로 보여드리면 다음과 같습니다.

사용자 삽입 이미지

<style>
.foo { background: yellow; }
.bar { border: solid 4px red; }
.foo.bar { border-style: dashed; }
</style>
<div class="foo">foo!</div>
<div class="bar">bar!</div>
<div class="foo bar">foo bar!</div>

위에서 foo bar 라는 유명한 예제(?)를 보여드렸는데요, 이게 IE6에서 다중선택자의 버그가 있다는 것을 적나라하게 보여주고 있죠. 원래 bar class의 경우 border-style 속성이 solid임에도 불구하고 IE6에선 .foo.bar 를 .bar로 인식함에 따라 border-style이 dashed 로 모두 교체된 것을 확인할 수 있습니다. 1번 항에서 다루었던 버그도 이 버그의 영향이 겹쳐서 생긴 문제가 아닐까 하는데요, 정확히는 잘 모르겠습니다.
이 버그를 회피하기 위해서는 class를 붙여서 선언하는 다중 선택자를 사용하지 않는 것이 최선입니다. 하지만 CSS작성 중의 편의를 위해서 붙여서 선언해야 할 경우엔 뒤에 붙이는 class명을 겹치지 않도록 사용하는 것도 방법입니다.

기존
.dx.class {}
.dy.class {} /* 별도의 class로 인식되지만, IE버그로 dy.class{}만 인식 */
수정(버그 회피)
.dx.classx {}
.dy.classy {} /* 최종 class명을 다른 이름과 겹치지 않는 고유의 클래스명으로 사용 */

이렇게 수정하는 방법은 다중 선택자의 장점을 완전히 무시하는 비효율적인 방법이긴 하지만, 어쩌겠습니까... 이놈의 IE6이 도와주지 않는걸요...

물론, IE7은 위에 나타나는 다중클래스의 버그는 해결하였습니다. 하지만, 표준모드(HTML 4.01, XHTML 1.0)로 동작할 때에만 버그가 나타나지 않게 되어 있으며, Quirks mode DTD로 동작될 때에는 IE6과의 호환을 위해 (또는 미처 쿽스모드 엔진을 고치지 못했을 수도 있죠) 이 버그가 그대로 나타나도록 되어있습니다.

IE6은 언제까지 우리 UI개발자를 괴롭히게 될까요? ㅠ_ㅠ

'Web(웹) Study > HTML & CSS' 카테고리의 다른 글

CSS의 display 속성  (2) 2008.06.27
이젠 CSS도 프레임워크 등장? BluePrint 0.5  (0) 2008.06.27
Print Different  (0) 2008.06.27
깨지지 않는 라운드 박스 만들기...  (0) 2008.06.13
클릭을 좀더 편하게 - label  (0) 2008.06.13

Although you may not realize it, the Web is a multi-medium information source. No, I'm not talking about multimedia-- audio and video streams, for example-- but the actual medium through which the Web's content is conveyed to us. For the vast majority of users, the medium is visual: the monitors we use every day to display pages. But there are many who also turn to the medium of print, creating "hard copies" of pages using their laser printers.

However, the overwhelming aim of Web design is visual, and many Web page designs don't print out very well. Navigation bars, ad banners, and other such things clutter up printouts and make them much harder to read. How many times have you seen a page on the Web which has, off to one side, a link which says, "Click here for a printer-friendly version"?

There are certainly other media-- audio browsers and handheld devices are two such examples-- but the output medium which most concerns authors is still the printer. CSS2 offers a way to address this, giving authors the ability to create stylesheets which are medium-specific. This month, we'll look how you can style a single page for both screen (monitor) and print output, and provide an example you can try using Internet Explorer 5 for Windows, or MSIE 4.5 for the Macintosh.

Making the Association

There are a variety of ways to associate media-specific stylesheets to a document. The most familiar way is to use the LINK element and simply add the media attribute:

<LINK rel="stylesheet" type"text/css"
     href="print.css" media="print">

In the previous example, we see that the stylesheet print.css has been given a media of print; thus, its styles will be used only when the document is printed. These styles will have no effect on the display of the document when viewed using a monitor, audio browser, or any other non-printing device.

There are currently ten defined media types:

  • all
  • aural
  • braille
  • embossed
  • handheld
  • print
  • projection
  • screen
  • tty
  • tv

These media types are described in some detail in Chapter 7 of the CSS2 specification. The most important is all, which is the default value for any stylesheet which does not have a defined media.

There are other ways to assign media to stylesheets. For example, you can list one or more media types on an @import statement:

@import url(paged.css) print,projection;

Thus, the styles in paged.css will be used in both print and projection media, both of which are known as paged media. Multiple media can be specified for LINKed stylesheets as well. The following two statements are equivalent:

<LINK rel="stylesheet" type"text/css"
     href="print.css" media="print,projection">
@import url(print.css) print,projection;

There is one other way to apply media-specific styles: the @media rule. Here's an example:

<STYLE type="text/css">
@media print {
   BODY {font-size: 10pt; line-height: 120%; background: white;}
}
@media screen {
   BODY {font-size: medium; line-height: 1em; background: silver;}
}
</STYLE>

Restyling for Print

Let's now look at a real example of alternate-media stylesheets. In order for these examples to work, you'll need to be using MSIE5/Win or MSIE4.5/Mac, and it will be helpful (though not strictly necessary) if you have a printer handy. Navigator 4.x does not support alternate media on any platform, so it won't be much help with these examples.

First, let's assume a simple page of text with some various elements: paragraphs, headings, hyperlinks, and so on. This file is called latinesque.html, and we want to display it differently depending on whether it's on a monitor, or on paper. First we write a stylesheet for screen display (remember, there's no accounting for taste):

/* screen display styles */
BODY {color: silver; background: black;}
A:link {color: yellow; background: #333333; text-decoration: none;}
A:visited {color: white; background: #333333; text-decoration: none;}
A:active {color: black; background: white; text-decoration: none;}
H1, H2, H3 {color: #CCCCCC; background: black; padding-bottom: 1px;
    border-bottom: 1px solid gray;}

This will give us a page something like that shown in Example 1. Note the ad banner, which is a feature common to so many sites.

All right, now we need to decide how the printed page should look. We decide on a simple, conventional print style, without an ad banner, and so the stylesheet turns out like this:

/* print styles */
BODY {color: black; background: white;}
A:link, A:visited {background: white; color: black; text-decoration: underline;
   font-weight: bold;}
H1, H2, H3 {background: white; color: black; padding-bottom: 1px;
   border-bottom: 1px solid gray;}
DIV.adbanner {display: none;}

We've added the last style in order to get rid of the ad banner in the printed version. To get an idea of what this will look like, take a peek at Example 2. Realize that this is a screen approximation of a printout, but for the moment, it will do.

Now, to the top of the document, we add the following LINK elements:

<LINK rel="stylesheet" type"text/css"
     href="screen.css" media="screen">
<LINK rel="stylesheet" type"text/css"
     href="print.css" media="print">

Thus we get the document shown in Example 3, which has the screen appearance of Example 1 but the printed appearance of Example 2-- load it up in MSIE, print it out, and see what happens!

(If you'd like to see another example of print-media stylesheets in action, try printing out the CSS Support Grid.)

Just the Tip of the Iceberg

Of course, the simple examples I've provided are just a beginning. There is almost no limit to what can be done with alternate-media stylesheets. Using them appropriately is the key to creating pages which can be styled for regular screen output, printing, legible display on handheld devices, special styles for the blind, and much more. As browsers add support for more media, and more ways to set up media-specific styles, we'll return to this subject for more. Until then, try out some print-media stylesheets on your pages, and see how you can make your site better-- and more accessible-- than ever.

예전에 자바스크립트는 단순히 배경색을 바꾸거나 입력형식을 검사하는 등의 용도로 사용되었으나 지금은 DHTML과 결합하여 상당히 덩치가 커지게 되었다. 그래서 이제는 성능이라는 것을 고려해야 한다. 이번장에서는 자바스크립트의 성능을 향상시킬수 있는 일반적인 방법 3가지를 살펴보겠다.

개체들을 캐싱시켜라...

자바스크립트의 성능을 향상시킬수 있는 방법중 하나는 개체를 캐싱시키는 것이다. 다음과 같이 반복적인 작업을 수행하는 스크립트가 있다고 하자.
 

<script language="JavaScript1.1">
for (i=0;i<document.images.length;i++)
document.images[i].src="blank.gif"
</script>


위의 예에서 document.images라는 개체는 여러번 불리워지고 있다. 각각의 루프가 돌때마다 document.images가 두번씩 읽혀지고 있다. 우리가 불러들여야 되는 것은 images 뿐이다. 하지만 여기서는 document를 거쳐서 images에 도달하고 있다. 이를 조금 개선해보자.
 

<script language="JavaScript1.1">
var theimages=document.images
for (i=0;i<theimages.length;i++)
theimages[i].src="blank.gif"
</script>


이제 성능향상이 되었다는 것이 보일것이다. 개체를 캐싱시키라는 뜻은 반복적으로, 그리고 순차적으로 접근되어가는 개체를 사용자가 정의한 변수에 넣어서 사용하라는 것이다. 위의 예에서 document.images를 theimages라는 변수에 넣었다.그리고 루프에서 이를 사용함으로서 document -> images가 아닌 images만 액세스하게 되었다.

이와 같은 사용예는 document.all.someobject , document.layers.somelayer 등에 사용할 수 있다.

스크립트를 캐싱하라...

성능을 향상시키는 또 다른 방법은 스크립트를 통채로 캐싱시키는 것이다. 스크립트를 js파일에 저장하고 이를 사용하면 페이지 Reload나 두번째 방문시 이후는 캐시에서 이를 꺼내 사용하게 된다.
 

<script src="imagescript.js"></script>


이러한 스크립트 캐싱은 스크립트의 양이 많거나 여러 페이지에 삽입되어 사용할 경우 좋은 효과를 낼 수 있다.

상황에 맞는 개체를 사용하라... 

각각의 개체를 상황에 맞게 사용하여야 한다. 다음의 두 동적 속성을 보자.
 

-object.innerText
-object.innerHTML


첫번째보다 두번째 속성이 더 자원을 많이 사용하게 된다. <DIV>나 <SPAN> 안에 텍스트 문자들만 들어가게 한다면 innerText를 사용하여 좋은 성능효과를 볼 수 있을 것이다. 이와 같은 것으로 CSS의 Display와 Visibility가 있다. 역시 후자에 비해 전자가 자원소모가 더 많다.

마무리

많은 사람들이 자바스크립트가 C나 자바와 같은 덩치 큰 언어가 되는 것은 시간문제라고 생각하고 있다. 그렇다면 이제 성능에 대하여 한번쯤 다시 생각해보아야 할 때가 아닌가 생각한다.

미리보기 : http://www.blog4u.kr/attach/1/20080617/tree/tree.html

자바스크립트를 이용한 트리메뉴이다.

기존 자바스크립트 메뉴와는 조금 구조가 다르다...

먼저 선언 하고 사용하는 엘리먼트 방식이 아닌... 그때그때 새로운 메뉴를 추가 얼마든지 확장이 가능한 스크립트 메뉴이다.

 

아래 이미지 두개를 이용해서 깨지지 않는 라운드형 박스를 만들어 보겠습니다.

사용자 삽입 이미지
사용자 삽입 이미지
일단 원리는 이렇습니다.
사용자 삽입 이미지
라운드되어 있는 네 귀퉁이를 표현하기 위해서는 위 그림과 같이 네개의 엘리먼트가 필요합니다. 설명을 쉽게 하게 위해 일일이 네번의 마크업을 추가했습니다. 쓸데 없는 레이어를 줄이기 위해 상자안의 내용에 들어가는 엘리먼트를 응용해도 되겠지요.. 예를 들면 <a>태그나 <ul>태그 같은...

step01.
네 귀퉁이의 라운드를 표현하기 위한 마크업을 하겠습니다.
<div class="box_rt">
 <div class="box_lt">
  <div class="box_lb">
   <div class="box_rb">
    <h3>최근글 리스트</h3> 
    <ul>
     <li>뜬금없는 광고 - 빨간중독...</li>
     <li>이미지 메뉴탭 만들어 보기.</li>
     <li>살아 돌아왔습니다..</li>
     <li>burning eolin!.</li>
     <li>골라먹는 떡볶이 소스 받아...</li>                
    </ul>
   </div>
  </div>
 </div>
</div>

step02.
라운드형 박스를 디자인해 보겠습니다.
.box_rt { background:url(round_right.gif) right top no-repeat; float:left;}
.box_lt { background:url(round_left.gif) left top no-repeat; padding:9px 0 0 0;}
.box_lb { background:url(round_left.gif) left bottom no-repeat; padding:0 0 0 9px;}
.box_rb { background:url(round_right.gif) right bottom no-repeat; padding:0 9px 9px 0;}

아래와같이 박스안의 내용이 늘어나거나 폰트사이즈가 커진다고 하더라도 박스가 깨지지 않습니다. .box_lb, .box_rb를 클래스명으로 사용하고 있는 레이어를, h3이나 ul로 대체 한다면쓸데 없는 레이어의 사용을 자제할 수 있습니다. (위의 마크업은 어디까지나 설명을 쉽게하기 위함이고 어떠한 상황에서도 응용이 가능하도록 하기 위함입니다.)
사용자 삽입 이미지

주의! 박스가 무한대로 커져도 깨지지 않는 것이 아니라 배경이미지 사이즈에 따라 달라 집니다. 여기서 사용한 이미지는 가로 세로 400px 의 이미지를 사용했기 때문에 그 이상 넘어가면 박스가 깨지겠지요.. 배경이미지가 쓸데없이 커지면 이또한 효율적이지 못하므로 디자인 하면서 적절한 사이즈를 예상해서 제작하면 됩니다.

'Web(웹) Study > HTML & CSS' 카테고리의 다른 글

IE 계열의 CSS 다중선택자 버그에 대해  (0) 2008.06.27
Print Different  (0) 2008.06.27
클릭을 좀더 편하게 - label  (0) 2008.06.13
CSS우선순위  (0) 2008.03.29
css style 지정 순서  (0) 2008.03.26
사용자 삽입 이미지
일반적으로 체크박스에 체크(?)를 하기 위해서는 체크박스를 클릭해야 합니다. 하지만 그 영역이 너무 작고, 성질급한 저같은 사람에겐 속터지는 일이지요... 체크박스와 연관되어 있는 텍스트에까지 클릭의 영역을 지정하고 싶을 경우를 위한 태그가 있습니다. 바로 <label>이라는 것인데... 아는 사람은 다 알지만 필요성을 느끼지 못해 사용하지 않는 경우가 있습니다. 그런데 예를 들어서 
사용자 삽입 이미지

이럴경우는... 일일이 체크하려면 눈이 빠지고, 손가락 후달립니다... 게다가 글작성시마다... 카테고리를 분류하기 위해 빈번하게 체크가 일어날 경우라면 여간 짜증나는 일이 아닐 수가 없겠죠..
이럴때 작은 배려가 큰 감동이 될수 있다나요.. ㅋㅋㅋ 방법은 간단합니다. 체크박스와 텍스트를 연결 시켜주는 label을 사용하면 됩니다.
사용자 삽입 이미지

<input type="checkbox" name="check" id="email_save" />
<label for="email_save">
이메일 저장</label>

여기서 중요한것은 체크박스의 id값입니다. 모 굳이 얘기 하자면 email_save라는 아이디값을 가진 체크박스를 위한 레이블!.. 정도로 해석이 되겠지요.. 영작문 해석하는것 같군요.. ^^;;

이것은 클릭할 수 있는 영역이 넓어져 사용자 편의를 위한것도 있지만, 레이블과 폼의ID 관계를 정의해 주어 스크린리더가 각 폼에 해당하는 레이블을 올바르게 읽어주게 하는 아주 중요한 태그입니다. 게다가 마크업에 한발 다가서는 태그기도 하구요..

이렇게 하면 코드가 한결 깔끔해 지겠지요.. ^ ^v

'Web(웹) Study > HTML & CSS' 카테고리의 다른 글

Print Different  (0) 2008.06.27
깨지지 않는 라운드 박스 만들기...  (0) 2008.06.13
CSS우선순위  (0) 2008.03.29
css style 지정 순서  (0) 2008.03.26
테이블의 셀내,셀간 여백 (cellPadding,cellSpacing)  (0) 2008.02.13

<script language="javascript">
<!--
//팝업윈도우, 스크린 중앙에 위치, 다중 오픈 방지
var winname_1;
var openF = 0;
function popup(fileName, intWidth, intHeight, intLeft, intTop, vScrollbars, vResizable, vStatus){
        today = new Date();
        winName = today.getTime();

        var fileName, intWidth, intHeight;
        var screenWidth = screen.availwidth;
        var screenHeight = screen.availheight;

        if(intWidth >= screenWidth){ //스크린 상태에 따라 스크롤바 자동표시
                intWidth = screenWidth - 40;
                vScrollbars = 1;
        }
        if(intHeight >= screenHeight){ //스크린 상태에 따라 스크롤바 자동표시
                intHeight = screenHeight - 40;
                intWidth = intWidth + 20;
                vScrollbars = 1;
        }
        if(intLeft == 'auto' || intTop == 'auto'){ //스크린 중앙에 위치 시키기
                var intLeft = (screenWidth - intWidth) / 2;
                var intTop = (screenHeight - intHeight / 2;
        }
        var features = eval("'width=" + intWidth + ",height=" + intHeight + ",left=" + intLeft + ",top=" + intTop + ",scrollbars=" + vScrollbars + ",resizable=" + vResizable + ",status=" + vStatus + "'");
        if(openF == 1){
                if(winname_1.closed){
                        winname_1 = window.open(fileName,winName,features);
                }else{
                        winname_1.close();
                        winname_1 = window.open(fileName,winName,features);
                }
        }else{
                winname_1 = window.open(fileName,winName,features);
                openF = 1;
        }
        winname_1.focus();
}
//-->
</script>
<style type="text/css">


<body onload="popup('http://blog4u.kr','1024','668','auto','auto','0','0','0');" leftmargin="0" marginwidth="0" topmargin="0" marginheight="0">

<a href="javascript:popup('http://blog4u.kr','1024','668','auto','auto','0','0','0')"," onFocus="this.blur();">

[input 입력창에 배경 이미지 깔기]
---------------------------------------------------------------------------------------------------------------------

<script>
var c=false;
function change() {
if ( c ) return;
document.userlogin.uid.style.backgroundImage="";
c=true;
}

var c2=false;
function change2() {
if ( c2 ) return;
document.userlogin.upw.style.backgroundImage="";
c2=true;
}
</script>

스크립트에 위를 추가하고...

<TR>
<TD align=middle height=20><INPUT onmousedown="return change();" onkeydown="return change();" style="BORDER-RIGHT: #999999 1px solid; BACKGROUND-POSITION: center center; BORDER-TOP: #999999 1px solid; FONT-SIZE: 12px; BACKGROUND-IMAGE: url(subpage/imgs/id.gif); BORDER-LEFT: #999999 1px solid; WIDTH: 120px; BORDER-BOTTOM: #999999 1px solid; BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: Verdana, 굴림; HEIGHT: 20px" maxLength=6 name=uid></TD></TR>
<TR>
<TD vAlign=bottom align=middle height=24><INPUT onmousedown="return change2();" onkeydown="return change2();" style="BORDER-RIGHT: #999999 1px solid; BACKGROUND-POSITION: center center; BORDER-TOP: #999999 1px solid; FONT-SIZE: 12px; BACKGROUND-IMAGE: url(subpage/imgs/pw.gif); BORDER-LEFT: #999999 1px solid; WIDTH: 120px; BORDER-BOTTOM: #999999 1px solid; BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: Verdana, 굴림; HEIGHT: 20px" maxLength=7 name=upw></TD></TR>

인풋쪽에 위처럼 설정하면 인풋배경이미지가 들어간다.
당연히 이미지 파일이 있어야 함.

애초부터 의식적으로 수정과 유지보수를 고려한 것이라면 좋았을 것이지만, 딱히 그런것은 아니고 단지 반복적인 프로세스를 통해서 경험적으로 형성된 결과이다.

모든 스타일시트를 열어보고, 확인해 볼 수는 없었지만 최근의 것들을 살펴보니까 나는 다음과 같은 순서를 가지고 있었다.


  1. display
  2. position
  3. clear
  4. float
  5. width / height
  6. margin / padding
  7. border / background
  8. color / font
  9. align / etc

모질라의 CSS 순서 제안을 찾아봤는데 다행인지 요행인지 나의 작성순서와 크게 다르지는 않았다.


  1. display
  2. list-style
  3. position
  4. float
  5. clear
  6. width / height
  7. padding / margin
  8. border / background
  9. color / font
  10. text-decoration
  11. text-align / vertical-align
  12. white-space
  13. other text
  14. content

간단히 분석을 해보자면, 모질라의 제안이나 내 방식이나 레이아웃을 설정하는 것을 최우선으루 두고, 영역을 이루는 객체의 크기를 잡고, 텍스트 단위의 색과 모양, 정렬을 설정하는 형태가 된다. 조금 더 세세히 들어가면 유지보수를 위해서 수정이 자주 일어날 수 있는 속성들을 상대적으로 앞으로 배치하게 된다. 예전에는 디자인을 완벽하게 스타일시트로 분리하여 제작하는 경우가 없어 대부분 링크나 텍스트 컬러만을 다루는 정도여서 스타일시트의 분량이 적었고, 따라서 속성 하나당 한줄씩 잡는 코딩 방식을 썼지만 최근에는 분량이 많이 늘어나 한 스타일을 한줄로 이어 붙이는 방식을 많이 사용하는 것 같다. 그래서 가로로 스크롤이 생기거나 두줄 이상으로 이어지는 경우가 많은데 이런 경우 바로 수정할 속성이 비교적 앞쪽에 위치해 있는 것이 편리하다. 더불어, 속성명과 값을 붙이는 것보다 한 칸 띄우는 것이 가독성에도 좋고, 수정에도 용이한 것 같다. 다만, 최종적인 스타일시트의 경우 용량이 커질 수 있으므로 빈 칸을 모두 제거하여 한 줄로 만드는 CSS압축방식을 적용하면 좋을것 같다.

//이미지 용량체크
    var isFileChecked = false;
    var isImgFile = false;
    var isEnableFileSize = false;
    var maxSize = 1*1024*1024;       //1M
    function checkFileSize(uploadImgObj){
        //
        var enableUploadFileExt=new Array("bmp","jpg","jpeg","gif");
        var uploadImgObjName = uploadImgObj.value;
        var startPoint = 0;
        var isImageFile = false;

        //File 체크확인
        isFileChecked = true;

        if(uploadImgObj.value == ""){
            return;
        }

        //이미지파일 확장자 체크
        for(var i=uploadImgObjName.length-1; i>=0; i--) {
            if(uploadImgObjName.charAt(i) == ".") {
                startPoint = i;
                break;
            }
        }
        var uploadImgObjExt = uploadImgObjName.substring(startPoint+1,uploadImgObjName.length);

        for(i=0; i<enableUploadFileExt.length; i++) {
            if(uploadImgObjExt.toLowerCase() == enableUploadFileExt[i]){
                isImageFile = true;
                break;
            }
        }
        if(!isImageFile){
            alert("이미지 파일이 아닙니다.     ");
            uploadImgObj.value="";
            isImgFile = false;
            return;
        }else{
            isImgFile = true;
        }

        //파일용량 체크
        var img = new Image();
        img.dynsrc = uploadImgObj.value;
        var filesize = img.fileSize;
        //alert(filesize);
        if(filesize > maxSize) {
            alert("파일업로드 허용용량 "+maxSize/1024+"Kbyte를 초과되었습니다.     ");
            isEnableFileSize = false;
        }else{
            isEnableFileSize = true;
        }
        //
    }

    //업로드승인체크
    function goFileUploadCheck(){
        if(!isFileChecked){
            alert("업로드할 파일을 지정해주셔야 합니다.     ");
            return;
        }

        if(!isImgFile){
            alert("이미지 파일이 아닙니다.     ");
            return;
        }

        if(!isEnableFileSize){
            alert("파일업로드 허용용량 "+maxSize/1024+"Kbyte를 초과되었습니다.     ");
            return;
        }
    }

<input id="txtUploadFile" style="width: 100%" type="file" size="40" name="NewFile"  onchange="javascript:checkFileSize(this);" />
 <input type="button" value="Upload" onclick="javascript:goFileUploadCheck();" />

추신 : 반드시 이것으로 만족하여 프로그래밍 하지 말고 반드시 서버단에서도 validation을 해주어야 한다!!!

그래도 발생하는 에러의 90%는  UI단에서 막을수 있다.

+ Recent posts