Autor Zpráva
Amunak
Profil
Dnes snad poslední javascriptový dotaz :)

Mám hotový, vygenerovaný kód a potřebuji z něj smazat určitou část. Je to vlastně od počátku tagu <span> k jeho ukončovací značce. Jenže ten span nemá ID ani nic, čím bych to mohl adresovat a na stránce se mu mění pořadí. Jediné co znám je jeho obsah.

Říkal jsem si, že by to mělo nějak jít přes regulární výrazy a funkce pro práci s textem, ale to je všechno, co jsem byl schopný vymyslet.
Leo
Profil
Nejjednodussi je mu dat id.

Kazdopadne muzete pouzit bud nacteni innerHTML a parsovani pres regularni vyrazy, nebo prochazet uzly az se dostanete k hledanemu textu v nejake vlastnosti nodeValue. Leo
Amunak
Profil
Leo:
Nejjednodussi je mu dat id.
To je přesně to, co udělat nemůžu, protože vlastně upravuji kód doplňkem GreaseMonkey až po jeho načtení a do kódu stránky jako takového nemám možnost ze strany serveru zasáhnout.

a parsovani pres regularni vyrazy
přesně něco takového jsem měl na mysli, ale nevím, jak to napsat. Mohl byste mi prosím ukázat konkrétní kód? Díky.
Chamurappi
Profil
Reaguji na Amunaka:
Můžeš rekurzivně projít celý dokument (tedy <body>, potomky <body>, potomky potomků <body>, potomky potomků potomků <body>, potomky potomků potomků potomků <body>, potomky potomků potomků potomků potomků <body>, potomky potomků potomků potomků potomků potomků <body>, potomky potomků potomků potomků potomků potomků potomků <body>, atd.) a v každém elementu se mrknout na text uvnitř. (To vlastně už radí Leo, ale ne tak důkladně.)

přesně něco takového jsem měl na mysli
Pokud přepíšeš innerHTML celého dokumentu, zřejmě tím narušíš funkčnost ostatních skriptů, které se stránkou pracují.
Amunak
Profil
Nakonec jsem se uchýlil k tomuto jednoduchému řešení, které překvapivě funguje:
document.body.innerHTML = document.body.innerHTML.replace(oldstr, '');

Díky všem za pomoc.

//Edit: Chamurappi, odemkneš mi to prosím? :)

Nakonec jsem přišel na to, že to přeci jen ruší skripty na stránce, konkrétně veškeré EventListenery. Takže Chamurappi měl zase pravdu (ch jo). Jenže já vůbec netuším, jak to udělat takhle rekurzivně, jak jsi popisoval, takže bych prosil o ukázku kódu... Ještě jednou díky.
Amunak
Profil
OK, takže ještě jednou. Prosím o konkrétní ukázku, jak ve stránce projít všechny určité tagy a v nich nahradit řetězec. Díky.
Chamurappi
Profil
Reaguji na Amunaka:
Budeš mít funkci, které předáš jako argument nějaký element a ta cyklem projde všechny potomky dotyčného elementu. Textové uzly (ty mají potomek.nodeType = 3) porovnáš se svým hledaným textem a podle nálezu se rozhodneš, co dál; elementy (ty mají potomek.nodeType = 1) předáš jako argument té své hledací funkci (bude tedy volat sebe sama).
Leo
Profil
Tož tak :-) Pokud je tam nejvýš jeden span, který se má smazat, a hledany text ("ahoj") je primo v nem, neformatovany:

var span = document.body.getElementsByTagName("span");
var pocet = span.length;
for (var i=0; i<pocet; i++) {
 if (span[i].firstChild.nodeValue=="ahoj") {
  span[i].parentNode.removeChild(span[i]);
  break;
 }
}
Amunak
Profil
Nechápu to. Udělal jsem si z toho funkci, prootže to využiji vécekrát, ale nefunguje to.
function SmazTag(tagname, inside) {
  var tag = document.body.getElementsByTagName(tagname);
  var pocet = tag.length;
  for (var i=0; i<pocet; i++) {
   if (tag[i].firstChild.nodeValue==inside) {
    tag[i].parentNode.removeChild(tag[i]);
    break;
   }
  }

}


V konzoli se vypisuje chyba:
Chyba: span[i].firstChild is null
Řádek: 148


Což je řádek s
if (span[i].firstChild.nodeValue==inside){



jenže dělá mi to i v tom tvém nezměněném kódu, nechápu proč.

Nakonec jsem to udělal takhle, a to už funguje:
/* FCE NA MAZÁNÍ TAGŮ */
function SmazTag(tagname, inside) {
  var tag = document.body.getElementsByTagName(tagname);
  var pocet = tag.length;
  for (var i=0; i<pocet; i++) {
    if (tag[i].innerHTML==inside) {
      tag[i].parentNode.removeChild(tag[i]);
      break;
    }
  }
}


Ještě jednou, Leo, díky.
Leo
Profil
To je proto, ze span muze byt prazdny a to jsem neosetril, podminka by byla

if (span[i].firstChild && span[i].firstChild.nodeValue=="ahoj")

ani to neresi situaci, kdy je ve spanu jeste vnorena znacka apod., kdyz je tech spanu k mazani vic apod. Byla to jen hruba kostra. Leo
Amunak
Profil
No hlavně, že jsem to z té kostry byl schopný sestrojit tak, že to fungovalo. Takže ještě jednou díky, bez tohohle bych se dál nedostal. Už to tu zamknu, protože jsme to vyřešili :)
Toto téma je uzamčeno. Odpověď nelze zaslat.