[»ùÇñ¸Çöº¸±â]
ÇÊÀÚ´Â 2005³â 4¿ù°æ ajax ´ë½Å¿¡ iframe À» »ç¿ëÇÏ¿© ÀÚµ¿¿Ï¼º ±â´ÉÀ» ±¸ÇöÇÑ ÀûÀÌ Àִµ¥, °Ë»öµÈ °á°ú¸¦ º¸¿©Áִ âÀ» ÇϳªÀÇ ÆÄÀÏ·Î µû·Î ¸¸µé¾î¼ »ç¿ëÇß¾ú°í ¼Óµµµµ ´Ù¼Ò ´À·È´ø °ÍÀ¸·Î ±â¾ïÇÑ´Ù.
±×·³ ajax ¸¦ ÀÌ¿ëÇÏ¿© ´Ü¼øÇÑ ÀÚµ¿¿Ï¼º ±â´É ¿¹Á¦¸¦ »ìÆìº¸ÀÚ.
<html>
<head>
<title>Ajax Auto Complete</title>
<style type="text/css">
.mouseOut {
background: #708090;
color: #FFFAFA;
}
.mouseOver {
background: #FFFAFA;
color: #000000;
}
</style>
<script type="text/javascript">
var xmlHttp;
var completeDiv;
var inputField;
var nameTable;
var nameTableBody;
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
function initVars() {
inputField = document.getElementById("names");
nameTable = document.getElementById("name_table");
completeDiv = document.getElementById("popup");
nameTableBody = document.getElementById("name_table_body");
}
function findNames() {
initVars();
if (inputField.value.length > 0) {
createXMLHttpRequest();
var url = "example16.php?names=" + escape(inputField.value);
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = callback;
xmlHttp.send(null);
} else {
clearNames();
}
}
function callback() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
var name = xmlHttp.responseXML.getElementsByTagName("name")[0].firstChild.data;
setNames(xmlHttp.responseXML.getElementsByTagName("name"));
} else if (xmlHttp.status == 204){
clearNames();
}
}
}
function setNames(the_names) {
clearNames();
var size = the_names.length;
setOffsets();
var row, cell, txtNode;
for (var i = 0; i < size; i++) {
var nextNode = the_names[i].firstChild.data;
row = document.createElement("tr");
cell = document.createElement("td");
cell.onmouseout = function() {this.className='mouseOver';};
cell.onmouseover = function() {this.className='mouseOut';};
cell.setAttribute("bgcolor", "#FFFAFA");
cell.setAttribute("border", "0");
cell.onclick = function() { populateName(this); } ;
txtNode = document.createTextNode(nextNode);
cell.appendChild(txtNode);
row.appendChild(cell);
nameTableBody.appendChild(row);
}
}
function setOffsets() {
var end = inputField.offsetWidth;
var left = calculateOffsetLeft(inputField);
var top = calculateOffsetTop(inputField) + inputField.offsetHeight;
completeDiv.style.border = "black 1px solid";
completeDiv.style.left = left + "px";
completeDiv.style.top = top + "px";
nameTable.style.width = end + "px";
}
function calculateOffsetLeft(field) {
return calculateOffset(field, "offsetLeft");
}
function calculateOffsetTop(field) {
return calculateOffset(field, "offsetTop");
}
function calculateOffset(field, attr) {
var offset = 0;
while(field) {
offset += field[attr];
field = field.offsetParent;
}
return offset;
}
function populateName(cell) {
inputField.value = cell.firstChild.nodeValue;
clearNames();
}
function clearNames() {
var ind = nameTableBody.childNodes.length;
for (var i = ind - 1; i >= 0 ; i--) {
nameTableBody.removeChild(nameTableBody.childNodes[i]);
}
completeDiv.style.border = "none";
}
</script>
</head>
<body>
<h1>Ajax Auto Complete Example</h1>
Names: <input type="text" size="20" id="names" onKeyUp="findNames();" style="height:20;"/>
<div style="position:absolute;" id="popup">
<table id="name_table" bgcolor="#FFFAFA" border="0" cellspacing="0" cellpadding="0"/>
<tbody id="name_table_body"></tbody>
</table>
</div>
</body>
</html>
<example16.html ÀÇ Àüü ¼Ò½º ÄÚµå>
<?
class xmlClass{
var $items = array();
var $searchstr = array();
function outputXml(){
header("Content-type: text/xml");
printf("<?xml version=\"1.0\" encoding=\"%s\" ?>\n","EUC-KR");
print("<rss version=\"2.0\">\n");
print("<result>\n");
$this->printChannel();
print("</result>\n");
print("</rss>\n");
}
function printChannel(){
foreach($this->items as $item){
foreach ($item as $name => $value){
$value = htmlspecialchars($value);
printf("<%s>%s</%s>\n",$name,$value,$name);
}
}
}
function addItem($item){
array_push($this->items,$item);
}
function makexml(){
$strlen = strlen($this->names);
foreach($this->searchstr as $key => $value){
//echo "value = $value, this->names = ".$this->names." <br>";
if(substr($value,0, $strlen) == $this->names){
$this->addItem(array("name"=> $value));
}
}
$this->outputXml();
}
}
$myxml = new xmlClass();
$myxml->searchstr = array("Abe","Abigail","Abner","Abraham","Marcus","Marcy","Marge","Marie");
$myxml->names = $names;
$myxml->makexml();
?>
<example16.php ÀÇ Àüü ¼Ò½º ÄÚµå>
[»ùÇñ¸Çöº¸±â]
À§ ±×¸²ÀÇ °Ë»ö¾î ÀÔ·Ââ¿¡ a ¶ó´Â ¹®ÀÚ¸¦ ÀÔ·ÂÇÏ¸é ¸ÅĪµÇ´Â ¹®ÀÚ¿ÀÇ ¸®½ºÆ®¸¦ º¸¿©ÁÖ´Â ±×¸²ÀÌ´Ù.
ÀÔ·Ââ¿¡ Ű¿öµå¸¦ ÀÔ·ÂÇϸé À̺¥Æ®°¡ ¹ß»ýÇϰí XHR °´Ã¼°¡ ¹®ÀÚ¸¦ GET/ºñµ¿±â ¹æ½ÄÀ¸·Î ¼¹ö·Î º¸³½´Ù. ¼¹ö¿¡¼´Â ¿äûÇÑ °Ë»ö¾î¿Í ¸ÅĪµÇ´Â °á°ú¸¦ XML ·Î ¸¸µé¾î¼ Ŭ¶óÀÌ¾ðÆ®·Î º¸³»°í, XHR °´Ã¼°¡ ÀÀ´ä XML À» ÆÄ½ÌÇØ¼ °á°ú¸¦ ȸ鿡 º¸¿©ÁÖ´Â È帧ÀÌ´Ù.
function callback() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
setNames(xmlHttp.responseXML.getElementsByTagName("name"));
} else if (xmlHttp.status == 204){//µ¥ÀÌÅͰ¡ Á¸ÀçÇÏÁö ¾ÊÀ» °æ¿ì
clearNames();
}
}
}
À§ ¸Þ¼Òµå¿¡´Â XHR °´Ã¼ÀÇ status Äڵ尡 204 ÀÏ °æ¿ì¸¦ ó¸®Çϰí ÀÖ´Ù. Áï, °Ë»ö °á°ú°¡ ¾øÀ» °æ¿ì¿¡ °á°úâÀ» Áö¿ì±â À§ÇÑ °ÍÀÌ´Ù.
À§ ¿¹Á¦¿¡¼ ´«¿©°Ü ºÁ¾ß ÇÒ ºÎºÐÀº XML ¿¡¼ µ¥ÀÌÅ͸¦ ºÐ¼®Çؼ µ¿ÀûÀ¸·Î °á°ú ȸéÀ» ¸¸µå´Â ºÎºÐÀÏ °ÍÀÌ´Ù. DOM °´Ã¼ÀÇ ¼Ó¼º ¹× ¸Þ¼Òµå¸¦ ¸¹ÀÌ Á¢ÇØ ºÁ¾ß ÇÑ´Ù.
function setNames(the_names) {
clearNames();
var size = the_names.length;
setOffsets();
var row, cell, txtNode;
for (var i = 0; i < size; i++) {
var nextNode = the_names[i].firstChild.data;
row = document.createElement("tr");
cell = document.createElement("td");
cell.onmouseout = function() {this.className='mouseOver';};
cell.onmouseover = function() {this.className='mouseOut';};
cell.setAttribute("bgcolor", "#FFFAFA");
cell.setAttribute("border", "0");
cell.onclick = function() { populateName(this);};
txtNode = document.createTextNode(nextNode);
cell.appendChild(txtNode);
row.appendChild(cell);
nameTableBody.appendChild(row);
}
}
À§ ¸Þ¼Òµå´Â °Ë»ö°á°úÀÇ ÇÑ ÇàÀ» ¸¸µé¾î Å×À̺íÀÇ <tr></tr> ¿ä¼Ò¸¦ µ¿ÀûÀ¸·Î »ý¼ºÇØ ÁÖ´Â ºÎºÐÀÌ´Ù. cell.onmouseout ¹× onclick ¸Þ¼Òµå »ý¼ºÇÒ¶§ setAttribute() ¸¦ »ç¿ëÇÏÁö ¾ÊÀº ÀÌÀ¯´Â IE °¡ Áö¿øÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. cross-browser, Áï ¸ðµç ºê¶ó¿ìÀú¿¡¼ À§ »ùÇà ½ÇÇàÀ» º¸Àå ¹Þ±â À§Çؼ´Â ÄÚµùÀ» À§Ã³·³ ÇØ Áà¾ß ÇÑ´Ù.
-------------------------- ÇÑ±Û ÆÐÄ¡ Ãß°¡(2006.02.23) ---------------------
À§ ¿¹Á¦´Â ÇÑ±Û Å×½ºÆ®°¡ ºÒ°¡´ÉÇϱ⠶§¹®¿¡ ÀÌ ±âȸ¿¡ Ajax ÀÇ Çѱ۹®Á¦¿¡ ´ëÇØ¼ »ý°¢ÇØ º¸ÀÚ. GET ¹æ½ÄÀ̵ç POST ¹æ½ÄÀÌµç ÆÄ¶ó¹ÌÅͰ¡ ¼¹ö·Î Àü´ÞµÉ¶§´Â ÇØ´ç ÆäÀÌÁö¿¡ ¼³Á¤µÈ charset À¸·Î ÀÎÄÚµù µÈ´Ù. ¿µ¹®À̳ª ¼ýÀÚ´Â ¹®Á¦°¡ ¾ÈµÇÁö¸¸ Çѱ۰ú °°Àº À¯´ÏÄÚµå ¹®ÀÚ´Â ÀûÀýÇÑ charset À¸·Î µðÄÚµùÇØÁÖÁö ¾ÊÀ¸¸é ??? ȤÀº ÀÌ»óÇÑ ¹®ÀÚ·Î Ãâ·ÂµÉ °ÍÀÌ´Ù.
Ajax ÀÇ °æ¿ì ÇÑ±Û ÀÎÄÚµù ¹®Á¦´Â ´ÙÀ½°ú °°ÀÌ µÎ ºÎºÐÀ¸·Î ³ª´©¾î¼ »ý°¢ÇØ º¼ ¼ö ÀÖ´Ù.
ù¹øÂ°´Â ºê¶ó¿ìÀúÀÇ XHR °´Ã¼¿¡¼ ÇÑ±Û ÆÄ¶ó¹ÌÅ͸¦ ÀÎÄÚµùÇÏ°í ¼¹ö¿¡¼ µðÄÚµùÇØ¼ ó¸®ÇÏ´Â °æ¿ìÀÌ´Ù. ¹°·Ð °°Àº charset À¸·Î ó¸® ÇØ¾ß µÈ´Ù. À̺κÐÀº °³¹ßÀÚ°¡ ÃæºÐÈ÷ charsetÀ» º¯°æÇÒ ¼ö ÀÖÀ¸¹Ç·Î À¯¿¬ÇÏ°Ô ´ëóÇÒ ¼ö ÀÖ´Ù.
µÎ¹øÂ°´Â ¼¹ö¿¡¼ ÀÎÄÚµùÇÏ°í ºê¶ó¿ìÀúÀÇ XHR °´Ã¼¿¡¼ ÇÑ±Û µ¥ÀÌÅ͸¦ µðÄÚµùÇÏ´Â °æ¿ìÀÌ´Ù. ¼¹ö¿¡¼ ÀÎÄÚµùÇÏ´Â °æ¿ì´Â °³¹ßÀÚ°¡ ¾ó¸¶µçÁö ¹Ù²Ü ¼ö ÀÖÁö¸¸ ºê¶ó¿ìÀú¿¡¼ Ajax °¡ µ¥ÀÌÅ͸¦ µðÄÚµùÇÒ °æ¿ìÀÇ charset Àº UTF-8 ·Î Á¤ÇØÁ® ÀÖ´Â°Í °°´Ù. ´Ù¸¥ charset À¸·Î º¯°æÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ Á¸ÀçÇÏ´ÂÁö´Â È®½ÇÇÏÁö ¾ÊÁö¸¸ ¿©·¯¹æ¸éÀ¸·Î Å×½ºÆ®ÇØ º» °á°ú UTF-8·Î ÁöÁ¤µÇ¾î ÀÖ´Â°Í °°´Ù. µû¶ó¼ ¼¹ö¿¡¼ ÀÎÄÚµùÇÏ´Â ºÎºÐ »Ó¸¸¾Æ´Ï¶ó ù¹øÂ°ÀÇ °æ¿ìµµ ¸ðµÎ charset À» UTF-8 À¸·Î ÀÎÄÚµù/µðÄÚµùÇÏ´Â ¹æ¹ýÀÌ Á¦ÀÏ °£´ÜÇÒ °ÍÀÌ´Ù.
1. ºê¶ó¿ìÀú¿¡¼ charset À» UTF-8 À¸·Î ¼³Á¤Çϱâ
¸ÕÀú autoComplete.html ÀÇ ¼Ò½º¿¡¼´Â charset À» UTF-8 ·Î ÀÎÄÚµù ÇØÁÖ´Â ºÎºÐ¸¸ ¼öÁ¤ÇØÁÖ¸é µÉ °ÍÀÌ´Ù.
var url = "AutoCompleteServlet?names=" + escape(inputField.value);
À§ Äڵ忡¼ escape ¸Þ¼Òµå´Â ÆÄ¶ó¹ÌÅ͸¦ À¯´ÏÄÚµå¹æ½ÄÀ¸·Î ÀÎÄÚµùÇϹǷΠÀÌ ¸Þ¼Òµå ´ë½Å¿¡ UTF-8 ¹æ½ÄÀ¸·Î ÀÎÄÚµùÇØÁÖ´Â ÀÚ¹Ù½ºÅ©¸³Æ® ¸Þ¼ÒµåÀÎ encodeURI ȤÀº encodeURIComponent À¸·Î ¾Æ·¡¿Í °°ÀÌ ¼öÁ¤ÇØ ÁØ´Ù.
var url = "AutoCompleteServlet?names=" + encodeURI(inputField.value);
À§ ¿¹Á¦´Â GET ¹æ½ÄÀ¸·Î ÀÛ¼ºµÇ¾úÀ¸³ª POST ¹æ½ÄÀÇ °æ¿ìµµ °°Àº ¹æ¹ýÀ¸·Î charset À» ¼³Á¤ÇØÁÖ¸é µÈ´Ù. ¾Æ·¡ ÄÚµå´Â POST ¹æ½ÄÀÇ findNames ¸Þ¼ÒµåÀÌ´Ù.
function findNames() {
initVars();
if (inputField.value.length > 0) {
createXMLHttpRequest();
var url = "AutoCompleteServlet";
xmlHttp.open("POST", url, true);
xmlHttp.onreadystatechange = callback;
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.send("names=" + encodeURI(inputField.value));
//encodeURI ´ë½Å¿¡ encodeURIComponent ¸¦ »ç¿ëÇØµµ °á°ú´Â µ¿ÀÏÇÏ´Ù.
} else {
clearNames();
}
}
2. ¼¹ö¿¡¼ charset À» UTF-8 ·Î ¼³Á¤Çϱâ
´ÙÀ½Àº AutoCompleteServlet ¼ºê¸´ ¼Ò½º¿¡¼ ¼öÁ¤ÇÒ ºÎºÐÀ» »ìÆìº¸ÀÚ.
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String prefix = request.getParameter("names");
.
.
.
À§ÀÇ doGet ¸Þ¼Òµå¿¡ charset À» UTF-8 À¸·Î ¼³Á¤ÇØÁÖ´Â Äڵ带 Ãß°¡ÇØÁØ´Ù. ±×·¯¸é ºê¶ó¿ìÀú¿¡ UTF-8 ¹æ½ÄÀ¸·Î ÀÎÄÚµùµÈ ÇÑ±Û ÆÄ¶ó¹ÌÅÍ´Â °°Àº charset À¸·Î µðÄÚµù µÉ °ÍÀÌ´Ù.
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String prefix = request.getParameter("names");
.
.
.
´ÙÀ½Àº ¼¹ö¿¡¼ ºê¶ó¿ìÀú·Î ÀÀ´äÀ» º¸³»±â Àü¿¡ charset À» UTF-8 ·Î ¹Ù²ãÁà¾ß ÇÑ´Ù.
response.setContentType("text/xml");
À§ ¼Ò½º Äڵ带 ¾Æ·¡¿Í °°ÀÌ ¼öÁ¤ÇØ ÁØ´Ù.
response.setContentType("text/xml;charset=UTF-8");
¸¶Áö¸·À¸·Î DB Á¶È¸°á°ú¸¦ °¡»óÀ¸·Î ²Ù¹Ì±â À§ÇÏ¿© ÇÑ±Û µ¥ÀÌÅ͸¦ Ãß°¡ÇØ ÁØ´Ù.
public void init(ServletConfig config) throws ServletException {
names.add("Abe");
names.add("Abel");
names.add("Abigail");
names.add("Abner");
names.add("Abraham");
names.add("Marcus");
names.add("Marcy");
names.add("Marge");
names.add("Marie");
names.add("½ºÅ¸Å©");
names.add("½ºÅ¸Å©·¡ÇÁÆ®");
names.add("½ºÅ¸Å©·¡ÇÁÆ® ġƮŰ");
names.add("½ºÅ¸Å©·¡ÇÁÆ® ´Ù¿î·Îµå");
}
|