Just nu i M3-nätverket
Gå till innehåll

sökresultat i ny sida


fickler

Rekommendera Poster

hej,

 

jag har precis lagt in en sökfunktion på en hemsida. Sökrutan ligger i menyn och jag vill att resultatet ska visas i en ny sida som heter result.php. Har nästan fått det att funka, problemet är att när man inte är på result.php och söker så skickas man bara dit utan att resultatet visas.

 

Ledsen för en rörig förklaring, hoppas lite kod kan göra det tydligare:

 

Sökscriptet:

[log]

var pages=[
{ url:"http://www.messe.se", title:"Hannovermässans Sverigekontor", keywords:"hem, start, index", description:"Startsida" },
{ url:"http://www.messe.de", title:"Deutsche Messe", keywords:"tyskland, deutschland, germany", description:"Huvudkontoret i Tyskland" },
{ url:"http://www.messe.se/new/result.php", title:"Hannovermässans Sverigekontor", keywords:"sök,sökmotor,search", description:"Sökmotor på vår 	hemsida." },
{ url:"http://www.jojoxx.net", title:"jojoxx.net - Webprogamming made easy", keywords:"jojoxx,webb,html,javascript,css,perl",
  description:"Information och tips inom området webbpublicering. Arkiv och guider för Perl, JavaScript och DHTML. FAQ-arkiv." }
];

var config={
hitsPerPage:10
}
function makesearch(obj){
if(obj){
	var t=obj.q.value.toLowerCase().split(/ /g);
	config.searchTerms=t;
	config.startAt=0;
} else {
	t=config.searchTerms;
}
var result=new Array(pages.length); for(var n=0;n<result.length;n++){ result[n]=new Object(); result[n].hits=0; result[n].page=n; }
var hits=0;
for(var n=0;n<t.length;n++){
	if(t[n]){
		for(var p=0;p<pages.length;p++){
			if((pages[p].keywords+","+pages[p].title).toLowerCase().match(new RegExp(t[n]))){
				result[p].hits++;
			}
		}
	}
}
result=sortobj(result,"hits").reverse();
var resultStr="";
for(var n=0;n<result.length;n++){
	if(result[n].hits>=1){ // >=t.length only shows all search words hits
		hits++;
		if(hits>config.startAt && hits<=config.startAt+config.hitsPerPage){
			var i=result[n].page;
			var title=(pages[i].title)?pages[i].title:pages[i].url;
			resultStr+=hits+' <a class="resultLink" href="'+pages[i].url+'">'+title+'</a><br/>';
			if(pages[i].description){ resultStr+='<div class="resultDescription">'+pages[i].description+'</div>'; }
			resultStr+='<div class="resultURL">'+pages[i].url+'</div>';
		}
	}
}
if(hits==0){
	resultStr=document.getElementById("searchresult").innerHTML="Din sökning gav tyvärr inga träffar.";
} else {
	resultStr="<p>Sökningen gav "+hits+" träffar, visar "+(config.startAt+1)+" till "+(Math.min(config.startAt+config.hitsPerPage,hits))+".</p><p>"+resultStr+"</p>";
	if(hits>config.hitsPerPage){
		resultStr+="Resultatsida: ";
		resultStr+=(config.startAt>0)?'<a href="#" onclick="config.startAt='+(config.startAt-config.hitsPerPage)+'; return makesearch();"><<</a> ':'<< ';
		resultStr+=(config.startAt+config.hitsPerPage<hits)?'<a href="#" onclick="config.startAt='+(config.startAt+config.hitsPerPage)+'; return makesearch();">>></a> ':'>> ';
	}
}
document.getElementById("searchresult").innerHTML=resultStr;
return false;
}
function sortobj(obj,prop){
var a=[];
if(prop){
	for(var i in obj){ a[a.length]=[i,obj[i][prop]]; }
	a=a.sort(function(a,{ return ((a[1]<b[1])?-1:((a[1]>b[1])?1:0)); } )
} else {
	for(var i in obj){ a[a.length]=[i]; }
	a=a.sort(function(a,{ return ((a[0]<b[0])?-1:((a[0]>b[0])?1:0)); } )
}
var ret=(obj.length)?new Array(obj.length):{};
for(var i in a){ ret[a[i][0]]=obj[a[i][0]]; }
return ret;
}

[/log]

 

På sidan:

[log]

<li class="search"><form onSubmit="return makesearch(this)" action="result.php"><input name="q" value="skriv ditt sökord här" onfocus="if (this.value == 'skriv ditt sökord här') this.value = ''" type="text" class="search" title="Sök på messe.se" size="20"> <input type="submit" value="Sök"></form></li>
  </ul>

[/log]

 

Någon vänlig/smart människa som kan ge ett svar på mitt problem?

 

//fickler

Länk till kommentar
Dela på andra webbplatser

är att när man inte är på result.php och söker så skickas man bara dit utan att resultatet visas.

 

Det beror på att det du ber browsern göra här:

<form onSubmit="return makesearch(this)" action="result.php"><input name="q" value="skriv ditt sökord här" onfocus="if (this.value == 'skriv ditt sökord här') this.value = ''" type="text" class="search" title="Sök på messe.se" size="20"> <input type="submit" value="Sök"></form>

Är just att vid submit, ropa på ditt script och sen skicka formulärinnehållet (inte resultatet av scriptet) till result.php.

 

Givet hur ditt javascript ser ut förstår jag inte riktigt vitsen med result.php, sökningen verkar ju göras lokalt. Vill du visa resultaten på den sidan är nog det enklaste att göra motsvarande kod i php och låta det vara baserat på vad du i result.php får för data från formuläret.

 

Om du verkligen vill göra sökningen i javascript där du gör det, skulle ett alternativ kunna vara att spara resultatet (så länge det inte är för stort) i en cookie och sen skicka användare till result.php. Fast det är en rätt bräcklig lösning.

För att det ska fungera måste du förmodligen göra ett par ändringar. t.ex se till att det är scriptet som skickar användaren vidare till result.php när den har satt kakan. Men som sagt, det är inget jag skulle rekommendera.

 

Personligen tycker jag att det är tveksamt om den där funktionen ger något mervärde, det vore bättre att antingen skriva något i php som verkligen sökte i filerna (om sajten är relativt statisk eller i den eventuella databas där texterna ligger. Nästan ingen kommer att ha någon glädje av en sökning som bara baserar sig på den korta mening du valt att beskriva varje sida med.

Fast som ett lära-sig-projekt fyller det ju en funktion så låt dig inte nedslås av det :-)

 

Hoppas inte svaret gick dig helt över huvudet.

Länk till kommentar
Dela på andra webbplatser

tack för svar!

 

jag håller med om att det är en rätt bräcklig lösning, men det var den enda jag hittade när jag surfade runt.. kan inte koda nåt själv men förstår ganska bra när scriptet är klart så man får ta det som finns... ;-)

 

håller med om att en php lösning skulle vara bättre och söka alla texter på riktigt, har dock ingen aning om hur en sådan kod skulle se ut.. har du nåt tips, kanske en länk eller likande vore det guld!

 

//fickler

Länk till kommentar
Dela på andra webbplatser

Sidospår: Välkommen tillbaka fhe! (eller har jag bara lyckats missa att du varit tillbaka ett tag?)

:thumbsup: :thumbsup: :thumbsup:

Länk till kommentar
Dela på andra webbplatser

eller har jag bara lyckats missa att du varit tillbaka ett tag?

Du har nog koll... Fast jag är tillbaka på någon slags i-mån-av-tid-basis. (tack)

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...