webForumDet fria alternativet

Bevara onchange och lägga till mer?

JavaScript

5 svar · 322 visningar · startad av jabbalizer

Medlem sedan jan. 2001229 inlägg
Frågan#1

Jag har ett script med en funktion som körs onload i <body>.
Denna funktion använder document.getElementsByTagName('INPUT') för att ta fram alla <input>.

I vissa fall lägger den till xxxx.onchange = function(){someFunction(this);};

Nu till frågan:
Hur bär jag mig åt för att inte skriva över en eventuell onchange="någonjavascriptfunktion();" som angetts direkt i html?
Jag vill alltså köra min funktion först, och sen även köra det som eventuellt angetts direkt i koden.

Har googlat en del men inte hittat vad jag söker.. Länkar någon?

Medlem sedan jan. 2001229 inlägg
#2

En teori..

Detta fungerar i FF (men är kanske inte så vackert). IE7 däremot tycker inte att eval returnerar ett giltigt värde.

Någon som vet hur man kan göra om en textsträng till "function" igen i IE?

var oldEvent = "";
if(coll[i].onchange != null){
    var str = coll[i].onchange.toString();
    oldEvent = str.substring(str.indexOf('{')+1,str.lastIndexOf('}')-1);
}
coll[i].onchange=eval("function(){ValidateText(this);"+oldEvent+"};");
Medlem sedan juni 20008 205 inlägg
#3

eval är ondska i nio fall av tio, och en gråzon i de resterande fallen. Otestad variant:

coll[i].__old_onchange = coll[i].onchange;
coll[i].onchange = function () {
    doThatFunkyStuff();
    if (this.__old_onchange) return this.__old_onchange.apply(this, arguments);
    else return true;
}
Medlem sedan jan. 2001229 inlägg
#4

Verkar vara precis vad jag är ute efter :)
Tackar!

Medlem sedan maj 200010 687 inlägg
#5

Eller ännu bättre. :p

if (coll[i].addEventListener)
	coll[i].addEventListener("change", doThatFunkyStuff, false);
else if (coll[i].attachEvent)
	coll[i].attachEvent("onchange", doThatFunkyStuff);
Medlem sedan juni 20008 205 inlägg
#6

Den varianten är lätt snyggare, men det beror på hur neolitkompatibel man vill vara :) Finns iofs kanske ingen anledning att bry sig om typ NS4 längre...

260 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)