Autor | Zpráva | ||
---|---|---|---|
Casper Profil |
#1 · Zasláno: 11. 8. 2010, 23:45:31
Dobrý den, řeším problém s posunem kurzoru při vkládání BBcode do textarea. Používám funkci:
if (document.selection) //IE { field.focus(); // field získáno dříve: field=document.getElementById('idTextarea'); var selected = document.selection.createRange().text; var ins = '[' + tag + ']' + selected + '[/' + tag + ']'; //tag získán dříve, obsahuje například písmeno b var selected2 = document.selection.createRange(); var sel = document.selection.createRange(); selected2.moveStart ('character', -field.value.length); sel.text = '[' + tag + ']' + selected + '[/' + tag + ']'; sel.moveStart('character', selected2.text.length + ins.length - selected.length - (3+tag.length)); } , která vloží požadovaný BBcode (i při označeném textu jej zachová a vloží mezi tagy). Přičemž problémy mi činí až funkce moveStart. Googlování dalších postupů jak dosáhnout posunutí kurzoru na potřebné místo (zde potřebuji vždy mezi vložené tagy, tzn před závorku '[') mi nepřineslo zdárný úspěch. IE hodí kurzor vždy za vložené tagy jakoby moveStart úplně ignoroval. Jak tedy správně postupovat při práci s kurzorem u IE? Zkoušel jsem začlenit i funkce z příspěvku Přidání smailíků do textu, ovšem bezúspěšně. |
||
Časová prodleva: 3 dny
|
|||
Casper Profil |
#2 · Zasláno: 14. 8. 2010, 13:53:53
Takže nakonec jsem tento problém vyřešil, sice dosti prasácky, protože v javascriptu jsem začátečník, ale funguje to :) Kdyby to někomu pomohlo, skloubil jsem dvě nalezené funkce pro pozice, jednu sám vytvořil a pak už je to jen hraní s proměnnými.
První funkce, zjištění pozice v textu: function getCaret(el) { if (el.selectionStart) { return el.selectionStart; } else if (document.selection) { el.focus(); var r = document.selection.createRange(); if (r == null) { return 0; } var re = el.createTextRange(), rc = re.duplicate(); re.moveToBookmark(r.getBookmark()); rc.setEndPoint('EndToStart', re); return rc.text.length; } return 0; } ta ovšem nebyla přesná pokud nebyl nějaký text vybrán a vkládal jsem nějaký ten BBcode, pomůže jednoduchá podmínka: var pozice = getCaret(field); if(selected.length == 0){ var oldpozice = pozice - ins.length; }else{ var oldpozice = pozice; } Tímto dostaneme do proměnné oldpozice původní pozici kurzoru, při výběru tedy jeho začátek. No a poslední funkce sloužící k umístění kurzoru na požadované místo: function setCaretPosition(ctrl, pos){ if(ctrl.setSelectionRange) { ctrl.focus(); ctrl.setSelectionRange(pos,pos); } else if (ctrl.createTextRange) { var range = ctrl.createTextRange(); range.collapse(true); range.moveEnd('character', pos); range.moveStart('character', pos); range.select(); } } Těmito funkcemi lze snadno operovat s pozicí kurzoru v textu dokud se tam neobjeví entery, nevím přesně z jakého důvodu (třeba někdo objasní v dalších příspěvcích?), ale entery v textu vždy zajistily posun kurzoru dál než bylo zamýšleno. Vytvořil jsem tedy funkci pro zjištění počtu enterů k dané pozici. function numEntersToPos(pozice, field){ var stringUp2pos = field.value.substr(0,pozice); var seznamEnteru = stringUp2pos.split('\n'); var pocetEnteru = (seznamEnteru.length-1); return pocetEnteru; } Je mi jasné, že to pravděpodobně lze řešit i jiným způsobem, určitě snazším (možná pomocí ierange), ale nikdo zde nevložil jedinou odpověď na můj dotaz, tak předkládám mé řešení, třeby by někomu mohlo pomoci i když je prasácké. PS. proměnné ins, selected a field získány stejně jako píši o příspěvek výše. |
||
Časová prodleva: 2 měsíce
|
|||
Neas Profil |
#3 · Zasláno: 9. 10. 2010, 22:41:27
Vím, že se jedná o starší příspěvek, takže se omlouvám, že reaguji až teď, ale našel jsem tady na fóru lepší script na vkládání bbcodu:
http://diskuse.jakpsatweb.cz/?action=vthread&forum=8&topic=108768 |
||
Časová prodleva: 14 let
|
0