Autor Zpráva
Casper
Profil
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ě.
Casper
Profil
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.
Neas
Profil
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

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:

Prosím používejte diakritiku a interpunkci.

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

0