데이터베이스 테이블: 콘텐츠를 클립보드 코드에 복사:
CREATE TABLE `xqbar`.`suggest` (
`id` INT NOT NULL AUTO_INCREMENT ,
`제목` VARCHAR( 100 ) NOT NULL ,
`히트` INT NOT NULL DEFAULT '0',
기본 키(`id`)
) ENGINE = InnoDB가
presents(title,hits)values('xqbar.com',100)에 삽입;
제안(제목, 조회수) 값('www.xqbar.com',410)에 삽입;
제안(제목, 조회수) 값('http://xqbar.com',700)에 삽입;
presents(title,hits)values('mail:xqbar.com',200)에 삽입;
presents(title,hits)values('ftp:xqbar.com',100)에 삽입;
제안(제목, 조회수)값('http://www.xqbar.com',70)search.php에 삽입하세요.
(저는 PHP를 접한지 오래되지 않았습니다. 아래 PHP가 너무 장황하다면 전문가의 조언을 구합니다)
반환된 정보 문자열은 xxx1|xxx2$200|100이어야 합니다. 앞과 뒤의 클립보드 코드에 대한 해당 복사 내용:
<?php
if($_GET["action"]!=''){
#사용자가 입력한 키워드를 가져옵니다
$keyword=$_GET["키워드"];
#필터 키워드
$keyword=str_replace("[","[[]",$keyword);
$keyword=str_replace("&","[&]",$keyword);
$keyword=str_replace("%","[%]",$keyword);
$keyword=str_replace("^","[^]",$keyword);
#데이터베이스 연결
$conn=mysql_connect("localhost","xqbar","xqbaradmin");
#데이터베이스 선택
@mysql_select_db("xqbar") 또는 die('죄송합니다');
mysql_query('이름 설정 utf-8');
#쿼리문
$sql="제목 선택, '%".$keyword."%'와 같은 제목의 조회수 순서는 10까지 제한됩니다.";
$result=mysql_query($sql);
#Loop를 통해 쿼리 결과를 얻고 문자열을 반환합니다.
#형식은 결과 1|결과 2$결과 1 클릭수|결과 2 클릭수입니다.
if($결과){
$i=1;$title='';$hits='';
while($row=mysql_fetch_array($result,MYSQL_BOTH))
{
$title=$title.$row['제목'];
$hits=$hits.$row['조회수'];
if($i<mysql_num_rows($result))
{
$title=$title."|";
$hits=$히트."|";
}
$i++;
}
}
mysql_close();
}
?>
<?php echo $title.'$'.$hits;?>클립보드 코드에 콘텐츠를 복사하는 js 코드:
prototye.js를 소개한 후 몇몇 친구들은 이 라이브러리가 너무 크다거나 익숙하지 않다면 jquery.js 프레임워크를 사용하거나 직접 ajax 객체를 생성할 수 있다고 말했습니다. 이에 대해서는 이야기하고 싶지 않습니다. . 여기서는 prototye.js 프레임워크를 직접 인용합니다.
<script type="text/javascript" src="prototype.js"></script>
레이어를 생성하고 쿼리 결과를 표시하는 Node.js 코드
<스크립트 유형="텍스트/자바스크립트">
//쿼리 결과에서 마우스가 미끄러지는 위치를 나타내는 변수 lastindex를 정의합니다. 초기에는 -1입니다.
var 마지막 인덱스=-1;
//사용자가 입력한 키워드를 기반으로 ajax 쿼리를 수행할지 여부를 나타내는 변수 플래그를 정의합니다. false는 쿼리가 허용됨을 의미하고 true는 쿼리가 금지됨을 의미합니다.
var 플래그=false;
//반환된 쿼리 결과에 의해 생성된 배열의 길이
var 목록 길이=0;
//효율성을 최적화하기 위해 사용자 정의 문자열을 생성합니다.
함수 StringBuffer(){this.data=[];}
//과제
StringBuffer.prototype.append=function(){this.data.push(arguments[0]);return this;}
//산출
StringBuffer.prototype.tostring=function(){return this.data.join("");}
//문자열 양쪽 공백 제거
String.prototype.Trim = function(){return this.replace(/(^s*)|(s*$)/g, "");}
//숨겨진 기능은 주로 표시된 프롬프트 드롭다운 레이어와 iframe을 숨기는 것입니다. iframe의 기능은 아래에서 설명합니다.
함수 숨겨진 검색()
{
$('rlist').style.display="없음";
$('rFrame').style.display="없음";
}
//표시 기능은 주로 프롬프트 드롭다운 레이어와 iframe 매개변수 num을 표시합니다. 이 매개변수에 따라 표시되는 프롬프트 레이어와 iframe의 높이가 제어됩니다.
함수 showsearch(숫자)
{
$('rlist').style.display='';
$('rFrame').style.display='';
//여기서 반환된 각 쿼리 결과의 프롬프트 높이를 20px로 정의하고, 스타일을 정의할 때 1픽셀씩 패딩을 사용했기 때문에 프롬프트 레이어의 전체 높이가 num에 추가됩니다.
$('rlist').style.height=num*20+num+'px';
//iframe의 높이도 지정합니다.
$('rFrame').style.height=num*20+num+'px';
}
//텍스트 입력 상자의 좌표 함수를 반환합니다. 매개변수 요소는 반환할 개체입니다. 매개변수 offset은 각각 왼쪽 창의 상단 모서리에서 개체의 절대 위치를 나타냅니다.
//www.devdao.com 이 기능을 사용하여 표시하려는 프롬프트 레이어를 찾으면 프롬프트 레이어가 텍스트 입력 상자 아래에 올바르게 표시됩니다.
함수 getposition(요소, 오프셋)
{
var c=0;
동안(요소)
{
c+=요소[오프셋];
요소=element.offsetParent
}
c를 반환;
}
//프롬프트 레이어를 생성하는 기능에는 프롬프트 레이어가 포함되어 있으며 텍스트 입력 상자 아래에 선택 드롭다운 상자가 나타나는 것을 방지하기 위해 프롬프트 레이어는 더 이상 그 위에 있는 iframe을 선택할 수 없습니다.
//텍스트 입력 상자 아래에 선택 드롭다운 상자가 있으면 아래에서 위로 선택 드롭다운 상자-iframe-프롬프트 레이어인 것으로 이해될 수 있습니다.
함수 createlist()
{
//프롬프트 레이어 생성
var listDiv=document.createElement("div");
//레이어 ID 프롬프트
listDiv.id="rlist";
listDiv.style.zIndex="2";
listDiv.style.position="절대";
listDiv.style.border="단단한 1px #000000";
listDiv.style.BackgroundColor="#FFFFFF";
listDiv.style.display="없음";
listDiv.style.width=$('keyword').clientWidth+"px";
listDiv.style.left=getposition($('keyword'),'offsetLeft')+1.5+"px";
listDiv.style.top =(getposition($('keyword'),'offsetTop')+$('keyword').clientHeight +3)+"px";
var listFrame=document.createElement("iframe");
listFrame.id="rFrame";
listFrame.style.zIndex="1";
listFrame.style.position="절대";
listFrame.style.border="0";
listFrame.style.display="없음";
listFrame.style.width=$('keyword').clientWidth+"px";
listFrame.style.left=getposition($('keyword'),'offsetLeft')+1+"px";
listFrame.style.top =(getposition($('keyword'),'offsetTop')+$('keyword').clientHeight +3)+"px";
document.body.appendChild(listDiv);
document.body.appendChild(listFrame);
}
함수 setstyle(요소, 클래스 이름)
{
스위치(클래스 이름)
{
'm'의 경우:
element.style.fontSize="12px";
element.style.fontFamily="arial,sans-serif";
element.style.BackgroundColor="#3366cc";
element.style.color="검정색";
element.style.width=$('keyword').clientWidth-2+"px";
element.style.height="20px";
element.style.padding="1px 0px 0px 2px";
if(element.displaySpan)element.displaySpan.style.color="흰색"
부서지다;
사례 'd':
element.style.fontSize="12px";
element.style.fontFamily="arial,sans-serif";
element.style.BackgroundColor="흰색";
element.style.color="검정색";
element.style.width=$('keyword').clientWidth-2+"px";
element.style.height="20px";
element.style.padding="1px 0px 0px 2px";
if(element.displaySpan)element.displaySpan.style.color="녹색"
부서지다;
't' 경우:
element.style.width="80%";
if(window.navigator.userAgent.toLowerCase().indexOf("firefox")!=-1)element.style.cssFloat="left";
그렇지 않으면 element.style.styleFloat="왼쪽";
element.style.whiteSpace="nowrap";
element.style.overflow="숨김";
element.style.textOverflow="줄임표";
element.style.fontSize="12px";
element.style.textAlign="왼쪽";
부서지다;
'h' 경우:
element.style.width="20%";
if(window.navigator.userAgent.toLowerCase().indexOf("firefox")!=-1)element.style.cssFloat="right";
그렇지 않으면 element.style.styleFloat="오른쪽";
element.style.textAlign="오른쪽";
element.style.color="녹색";
부서지다;
}
}
함수 포커스 항목(색인)
{
if($('item'+lastindex)!=null)setstyle($('item'+lastindex),'d');
if($('항목'+색인)!=null)
{
setstyle($('item'+index), 'm');
마지막색인=색인;
}
else $("keyword").focus();
}
함수 검색click(index)
{
$("keyword").value=$('title'+index).innerHTML;
플래그=참;
}
함수 searchkeydown(e)
{
if($('rlist').innerHTML=='')return;
var keycode=(window.navigator.appName=="Microsoft Internet Explorer")?event.keyCode:e.which;
//아래에
if(키코드==40)
{
if(마지막 색인==-1||마지막 색인==목록 길이-1)
{
포커스아이템(0);
검색클릭(0);
}
또 다른{
focusitem(lastindex+1);
검색클릭(마지막색인+1);
}
}
if(키코드==38)
{
if(마지막 인덱스==-1)
{
포커스아이템(0);
검색클릭(0);
}
또 다른{
focusitem(lastindex-1);
검색클릭(lastindex-1);
}
}
if(키코드==13)
{
focusitem(마지막색인);
$("keyword").value=$('title'+lastindex).innerText;
}
if(keycode==46||keycode==8){flag=false;ajaxsearch($F('keyword').substring(0,$F('keyword').length-1).Trim()); }
}
함수 showresult(xmlhttp)
{
var result=unescape(xmlhttp.responseText);
if(결과!=''){
var resultstring=new StringBuffer();
var title=result.split('$')[0];
var hit=result.split('$')[1];
for(var i=0;i<title.split('|').length;i++)
{
resultstring.append('<div id="item'+i+'" onmousemove="focusitem('+i+')" onmousedown="searchclick('+i+')">');
resultstring.append('<span id=title'+i+'>');
resultstring.append(title.split('|'));
resultstring.append('</span>');
resultstring.append('<span id=hits'+i+'>');
resultstring.append(hits.split('|'));
resultstring.append('</span>');
resultstring.append('</div>');
}
$('rlist').innerHTML=resultstring.tostring();
for(var j=0;j<title.split('|').length;j++)
{
setstyle($('item'+j),'d');
$('item'+j).displaySpan=$('조회수'+j);
setstyle($('title'+j),'t');
setstyle($('히트'+j),'h');
}
showsearch(title.split('|').length);
listlength=title.split('|').length;
마지막 인덱스=-1;
}
그렇지 않으면 숨겨진 검색();
}
함수 ajaxsearch(값)
{
new Ajax.Request('search.php',{method:"get",parameters:"action=do&keyword="+escape(value),onComplete:showresult});
}
함수 메인()
{
$('keyword').className=$('keyword').className=='inputblue'?'inputfocus':'inputblue';
if($F('keyword').Trim()=='')hiddensearch();
또 다른
{
if($F('keyword')!=''&&flag==false)ajaxsearch($F('keyword').Trim());
if(listlength!=0)$('keyword').onkeydown=searchkeydown;
그렇지 않으면 숨겨진 검색();
}
}
함수 oninit()
{
$('keyword').autocomplete="off";
$('키워드').onfocus=main;
$('키워드').onkeyup=main;
$('keyword').onblur=hiddensearch;
생성목록();
}
Event.observe(window,'load',oninit);
</script>검색 상자 콘텐츠를 클립보드 코드로 복사:
<form id="form1" name="form1" method="post" action="">
<b>검색 키워드 입력</b>
<input name="keyword" type="text" class="inputblue" id="keyword" maxlength="20" style="width:300px;"
</form>