Har en sida där det kommer upp textrutor som måste fyllas i ifall man är försenad. Dessa textrutor (element) kan finnas många av eller endast en. Jag ska då kolla om textrutan är ifylld men mitt problem är att det när det är en koms åt med document.form.sentext.value och om det finns flera (array)så är det document.form.sentext[0] som ska gälla. Dock så bryter skriptet vid koll om det är det andra....
Jag har provat document.form.sentext===Array men den vill inte vara med när den väl är array.
Hur kollar man om ett element är array i formuläret?
Oj, det var inte riktigt förståeligt för mig. Men jag tolkar det som att det är typeof som ska användas för att kolla om det är array. Jag lägger hela min nuvarande icke fungerande kod här, den ger s=1 hela tiden...
function sen() {
if ( typeof document.visabest.sentext === 'number') { s = 0 } else { s = 1}
prompt( s, '');
if (s > 0) {
if (document.visabest.sentext.value.length > 0) {
prompt('en', '');
if (document.visabest.sensign.value.length > 0) {
document.visabest.fardig.disabled = false;
}
}
}
else {
//prompt('arr', '');
if (document.visabest.sentext[0].value.length > 0) {
if (document.visabest.sensign[0].value.length > 0) {
document.visabest.fardig[0].disabled = false;
}
}
}
}
fast document.visabest.sentext kommer inte vara ett number, det är inte heller en array du få när du hämta DOM element det är en nodlista du har att jobba med.
Om du nu skapar dynamiskt fält så antingen få du ut ett element eller en nodeList beroende på vad du få ut (när du kolla det med isNodeList funktionen i mitt inlägg så kan du loopa ut alla fält (for-loopen) annars om det bara är ett element (detta är kanske inte korrekt skriven då den kan vara null också) så kommer den träffa else satsen i if frågan.
Det var slarvigt av mig att skicka in den koden men typeof document.visabest.sentext.value.length === 'number' borde väl funka?
Mitt problem med din kod är att jag inte riktigt förstår hur den ska testas. Du skapar en variabel som blir en funktion som du sedan hänvisar i en annan funktion. Hur anropar du detta? Att du loopar ut resultat förstod jag.
fast length retunera alltid ett tal så det är rätt meningslöst du vill i så fall kolla om den är större än 0 (eller bara låta den vara).
Min funktion är skriven på ett annolunda sätt bara.. men kolla igenom exempelt så ser du att jag anropar funktionen (inne i if frågan) för att se om den är en nodeList om sentexts är det så loopar den ut kollektionen, annars så kör den bara en gång... vad du nu vill göra.
kan kanske ha missförstått vad du vill göra, jag tog det att du hade fler än ett fält med samma namn som du kunde skapa upp med javascript?
Nej jag tror inte att length alltid anger en siffra.
Mitt huvudsakliga problem är att om det är en array av element och jag frågar vad document.visabest.sentext.value.length är så blir det skriptfel och den bara hoppar över skriptet. Så jag är endast intresserad av att ta reda på om elementet sentext är en array eller inte? Om det är en array så läser man ut det med document.visabest.sentext[0].value.length.
Jag vet inte hur jag ska anropa ditt exempel? Kan du ange något mer?
Nej jag tror inte att length alltid anger en siffra.
det kommer den alltid göra, förutom när du ha en kollektion av element med samma namn (vilket du kommer få om jag förstå dig rätt).
Om du bara ha ett element med namnet 'sentext' så kommer du få värdet ifrån den och då kollar du längden på den (om det är en tom sträng då bli längden självklart 0).
Så jag är endast intresserad av att ta reda på om elementet sentext är en array eller inte?
Och det gör jag i mitt kod exempel, om det är en nodeList så kommer den loopar igenom alla element och just nu gör inget (förutom att skriva inne i konsollens logg vilket element den är inne i). ersätt
console.log(sentexts); med den kod du vill köra (där sentexts är den aktuella elementet i loopen). Om det inte är en nodelista så tar mitt exempel för givet att det finns minst ett element med namnet 'sentext' och i så fall skriver den ut den i loggen).
Ett problem du kan få är 'fardig' (och 'sensign') det måste finnas lika många sådna som det finns 'sentext' element, om det är det så är det bara att köra fardig inne i din loop och köra en enable/disable på den.
Du få komma med HTML exempel på ett scenario du har problem, om denna info inte hjälper.
Min gissning är att detta borde lösa ditt problem:
var isNodeList = function(el) {
return typeof el === 'object' && typeof el.length === 'number' && typeof el.item == 'function';
};
var checkLate = function(lateText, sign, done) {
if(lateText.value.length && sign.value.length) {
done.disabled = false;
}
};
var sentexts = document.visabest.sentext;
var sensign = document.visabest.sensign;
var fardig = document.visabest.fardig;
if(isNodeList(sentexts)) {
// many
for(var i = 0;i<sentexts.length;i++) {
checkLate(sentexts[i], sensign[i], fardig[i]);
}
} else {
// single
checkLate(sentexts, sensign, fardig);
}
Men om det är en array och du frågar efter length som om det vore en variabel (ej array) så är elementet undefined eller null och då ger inte length något värde. Det är ju här som jag har problemet.
Jag vet hur jag ska plocka ut mina värden om jag bara i kod kan konstatera om det är en array eller inte.
Med ditt kodexempel så fastnar det på raden med lateText.length... och säger
SCRIPT5007: Det går inte att hämta värdet för egenskapen length: objektet är null eller odefinierat
Och ja, fardig, sentext och sensign är alltid lika många av.
Men om det är en array och du frågar efter length som om det vore en variabel (ej array)
Förstå inte vad du menar där. Vet inte vad du vill göra med .length i dina exempel men den kommer inte ta någon array värde utan den kommer kolla vad document.visabest.sentext kommer ha för värde men så fort visabest skapar fler gånger så är inte document.visabest ett element längre utan en nodeList.
så är elementet undefined eller null och då ger inte length något värde. Det är ju här som jag har problemet.
Det är det jag skrev, att du förmodligen få kolla att sentexts faktist är något.
Jag får i stort sätt hela tiden samma fel att variablen är null eller undefined. Men [0] eller inte gör skillnaden om det funkar eller inte. Har rensat koden på oväsentligheter som menyer och annat.
jag få bara fel pga att du kör din sen() funktion när den borde köra sen1()?
jag vet inte om du vill toggla enable/disabled heller (räcker att man ändra båda fälten en gång sen kan man radera texten och ändå behålla knappen tryckbar)
Voigtann1, jag lyfter på hatten och tackar så väldigt mycket :) :) :)
Efter lite testande så funkade din kod nästan rakt av. Om du har tid så förklara gärna vad som är så speciellt med IE8 och quirk mode. Kan jag förvänta mig att denna kod kommer sluta att fungera vid uppgradering? (den funkade i firefox)
Äldre webbläsare har inte alla metoder och API som de senare webbläsarna ha (i detta fall var det item i nodeList. Quirks mode hamnar du i om du inte ange en korrekt doctype och vissa webbläsare gå ner i version då så du inte kan använda all CSS, JS och en del HTML kod som du normalt kan använda dig av i din aktuella webbläsare.
278 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849