Avatar billede mklinge Nybegynder
06. februar 2013 - 18:28 Der er 24 kommentarer

Find <tr> ud fra <td>

Jeg sidder og har redigere lidt sharepoint - eller rettere sagt prøver at få sharepoint til at gøre et par ting, man ikke kan redigere out of the box.

Sagen er den, at jeg har en tabel (Med et unikt ID (ms-cal-gempty)), som bliver dynamisk genereret. Dvs jeg har ingen muligheder what-so-ever for at ændre i html "upfront".

Jeg har behov for at fjerne en (relativ stor) mængde rækker (<tr> tags). Problemet er dog følgende:
- De har ingen hverken ID eller Class tilknyttet
- Mængden der skal fjernes er dynamisk

Der er dog (I mit hoved) et lille lys forude. De <tr> tags jeg ønsker at beholde i tabellen indeholder alle <td> tags med en specifik class (ms-cal-walldayevent).

Der er en enkelt undtagelse til ovenstående, som heller ikke skal fjernes. Den indeholder <th> tags med en specifik class (ms-cal-wtopday)

Jeg har mulighed for at afvikle javascript og CSS på siden efter den er loadet, så jeg forestiller mig, at det må være muligt at adressere de <tr> tags via en parent-chield relation. Men jeg kan simpelthen ikke finde ud af hvordan jeg skal gøre det.

Jeg håber der sidder en venlig sjæl derude, som kan hjælpe mig på vej - på forhånd tak.

//M
Avatar billede olebole Juniormester
06. februar 2013 - 21:57 #1
<ole>

Under forudsætning af, at alle TR-elementer ligger i samme TBODY-element - og første TD i de rækker, du ønsker at gemme, har klassen 'ms-cal-walldayevent' - kan du gøre noget i stil med:

var aTR = document.getElementById("ms-cal-gempty").getElementsByTagName("tr"),
elmParent = aTR[0].parentNode,
aTD;

for (var i=aTR.length-1; i<=0; i--) {
    aTD = aTR[i].getElementsByTagName("td");
    if (aTD.length>0 && aTD[0].className==="ms-cal-walldayevent") {
        elmParent.removeChild(aTR[i]);
    }
}

Er forudsætningerne ikke opfyldt, må du lige sige til - så skriver jeg koden om  =)

/mvh
</bole>
Avatar billede olebole Juniormester
06. februar 2013 - 21:58 #2
Ups  :D

var aTR = document.getElementById("ms-cal-gempty").getElementsByTagName("tr"),
elmParent = aTR[0].parentNode,
aTD;

for (var i=aTR.length-1; i>=0; i--) {
    aTD = aTR[i].getElementsByTagName("td");
    if (aTD.length>0 && aTD[0].className==="ms-cal-walldayevent") {
        elmParent.removeChild(aTR[i]);
    }
}
Avatar billede mklinge Nybegynder
06. februar 2013 - 22:13 #3
Hej Ole

Tak for det :)

Alle de TR jeg ønsker at fjerne ligger under samme tbody (Der er mange andre på siden jeg bestemt ikke ønsker at fjerne :D)

Jeg ønsker dog, at fjerne alle som ikke indeholder den omtalte TD (Med class ms-cal-walldayevent) og ikke fjerne alle andre :)

Desværre er den heller ikke placeret som den første TD i TR tagget - faktisk kan den (også) være dynamisk placeret :(

//M
Avatar billede olebole Juniormester
07. februar 2013 - 00:34 #4
Dohhh ... det er da mig, der ikke tænker mig om! Det var jo dem, der ikke skulle fjernes! Sorry  =)

Her er en quick'n'dirty, som fjerner rækken, hvis den indeholder TD-elementer, samtidig med at dens kode ikke indeholder strengen "ms-cal-walldayevent". Håber, det går bedre  *D

var aTR = document.getElementById("ms-cal-gempty").getElementsByTagName("tr"),
elmParent = aTR[0].parentNode, sHtml;

for (var i=aTR.length-1; i>=0; i--) {
    sHtml = aTR[i].innerHTML;
    if (sHtml.toLowerCase().indexOf("td")>-1 && sHtml.indexOf("ms-cal-walldayevent")<0) {
        elmParent.removeChild(aTR[i]);
    }
}
Avatar billede mklinge Nybegynder
07. februar 2013 - 08:33 #5
Hej Ole

Tak for det :)

Skal jeg bare kalde funktionen med en onload eller hvordan? :)

//M
Avatar billede olebole Juniormester
07. februar 2013 - 13:21 #6
Ja, hvis det skal ske med det samme. Jeg vidste ikke, hvad der skulle udløse sletningen, så jeg skrev bare slettekoden  =)
Avatar billede jokkejensen Novice
07. februar 2013 - 13:24 #7
jquery:

$("tr").has("not(td.ms-cal-walldayevent)").remove()

@Ole >> nøøøj, så jeg lige en innerHtml der :)
Avatar billede olebole Juniormester
07. februar 2013 - 13:32 #8
Ja, naturligvis. Det vil næppe kunne overraske noget reflekterende menneske, hvis vedkommende blot sporadisk har fulgt mine advarsler om brugen af innerHTML  =)

Er der noget, du ikke forstår, opstiller du bare en punktliste. Vær ikke flov over, hvis den bliver lang ... du er blandt folk, der kender dig  *o)
Avatar billede mklinge Nybegynder
12. februar 2013 - 07:32 #9
Takker for din omskrivning Ole :)

Jeg kan dog ikke rigtigt få det til at virke :(

Jeg er ikke særlig velbevaret i javascript, så det er sikkert bare en fejl 40.

Nu hvor jeg kigger igennem kan jeg se, at jeg har givet dig lidt forkerte informationer. Tabellen har ikke et ID, der hedder 'ms-cal-gempty' - men i stedet er det en class.

@Jokke

Tak (tror jeg) - Jquery er en mulighed, men med mine manglende evner, så skal jeg vist have det serveret som en færdig løsning før jeg kan bruge det :)

//M
Avatar billede mklinge Nybegynder
12. februar 2013 - 13:23 #10
Jeg har kopieret en forsimplet version af html'en på tabellen ind her: http://pastebin.com/yZimQ7wb

Jeg ønsker at fjerne alle rækker undtaget den der starter i linje 4 og den der starter i linje 15. I dette tilfældet er det kun én række, men antallet kan være varierende.

Der er ingen mulighed for at angive yderligere id eller class til den html - nu hvor jeg kigger på html'en kunne det måske være en mulighed at fjerne alle <tr> som indeholder <td> med class='ms-cal-enoworkhourF'?

Endnu en gang mange tak for hjælpen :)

//M
Avatar billede olebole Juniormester
12. februar 2013 - 17:30 #11
Ahhh ... så kan du prøve:

function foo() {
    var aTR = document.getElementsByClassName("ms-cal-gempty")[0].getElementsByTagName("tr"),
    elmParent = aTR[0].parentNode, sHtml;
   
    for (var i=aTR.length-1; i>=0; i--) {
        sHtml = aTR[i].innerHTML;
        if (sHtml.toLowerCase().indexOf("td")>-1 && sHtml.indexOf("ms-cal-walldayevent")<0) {
            elmParent.removeChild(aTR[i]);
        }
    }
}

Den burde kunne gøre det  =)
Avatar billede mklinge Nybegynder
14. februar 2013 - 09:13 #12
Det virker ikke rigtigt til at virke, jeg har prøvet at kalde funktionen fra en knap - der kommer ingen error, men der sker heller ikke noget når jeg gør det :(

//M
Avatar billede olebole Juniormester
15. februar 2013 - 16:29 #13
Jeg kan ikke se, hvad du laver. Når jeg bruger koden sammen med din, virker den
Avatar billede mklinge Nybegynder
18. februar 2013 - 08:31 #14
Hmm det er underligt - nedenstående burde gøre det når jeg trykker på knappen ikke?

[code]
<script>
function foo() {
    var aTR = document.getElementsByClassName("ms-cal-gempty")[0].getElementsByTagName("tr"),
    elmParent = aTR[0].parentNode, sHtml;
   
    for (var i=aTR.length-1; i>=0; i--) {
        sHtml = aTR[i].innerHTML;
        if (sHtml.toLowerCase().indexOf("td")>-1 && sHtml.indexOf("ms-cal-walldayevent")<0) {
            elmParent.removeChild(aTR[i]);
        }
    }
}
</script>
<button onclick="foo">Fjern linjer</button>
[/code]

//M
Avatar billede mklinge Nybegynder
18. februar 2013 - 08:33 #15
Øv min code blev ædt :(

Har smidt det ind her: http://pastebin.com/tP2VNY5F

//M
Avatar billede olebole Juniormester
18. februar 2013 - 11:56 #16
Nej, det burde ikke virke ... det virker  =)
Avatar billede mklinge Nybegynder
18. februar 2013 - 12:14 #17
Men det gør det bare ikke, når jeg tester det live :(

Der sker intet, når jeg tester i en fuld html fil udenfor sharepoint heller. Hvad er der anderledes end det du har testet i?

http://pastebin.com/NvNzZQbR

//M
Avatar billede olebole Juniormester
18. februar 2013 - 12:27 #18
Jeg overså vist:

<button onclick="foo()">Fjern linjer</button>
Avatar billede mklinge Nybegynder
18. februar 2013 - 12:36 #19
Så får jeg en fejl i IE8 - men virker fint i Firefox.

Desværre skal det virke i IE8 :-(

Siden reloader af en eller anden årsag, så ændringen sker kun meget kort :-(

//M
Avatar billede olebole Juniormester
18. februar 2013 - 13:13 #20
Mon ikke nogen kunne have brug for at vide, hvad den fejl i IE8 præcist siger?
Avatar billede mklinge Nybegynder
18. februar 2013 - 15:05 #21
Det var en et godt input :)

Message: Object doesn't support this property or method

//M
Avatar billede olebole Juniormester
18. februar 2013 - 15:13 #22
Det er sikkert document.getElementsByClassName, men jeg er ikke helt sikker, da jeg ikke kan se et linjenummer.

Hvis tabellen er den første på siden, kan du bruge dette i stedet:

var aTR = document.getElementsByTagName("table")[0].getElementsByTagName("tr"),
Avatar billede mklinge Nybegynder
18. februar 2013 - 15:23 #23
Det er den linje ja - men kan desværre ikke altid være sikker på, at det er den første tabel på siden :(

//M
Avatar billede olebole Juniormester
18. februar 2013 - 15:26 #24
Så har jeg ikke noget bud
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester