Google
[1536]
 
 
 
 
 
 
 
 
 
 
 
 
¾×¼Ç½ºÅ©¸³Æ®  
 
 
 
 
 
 
 
 
 
 
 

[»ùÇñ¸Çöº¸±â]
ÇÊÀÚ´Â 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("½ºÅ¸Å©·¡ÇÁÆ® ´Ù¿î·Îµå");
    }