Ajax: readystate 1 moetwillig

Status
Niet open voor verdere reacties.

0backslash0

Gebruiker
Lid geworden
3 jul 2007
Berichten
31
Hallo,

eerst en vooral, mijn excuses als dit niet het juiste sub-forum is.

Onlangs ben ik begonnen met een zoekfunctie voor een site, en na een beetje
googlelen stuite ik op een AJAX implementatie voor een livesearch.

Het zag er goed uit dus ben ik hieraan begonnen. De functie werkte naar behoren
en ik was nog enkele details aan het aanpasse, wanneer op een gegeven moment de
script niet meer werkte. Na enige tijd rondzoeken ben ik tot de vaststelling gekomen
dat het aanroepen van het php script constant readystate 1 retourneerd.

Indien ik via de browser naar het php bestand navigeer, werkt deze zonder problemen.
Dus ik snap niet goed waarom searchHandler.js hem niet behoorlijk kan laden.

volgende bestanden worden bij de zoekfunctie gebruikt:

livesearch.html - enkel het body gedeelte, in de head staat een verwijzing naar searchHandler.js
HTML:
<body>
		<form>
			<div class="searchfield">
				<label for="zoek_artikel_nr">Zoek op Artikel Nr: </label>
				<input type="text" size="30" name="zoek_artikel_nr" onKeyUp="sendRequestSearch('artikel_nr',this.value);" />				
			</div>
			
			<div class="searchfield">
				<label for="zoek_artikel">Zoek op Artikel: </label>
				<input type="text" size="30" name="zoek_artikel" onKeyUp="sendRequestSearch('artikel',this.value);" />
			</div>
			
			<div class="searchfield">
				<label for="zoek_streek">Zoek op Streek: </label>
				<input type="text" size="30" name="zoek_streek" onKeyUp="sendRequestSearch('streek',this.value);" />
			</div>
			<br style="clear: both;" />
			
			<input type="hidden" id="invoer_artikel" />
			
			<input type="button" style="clear: both;font-weight: bold;" value="Toevoegen" />
			<input type="reset" style="clear: both;font-weight: bold" value="Reset" onClick="document.forms[0].childNodes[15].innerHTML = 'something'" />
				
			<div id="zoek_resultaten"></div>
		</form>		
    </body>

searchHandler.js
Code:
function createRequestObject() {
    var newRequest;

    if(window.XMLHttpRequest){
        newRequest = new XMLHttpRequest();
    } else if(window.ActiveXObject) {
        newRequest = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        newRequest = NULL;
        alert('Probleem met het aanmaken van hetXMLHttpRequest object');
    }
    return newRequest;
}
var http = createRequestObject();

function sendRequestSearch(search_argument,searchstring) {
    var querystring = "search_argument="+search_argument+"&searchstring="+searchstring;

    http.open('get', 'http://localhost:8084/files/Sales/cgi-bin/search.php?'+querystring);
    http.onreadystatechange = handleResponseSearch();
    http.send(null);
}

function handleResponseSearch() {
    if(http.readyState == 4 && http.status == 200) {
        if(http.responseText) {
            document.forms[0].childNodes[15].innerHTML = 'you have some results';
        } else {
            document.forms[0].childNodes[15].innerHTML = "you don't have any results";
        }
    } else {
        document.forms[0].childNodes[15].innerHTML = "it failed, readystate = "+http.readyState;
    }
}

search.php
PHP:
<?php

require_once('connector.inc.php');
require_once('validateQuery.inc.php');

mysql_query('USE univer');
$query = "SELECT `art_nr`,`artikel`,`streek` FROM `wijnen`;";
$result = myquery($query);

$i = 0;
while ($row = mysql_fetch_assoc($result)) // The array that will hold the row that is returned
{
    /**
      * Now that we have the array that holds the row content,
      * we need to put it's content into a formatted string
      */
    $i++;
    $rows[$i] = $row;
}
unset($row, $query, $result, $i);

// Placing the form input into local variables, while also tripping any leading & trailing whitespace
$zoek_argument = trim($_GET['search_argument']);
$searchstring = trim($_GET['searchstring']);

if(isset($searchstring) && !false == (boolean)$searchstring) {
    foreach ($rows as $row)
    {
        switch ($zoek_argument)
        {
            case 'artikel_nr':
                foreach($row as $value)
                {
                    unset( $value);
                    if (strstr($row['art_nr'], $searchstring)) {
                        echo '<span onclick="document.forms[0].invoer_artikel.value=this.childNodes[0].nodeValue">' . $row['art_nr'] . ' - ' . htmlentities($row['artikel']) . '</span><br />' . "\n";
                    }
                }
                unset($row);
                break;

            case 'artikel':
                foreach($row as $value)
                {
                    unset( $value);
                    if(strstr($row['artikel'], $searchstring)) {
                        echo '<span onclick="document.forms[0].invoer_artikel.value=this.childNodes[0].nodeValue">' . $row['art_nr'] . ' - ' .htmlentities($row['artikel']) . '</span><br />' . "\n";
                    }
                }
                unset($row);
                break;

            case 'streek':
                foreach($row as $value)
                {
                    unset($value);
                    if(strstr($row['streek'], $searchstring)) {
                        echo '<span onclick="document.forms[0].invoer_artikel.value=this.childNodes[0].nodeValue">' . $row['art_nr'] . ' - ' . htmlentities($row['artikel']) . '</span><br />' . "\n";
                    }
                }
                unset($row);
                break;

            default:
                break;
        }
    }
}
mysql_close($link);
unset($rows, $searchstring, $zoek_argument, $link);
exit;

?>

Ik hoop dat dit was duidelijk is:)
 
Laatst bewerkt:
Geen idee of het hier aan licht, maar dit lijkt me redelijk vaag
http.onreadystatechange = handleResponseSearch();
handleResponseSearch() retourneert toch nix?
 
Beste,

de handleResponseSearch() functie past de innerHTML aan van de div met id
zoekresultaten.

de content is dus
- "you have some results" indien het php bestand resultaten weergeeft
- "you don't have any results" indien het php bestand geen resultaten weergeeft
- "it failed" + de readystate code indien de readystate dus niet 4 is.

hier loopt het dus fout, want de readystate is telkens 1
 
Laatst bewerkt:
Ja, ik zie wat de functie doet, maar ik snap niet hoe je hem ergens aan kunt toekenen aangezien het meer een procedure is dan een functie, aangezien je nix retourneert. Was het ook zo in de originele code dan?

Hoop voor jou dat deze vraag snel opgelost geraakt, maar ik ben vanaf morge 4 weken weg, dus kan je niet verder helpen ;)
 
de originele code komt van een tutorial op sitemasters. Bij het testen werkte dit dus naar behoren. Pas nadat ik een paar
aanpassingen heb aangebracht werkte het niet meer, maar ik zie niet waar het fout gaat.
 
als je wilt dat de functie geroepen wordt zodra de readystate veranderd moet je dit schrijven

Code:
http.onreadystatechange = handleResponseSearch;



Als je dit doet wordt de waarde die de functie één keer geroepen, de teruggestuurde waarde wordt genomen en op onreadystatechange gedumpt.
Code:
http.onreadystatechange = handleResponseSearch();
 
hartelijk dank om mij op deze eenvoudige fout te wijzen.

Waarom ik die ronde haakjes nadien heb bijgezet weet ik niet meer. Aangezien handleResponseSearch inderdaad geen waarde retourneerd en dit ook niet hoefd te doen
heb ik de ronde haakjes dan weggenomen. Dat ik daar zo over zag... :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan