Jump to content

Recommended Posts

I have a search form where on user input matching details from the MySQL database are returned.  This all works fine.  However, I want to have an autocomplete field based on previous searches (search_history) table in the database.  I've looked at a few examples online but I can't get it to work.  I've debugged the code and there are no errors so I can't see why it isn't working, hopefully you can help me

 

There are 3 files: search.php contains the main form for user input; searchS.php queries the database for entries in the search_history table that match the user input for the autocomplete; the ajax_search.js is shown below

<script language='JavaScript' type="text/javascript">
//form validation method
function ValidateForm(){
	var q=document.searchForm.q
	//check that the search field is not blank
	if ((q.value==null)||(q.value=="")){
		alert("Search field can't be blank!")
		q.focus()
		return false
	}
	return true
	}

function GetXmlHttpObject(){
var xmlHttp=null;
try{
	//Firefox, Safari, Opera 8.0+
	xmlHttp=new XMLHttpRequest();
}
catch(e(
{
	//IE
	try{
		xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch(e){
		xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
}
return xmlHttp;
}

//get browser specific xmlhttprequest object
function getXmlHttpRequestObject(){
if(window.XMLHttpRequest){
	return new XMLHttpRequest();
	} 
	else if (window.ActiveXObject){
		return new ActiveXObject("Microsoft.XMLHTTP");
		} 
		else {
			alert("Upgrade Browser");
			}
}
//get the autocomplete
var searchR = getXmlHttpRequestObject();
//search method - keyup call
function searchS() {
var q = document.searchForm.q;
//start AJAX request
if (searchR.readyState == 4 || searchR.readyState == 0) && q.value.length > 2) {
var st = escape(document.getElementById('q').value);
searchR.open("GET", '"searchS.php"?q=' + st, true);
searchR.onreadystatechange = handleSearchS;
searchR.send(null);
}
}
//method to be called when AJAX response returned
function handleSearchS(){
if(searchR.readyState == 4){
	var ss = document.getElementById('search_s')
	ss.innerHTML = '';
	var st = searchR.responseText.split("\n");
	for(i=0; i < st.length - 1; i++){
		//build element string - IE does not support dynamically added attributes
		var s = '<div onmouseover = "javascript:suggestOver(this);" ';
		s += 'onmouseout="javascript:suggestOut(this);"';
		s += 'onclick="javascript:setS(this.innerHTML);"';
		s += 'class="suggest_link>' + st[i] + '</div>';
		ss.innerHTML += s;
	}
}
}
//mouseover
function suggestOver(div_value){
div_value.className = 'suggest_link_over';
}
//mouseout
function suggestOut(div_value){
div_value.className = 'suggest_link';
}
//click
function setS(value){
document.getElementById('q').value = value;
document.getElementById('search_s').innerHTML = '';
}
</script>

the css is in an external stylesheet but the code relating to the autocomplete is listed below:

search_s
{
position: absolute; 
background-color: #FFFFFF; 
text-align: left; 
border: 1px solid #000000;	
color: #000000;
display: block;
margin: 0 0 0 0.2em;
padding: 0 0 0 0;
z-index: 50000;	
}
.suggest_link {
margin: 0 0 0 0;
padding: 4px 3px 4px 3px;
min-width: 12em;
}
.suggest_link_over {
font-weight: bolder;
margin: 0 0 0 0;
padding: 4px 3px 4px 3px;
min-width: 12em;
}

 

What am I doing wrong?  The form search.php has to be 'get' for the actual search once the 'submit' button is clicked to work.

 

[attachment deleted by admin]

OK so I stripped it down and found out I had a few errors to do with browser compatibility.

 

I'm still unable to pull the query results from searchS.php and populate the text field.

 

I think it has something to do with this line:

 

searchReq.open("GET", 'searchS.php?search=' + str, true);

 

The URL changes to searchS.php?search= (plus whatever the user input is but no autocomplete in the textfield).

 

My JS file now looks like this:

<script language='JavaScript' type="text/javascript">
function getXmlHttpRequest(){
var xmlhttp;
if(window.XMLHttpRequest){
	xmlhttp = new XMLHttpRequest();
	} else{
		try{
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
		}
		catch(e1){
			try{
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} 
			catch(e2) {}
		}
	}
	if(!xmlhttp){
		alert('cannot create XMLHTTP instance');
		return false;
		}
		return xmlhttp;
		}

var searchReq = getXmlHttpRequest();
function handleSearchSuggest(){
	var ss = document.getElementById('search_s');
	ss.innerHTML = '';
	var str = searchReq.responseText.split("\n");
	for(i=0; i < str.length - 1; i++){
		var suggest = '<div onmouseover="javascript:suggestOver(this);"';
		suggest += 'onmouseout="javascript:suggestOut(this);"';
		suggest += 'onclick="javascript:setSearch(this.innerHTML);"';
		suggest += 'class="suggest_link">' + str[i] + '<\/div>';
		ss.innerHTML += suggest;
		}
	}
function searchS(){
	if(searchReq.readyState == 4 || searchReq.readyState === 0){
		var str = escape(document.getElementById('q').value);
		searchReq.open("GET", 'searchS.php?search=' + str, true);
		searchReq.onreadystatechange = handleSearchSuggest;
		searchReq.send(null);
		}
	}


	function suggestOver(div_value){
		div_value.className = 'suggest_link_over';
		}
	function suggestOut(div_value){
		div_value.className = 'suggest_link';
		}
	function setSearch(value){
		document.getElementById('q').value = value;
		document.getElementById('search_suggest').innerHTML = '';
		}
</script>

 

The search.php form looks like:

$body .= '
    <form name="searchForm" id="searchForm" action="search.php" method="get">
      <fieldset class="search">
  <legend>Search</legend>
 <p>Search filenames, bookmarks and entities.</p>
        <input type="text" name="q" id="q" size="60" onkeyup="searchS();" autocomplete="off"/>
        <input type="hidden" name="s" value="0" />
        <input type="hidden" name="l" value="10" /><br/><br/>
        <input type="submit" value="Search" name="btn" class="btn"/>
	<div id="search_s"></div>
      </fieldset>
    </form>';

 

And searchS.php is attached

 

[attachment deleted by admin]

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.