Autor Zpráva
MATRAUX
Profil
Dobrý den,

mám problém při vkládání znaků pomocí event.keyCode a už si fakt nevím rady, prošel jsem snad všechny vlákna tady na foru ale nic moc jsem k tomu nenašel

funkce pro vkládání znaku:

function enter(id){
if (event.keyCode == 13){
var tag = '<br>';
var id = document.getElementById(id);
if (document.selection){
id.focus();
set = document.selection.createRange();
set.text = tag;
}
else if (id.selectionStart || id.selectionStart == 0) {
startPos = id.selectionStart;
endPos = id.selectionEnd;
id.value = id.value.substring(0, startPos) + tag + id.value.substring(endPos, id.value.length);
}
else id.value += tag;
}
}

funkce je v externím souboru wf.js

textarea zapsaná na stránce: <textarea id="txtarea21" onKeyDown="enter(this.id);"

při stisknutí klávesy "Enter" se mi vloží do textového pole textarea znaky <br>
bohužel ve firefoxu to nic nedělá, nevím proč ale Firefox nechce zpracovat podmínku if (event.keyCode == 13){vložení znaku}
pokud vynechám podmínku if (event.keyCode == 13){vložení znaku} firefox vloží znaky <br> úplně bez problémů (samozřejmně po každém stisku jakékoliv klávesy)

Moderátor Chamurappi: Vkládej prosím kódy mezi značky [pre] a [/pre] (stačí kliknout na ).
Chamurappi
Profil
Reaguji na MATRAUXe:
Proč zjišťuješ ID objektu a pak podle ID dohledáváš objekt? Proč nepředáš jako argument přímo this?
Problém je v odlišném přístupu k objektu event, v Exploreru je dostupný globálně, ale v Mozille se předává pouze lokálně zpracovávajícímu kódu.

Takže v HTML uprav volání: onKeyDown="enter(this, event);"
A pozměň skript:
function enter(id, event){
  if (event.keyCode == 13){
    var tag = '<br>';
    if (document.selection){
      // atd.
sysel
Profil
Je fakt, že s konceptem event.keyCode jsem měl ve FF rovněž problémy a příklady převzaté z Intenetu často nefungovaly. Tohle se chytlo a tak to používám, aniž bych znal zdůvodnění, proč.
Pokusím se přepsat to pro daný účel:

<script>
function getkey(e)
{ var code;
  if (!e)       var e = window.event; // pro IE
  if (e.keyCode) code = e.keyCode;    // IE a Mozilla - onkeydown .. číslo klávesy
  else
    if (e.which) code = e.which;      // NN4          - onkeypress .. utf znaku
  return code;
} 

function enter(id,el){
if (getkey(el) == 13){
var tag = '<br>';
...
}
</script>
...
<body>
<textarea id="txtarea21" onKeyDown="enter(this.id, event);" .....>
</body>


Nějaké ty odlišnosti mezi MSIE a FF řeší fce getkey(e). Váš skript však nadále nefunguje. Připadá mi dost neobratné lovit hledaný objekt přes metodou getElementById(this.id), když výsledek je totožný s -this-. S tím se budete muset poprat. Velmi nedoporučuji používat jako identifikátory slova totožná s klíčovýmy (příkladně -id-).
sysel
Profil
No a než jsem to vyblekotal, tak jsem tady za Plhu :-) Ale jsem rád, že se tak moc od Chamurappiho neliším :D
Chamurappi
Profil
Reaguji na sysla:
Tvůj řádek 4 není potřeba, e tam bude i v Exploreru.
sysel
Profil
Děkuji Chamurappimu,
jen si dovolím pozanamenat, že jsem to prachsprostě opsal a nerozumím tomu ani zbla. S pochopením registrování událostí mám dost problém a řeším to ryze empiricky. Ocenil bych na to téma nějakou základní literaturu.

Jinak za mých mladých let jsme se učili, že v každém programu je alespoň jedna instrukce chybná a jedna zbytečná. Opravou se nejméně jeden chybný řádek opět vloží. Takže teoreticky se dá každý program zredukovat na jednu instrukci, která je zbytečná a chybná zároveň. :D
Fred
Profil
nerozumím tomu, ale určitě bych vyhodil to onkeydown z textarey úplně pryč.
function bum(id){
document.getElementById(id).onkeydown=function(e){
  e=(window.event)?event:e;
  if(e.keyCode==13){
    var tag='<br>';
    var ids=document.getElementById(id);
    if(document.selection){
    ids.focus();
    set=document.selection.createRange();
    set.text=tag;
  }
  else if(ids.selectionStart||ids.selectionStart==0){
    startPos=ids.selectionStart;
    endPos=ids.selectionEnd;
    ids.value=ids.value.substring(0,startPos)+tag+ids.value.substring(endPos,ids.value.length);
  }
  else{
    ids.value+=tag;
  }
  }
}
}
bum('txtarea21');
Fred
Profil
Koukám, že to blbne v mozille, protože tam kus chybí
  else if(ids.selectionStart||ids.selectionStart==0){
    startPos=ids.selectionStart;
    endPos=ids.selectionEnd;
    ids.value=ids.value.substring(0,startPos)+tag+ids.value.substring(endPos,ids.value.length);
    ids.selectionStart=startPos+tag.length;
    ids.selectionEnd=endPos+tag.length;
  }
MATRAUX
Profil
Chamurappi:
Díky moc ;) funguje to perfektně, ID jsem zjišťoval protože mám těch textarea víc pod sebou a nevěděl jsem že to jde takhle :-)

Všem ostatním taky děkuji :-)

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0