PDA

Volledige versie bekijken : [Webkit] Bug in 'zoek op pagina' script


Dauntless
%Europe/Berlin %663 %2009, 16:55
Hey,

Ik heb in mijn AIR applicatie (die html bestanden inlaadt) een functie toegevoegd om lokaal op een pagina te zoeken. Als basis hiervoor heb ik het volgende script genomen:
http://www.seabreezecomputers.com/tips/find.htm

Dit werkt vrij goed. Er zijn slechts 2 problemen:
- Als het laatste woord gevonden is en er opnieuw gezocht wordt, zou hij opnieuw bovenaan moeten beginnen (zoals bv FireFox dat doet)
- Als het zoekwoord veranderd wordt, zou hij ook terug bovenaan moeten beginnen.

Je kan hier testen:
http://www.dauntless.be/Temp/find.html

Test in Safari! Het zal niet werken in FireFox en dat hoeft ook niet aangezien het in een Air applicatie (dus met webkit) zal draaien.

Ik gok dat het probleem aan de resettext() functie ligt die gewoon zijn taak niet doet. Ik heb geprobeerd om deze functie op te roepen wanneer de search functie 'false' teruggaf, maar zonder effect.

//edit
Als iemand een volledig ander .js script kent dat in safari werkt, laat gerust weten!

Bedankt voor het lezen :).

Greets!

matzo
%Europe/Berlin %683 %2009, 17:24
Na een lang en hilarisch msn gesprek(compleet met enkele faceplants) zijn we eruit gekomen met deze code(met alle onnodige code voor andere browsers eruit gehaald):
/* Loosely based on Jeff Baker's findit script:
www.seabreezecomputers.com

*/


var sel; // Selection object needed for Firefox
var range; // range object needed for Firefox




// variable to record number fo finds
var finds = 0;
var wasFalse = false;

var previous = "";

function findit(string)
{
if(string == "") return;

if(previous != "" && previous != string)
{
wasFalse = false;
resettext();
}
previous = string;


sel = window.getSelection(); // get selection
// remove all ranges
if(sel.rangeCount > 0) sel.removeAllRanges();

if (finds > 0)
{
// add last highlighted range
sel.addRange(range);
}


if(window.find(string, false, false) == false)
{
resettext();
if(!wasFalse)
{
wasFalse = true;
findit(string, true);
}
}


sel = window.getSelection(); // get selection
range = sel.getRangeAt(0); // get object

finds++;

} // end function findit()



// This function resets the txt selection pointer to the
// beginning of the body so that we can search from the
// beginning for the new search string when somebody
// enters new text in the find box
function resettext()
{
finds = 0;
} // end function reset()

Dauntless
%Europe/Berlin %689 %2009, 17:32
Ging vlotter dan verwacht :). (Hoe meer fun, hoe minder moeilijk het lijkt wellicht)

Thx ;)


//edit
Nog wat gefine-tuned
var sel; // Selection object needed for Firefox
var range; // range object needed for Firefox


var wasFalse = false;

var previous = "";

function findit(string)
{
if(string == "") return;
//alert("1");
if(previous != "" && previous != string)
{
wasFalse = false;
resettext();
}
previous = string;
//alert("2");


if(window.find(string, false, false) == false)
{
//alert("6")
resettext();
//alert("7")
if(!wasFalse)
{
// alert("8")
wasFalse = true;
// alert("9")
findit(string);
}
else
{
notifyDocFromJS("notFound");
}
}
else
{
wasFalse = false;
}

//finds++;

}

function resettext()
{

sel = window.getSelection(); // get selection
if(sel.rangeCount > 0) sel.removeAllRanges();
}