| 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: 15 let
|
|||
0