mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-29 06:38:52 +00:00
Next try. IE does not have a simple variable to return the selection position / cursor position inside a textarea, so this can only be done with slow but functional hacks. Not even IE7 fixes this.
git-svn-id: file:///svn/phpbb/trunk@6653 89ea8834-ac86-4346-8a33-228a782c2dd0
This commit is contained in:
parent
8f97dc8d78
commit
eb856283a6
2 changed files with 48 additions and 52 deletions
|
@ -360,37 +360,35 @@ function getCaretPosition(txtarea)
|
||||||
{
|
{
|
||||||
var caretPos = new caretPosition();
|
var caretPos = new caretPosition();
|
||||||
|
|
||||||
// dirty IE way
|
|
||||||
// Idea by tkirby on http://www.csie.ntu.edu.tw/~b88039/html/jslib/caret.html
|
|
||||||
if(document.selection && is_ie)
|
|
||||||
{
|
|
||||||
//insert dummy caracter at current position
|
|
||||||
var dummy = "\001";
|
|
||||||
var sel = document.selection.createRange();
|
|
||||||
var dul = sel.duplicate();
|
|
||||||
var len = 0;
|
|
||||||
dul.moveToElementText(txtarea);
|
|
||||||
sel.text = dummy;
|
|
||||||
|
|
||||||
//find dummy chraracter again
|
|
||||||
len = (dul.text.indexOf(dummy));
|
|
||||||
sel.moveStart('character',-1);
|
|
||||||
sel.text = "";
|
|
||||||
|
|
||||||
if (len == -1)
|
|
||||||
{
|
|
||||||
len = txtarea.value.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
caretPos.start = len;
|
|
||||||
caretPos.end = len;
|
|
||||||
}
|
|
||||||
// simple Gecko/Opera way
|
// simple Gecko/Opera way
|
||||||
else if(txtarea.selectionStart || txtarea.selectionStart == 0)
|
if(txtarea.selectionStart || txtarea.selectionStart == 0)
|
||||||
{
|
{
|
||||||
caretPos.start = txtarea.selectionStart;
|
caretPos.start = txtarea.selectionStart;
|
||||||
caretPos.end = txtarea.selectionEnd;
|
caretPos.end = txtarea.selectionEnd;
|
||||||
}
|
}
|
||||||
|
// dirty and slow IE way
|
||||||
|
else if(document.selection)
|
||||||
|
{
|
||||||
|
// get current selection
|
||||||
|
var range = document.selection.createRange();
|
||||||
|
|
||||||
|
// create a selection of the whole textarea
|
||||||
|
var range_all = document.body.createTextRange();
|
||||||
|
range_all.moveToElementText(txtarea);
|
||||||
|
|
||||||
|
// calculate selection start point by moving beginning of range_all to beginning of range
|
||||||
|
var sel_start;
|
||||||
|
for (sel_start = 0; range_all.compareEndPoints('StartToStart', range) < 0; sel_start++)
|
||||||
|
{
|
||||||
|
range_all.moveStart('character', 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
txtarea.sel_start = sel_start;
|
||||||
|
|
||||||
|
// we ignore the end value for IE, this is already dirty enough and we don't need it
|
||||||
|
caretPos.start = txtarea.sel_start;
|
||||||
|
caretPos.end = txtarea.sel_start;
|
||||||
|
}
|
||||||
|
|
||||||
return caretPos;
|
return caretPos;
|
||||||
}
|
}
|
|
@ -360,37 +360,35 @@ function getCaretPosition(txtarea)
|
||||||
{
|
{
|
||||||
var caretPos = new caretPosition();
|
var caretPos = new caretPosition();
|
||||||
|
|
||||||
// dirty IE way
|
|
||||||
// Idea by tkirby on http://www.csie.ntu.edu.tw/~b88039/html/jslib/caret.html
|
|
||||||
if(document.selection && is_ie)
|
|
||||||
{
|
|
||||||
//insert dummy caracter at current position
|
|
||||||
var dummy = "\001";
|
|
||||||
var sel = document.selection.createRange();
|
|
||||||
var dul = sel.duplicate();
|
|
||||||
var len = 0;
|
|
||||||
dul.moveToElementText(txtarea);
|
|
||||||
sel.text = dummy;
|
|
||||||
|
|
||||||
//find dummy chraracter again
|
|
||||||
len = (dul.text.indexOf(dummy));
|
|
||||||
sel.moveStart('character',-1);
|
|
||||||
sel.text = "";
|
|
||||||
|
|
||||||
if (len == -1)
|
|
||||||
{
|
|
||||||
len = txtarea.value.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
caretPos.start = len;
|
|
||||||
caretPos.end = len;
|
|
||||||
}
|
|
||||||
// simple Gecko/Opera way
|
// simple Gecko/Opera way
|
||||||
else if(txtarea.selectionStart || txtarea.selectionStart == 0)
|
if(txtarea.selectionStart || txtarea.selectionStart == 0)
|
||||||
{
|
{
|
||||||
caretPos.start = txtarea.selectionStart;
|
caretPos.start = txtarea.selectionStart;
|
||||||
caretPos.end = txtarea.selectionEnd;
|
caretPos.end = txtarea.selectionEnd;
|
||||||
}
|
}
|
||||||
|
// dirty and slow IE way
|
||||||
|
else if(document.selection)
|
||||||
|
{
|
||||||
|
// get current selection
|
||||||
|
var range = document.selection.createRange();
|
||||||
|
|
||||||
|
// a new selection of the whole textarea
|
||||||
|
var range_all = document.body.createTextRange();
|
||||||
|
range_all.moveToElementText(txtarea);
|
||||||
|
|
||||||
|
// calculate selection start point by moving beginning of range_all to beginning of range
|
||||||
|
var sel_start;
|
||||||
|
for (sel_start = 0; range_all.compareEndPoints('StartToStart', range) < 0; sel_start++)
|
||||||
|
{
|
||||||
|
range_all.moveStart('character', 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
txtarea.sel_start = sel_start;
|
||||||
|
|
||||||
|
// we ignore the end value for IE, this is already dirty enough and we don't need it
|
||||||
|
caretPos.start = txtarea.sel_start;
|
||||||
|
caretPos.end = txtarea.sel_start;
|
||||||
|
}
|
||||||
|
|
||||||
return caretPos;
|
return caretPos;
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue