Voor een project heb ik gebruik gemaakt van JQuery en phpjs. Door gebruik te maken van Jquery als abstractielaag had ik natuurlijk gehoopt incompatibiliteit tussen verschillende browsers te kunnen oplossen. Op de eerst testversie kreeg ik toch te horen dat alles in Internet Explorer niet zo werkt als gemoeten had.
In eerste instantie werd ik gewezen op de live()-functie. Om deze functie te kunnen gebruiken moest ik Jquery updaten van versie 1.2.3. naar 1.3.2. Toen ik dat gedaan had , kreeg ik nog veel meer problemen……
De laatste versie bleek niet 100% backwards compatibel, jammer. Probleem leek hier in te zitten: Old, XPath, style attribute selectors: [@attr=value]. These have been deprecated for quite some time – and we’re finally removing them. To fix it just remove the @!.
Mijn eerste probleem bleek overigens ook niet met de live()-function te worden opgelost. Probleem bleek het uitlezen van een href-attribuut in een link. In dit attribuut plaatste ik een woord wat ik later weer uitlas. Internet Explorer bleek automatische de complete URL voor dit woord te plaatsen. Of dat logisch is vraag ik mij af. Toen kon ik het oplossen door mijn woord te verplaatsen naar het rev-attribuut.
Phpjs spaart nu toch wel wat tijd, al zag ik eerste instantie het nut niet zo. Ik zag het vooral als een leuk project. Tot mijn spijt ontdekte ik alleen dat zowel preg_replace en preg_match nog niet geïmplementeerd waren. Dat waren nu net de functies die ik nodig had…… In eerste instantie leek het mij logisch om deze functie gewoon te schrijven m.b.v. de javascript regular expressions. Kevin van Zonneveld wees meer er echter terecht op dat de javascript (ECMA-262 standard) regular expressions niet gelijk zijn aan de uit perl ontleende versie (The open source PCRE library) gebruikt voor PHP (zie ook: http://www.regular-expressions.info/refflavors.html). Ondanks deze beperking heb ik nu zelf twee functies geschreven, die voorlopig i.i.g. doen waar ik ze voor nodig heb. Beide functies staan hieronder en maken gebruik van: toRegexp(), omdat een regular expression in javascript geen string is. RegExp is een apart type, met twee parameters, daarom is casting van een string naar een RegExp niet mogelijk.
function toRegexp(regexpstring)
{
var result = regexpstring.match(/(\/)(.+)(\/)(.*)/);
return new RegExp(result[2],result[4]);
}
function preg_replace(search, replace, subject,limit,countername)
{
//
// version: 0.0001
// discuss at: http://phpjs.org/functions/preg_replace
// + original by: Bas Jobsen (http://www.w3masters.nl/)
// * example 1: preg_replace(['/^test | test | test$/g','/ +/g'],[' ',' '],'boektest andertest test');
// * returns 1: 'boektest andertest'
//
// * use a global var with 'countername' to count replacements
// * var counter=0;
var s = [].concat(search);
var r = [].concat(replace);
var lim = 0;
var end = s.length;
var j=0;
var k=0;
for(var i=0; i
searchstr = toRegexp(search[i]);
while(lim-- && subject!=(subject=subject.replace(searchstr,replace[j]))){k++;};
}
if(countername)eval(countername+'=k');
return subject;
}
function preg_match(pattern,subject,matchesname,flags,offset)
{
//
// version: 0.0001
// discuss at: http://phpjs.org/functions/preg_match
// + original by: Bas Jobsen (http://www.w3masters.nl/)
// * example 1: var matches = new Array();
// * example 1:alert(preg_match('/boek/','tes/t boektest andertest test','matches',1));
// * example 1:alert (matches[0]);
// * example 1:alert (matches[1]);
// * alerts 1: 1
// * alerts 1: 'boek'
// * alerts 1: 6
// * use a global var (array) with 'matchesname' to get matches
// * var matches = new Array();
if(offset>0)
{
subject=subject.substring(offset);
pattern=pattern.replace(/\^/,'');
}
var result = subject.match(toRegexp(pattern));
if(!result) return 0;
for(i = 0; i < result.length; i++) { eval(matchesname+'['+i+']=\''+result[i]+'\''); } if(flags==1) { eval(matchesname+'['+i+']='+subject.indexOf(result[0])); } return 1; }