webForumDet fria alternativet

Highlight på ord i en xml fil

2 svar · 435 visningar · startad av Pedda

PeddaMedlem sedan juni 20006 032 inlägg
#1

Funderar på hur jag enklast markerar ett ord i en xml fil.
Jag kan enkelt skicka med ordet i querysträngen, t.ex sidan.xml?highlight=Ordet
Men hur gör jag sen enklast. Javascript i XSL-filen?

PeddaMedlem sedan juni 20006 032 inlägg
#2

Problemet löste sig efter mycket slit. :)

PeddaMedlem sedan juni 20006 032 inlägg
#3

Kom på att någon annan kan ha nytta av koden, så här är den.

markup.js

// plocka ut sökordet ur querysträngen
loc = location.search,
searchWord = (loc.indexOf("h")>0)?loc.split("?h=")[1]:null;

// kontrollera webbläsare
var ns4 = (document.layers);
var ie4 = (document.all && !document.getElementById);
var ie5 = (document.all && document.getElementById);
var ns6 = (!document.all && document.getElementById);
	
// kontrollera så vi har ett sökord
if(searchWord == null || searchWord == "") {	
}
else {
	searchDOMTree(searchWord);
}

// loopa igenom elementen i xml filen
function searchDOMTree(myWord) {
	a = document.getElementsByTagName("*");
	traverseDOMTree(a[0], myWord);				
}

function traverseDOMTree(currentElement, myWord){
	if (currentElement){
		var j;
	    var tagName = currentElement.tagName;
	    // Skriver nodernas tagName som <A>, <IMG>, etc
	    if (tagName){
		} 
		else {
			// Greppa sökordet
			var myQuery = myWord;
			
			// Om längden på nodeValue är större än 1 så finns det text
			if(currentElement.nodeValue.length > 1){
			 	// Splitta nodeValue med myQuery som avgränsare
			 	// Nu case sensitive!
				var myOfset = 1;
				var myWordsArray = myStringsArray = new Array();
				var sSring = currentElement.nodeValue;
				var tWord = myWord;
				if(sSring.toUpperCase().match(tWord.toUpperCase())){
					// Init Reg exp stuff
					var re = new RegExp(tWord,"i");
					var myOfset = sSring.search(re);
					var re = new RegExp(tWord,"ig");
					var myWordsArray = sSring.match(re);
					var myStringsArray = sSring.split(re);
					var re = new RegExp("\n","g"); // ny rad
					
					var sSring = sSring.replace(re,"");
					var re = new RegExp("\f","g"); // form feed
					var sSring = sSring.replace(re,"");
					var re = new RegExp("\r","g"); // carriage return
					var sSring = sSring.replace(re,"");
					//
					// Temporära element och strängar
					var begCaseF = false;
					var textBefore = "";
					var textAfter = "";	
					var myParentElement = currentElement.parentNode;
					var myCurrentElementEmptyClone = currentElement.cloneNode(false); // #Text	
					var myParentElementEmptyClone = document.createElement("span"); // Används som container
					
					if(ie5){
						if((sSring.indexOf(myWordsArray[0],0))==0){
							// Det finns ingen text före ordet
							// är i första positionen.
							var begCaseF = true;
						} 
						else {
							
							textBefore = myStringsArray[0];
							var textBefore_content = document.createTextNode(textBefore);
							myParentElementEmptyClone.appendChild(textBefore_content);
						}
					}
					
					if(ns6){
						textBefore = myStringsArray[0];
						var textBefore_content = document.createTextNode(textBefore);
						myParentElementEmptyClone.appendChild(textBefore_content);
					}
					
					var si = 1;
					
					for(x = 0; x < myWordsArray.length; x++){
						
						// 1. Nytt element
						var newElement = document.createElement("span");
						newElement.className = "markup";
						
						// 2. Lägg till ordet
						var newElement_content = document.createTextNode(myWordsArray[x]);
						newElement.appendChild(newElement_content);
						
						myParentElementEmptyClone.appendChild(newElement);
						// Texten efter
						if(begCaseF){
							textAfter = myStringsArray[x];
						}
						
						if(myStringsArray[si] != undefined){
							
							textAfter = myStringsArray[si];
						}
						
						if(textAfter != undefined){
							var textAfter_content = document.createTextNode(textAfter);
							myParentElementEmptyClone.appendChild(textAfter_content);
						}						
					}
					myParentElement.replaceChild(myParentElementEmptyClone,currentElement);	
				} 	
			}	      	
		}
		
	    // Gå igenom trädstrukturen
	    var i=0;
	    var currentElementChild=currentElement.childNodes[i];
	    while (currentElementChild){
	     	// Gå igenom trädstrukturen rekursivt på child noderna
	      	traverseDOMTree(currentElementChild,myWord);
	      	i++;
	      	currentElementChild=currentElement.childNodes[i];	      	 
	    }
	}
}
130 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)