LINUX.ORG.RU

История изменений

Исправление ii343hbka, (текущая версия) :

<html>
<head>
<script>
function magic(object) {
  var textComponent = object;
  var textArray = textComponent.value.split("\n");
  var selectedText, selStartPos, selEndPos;
  if (textComponent.selectionStart != undefined) {
    var selStartPos = textComponent.selectionStart;
    var selEndPos = textComponent.selectionEnd;
  }
  if( (selStartPos + selEndPos) == 0 ) return;
  // start && end
  var modStartPos = 0;
  var modEndPos = 0;
  for( var i = 0, tl = 0; i < textArray.length; i++ ) {
    tl += textArray[i].length;
    if( (tl) <= selStartPos ) { modEndPos = modStartPos = i; }
    if( (tl) >= selEndPos ) { modEndPos = i; break; }
  }
  alert("start && end = "+modStartPos+" && "+modEndPos+"");
}
</script>
</head>
<body>
<textarea id="ta" name="ta" onMouseUp="magic(this)">
lognglognglognglognglognglognglognglognglogng
lognglognglognglognglognglogng
shortshortshort
a  a  
a
</textarea>
</body>
</html>

есть косяк - не ловит стык строк, т.е. если выбираешь от начала первой до конца второй, он считает как от 0 до 3
если доделать условия, то заработает
может правильнее будет не в одном цикле считать, а в двух

Исправление ii343hbka, :

<html>
<head>
<script>
function magic(object) {
  var textComponent = object;
  var textArray = textComponent.value.split("\n");
  var selectedText, selStartPos, selEndPos;
  if (textComponent.selectionStart != undefined) {
    var selStartPos = textComponent.selectionStart;
    var selEndPos = textComponent.selectionEnd;
  }
  if( (selStartPos + selEndPos) == 0 ) return;
  // start && end
  var modStartPos = 0;
  var modEndPos = 0;
  for( var i = 0, tl = 0; i < textArray.length; i++ ) {
    tl += textArray[i].length;
    if( (tl) <= selStartPos ) { modEndPos = modStartPos = i; }
    if( (tl) >= selEndPos ) { modEndPos = i; break; }
  }
  alert("start && end = "+modStartPos+" && "+modEndPos+"");
}
</script>
</head>
<body>
<textarea id="ta" name="ta" onMouseUp="magic(this)">
lognglognglognglognglognglognglognglognglogng
lognglognglognglognglognglogng
shortshortshort
a  a  
a
</textarea>
</body>
</html>

есть косяк - не ловит стык строк, т.е. если выбираешь от начала первой до конца второй, он считает как от 0 до 3
если доделать условия, то заработает

Исходная версия ii343hbka, :

<html>
<head>
<script>
function magic(object) {
  var textComponent = object;
  var textArray = textComponent.value.split("\n");
  var selectedText, selStartPos, selEndPos;
  if (textComponent.selectionStart != undefined) {
    var selStartPos = textComponent.selectionStart;
    var selEndPos = textComponent.selectionEnd;
  }
  if( (selStartPos + selEndPos) == 0 ) return;
  // start && end
  var modStartPos = 0;
  var modEndPos = 0;
  for( var i = 0, tl = 0; i < textArray.length; i++ ) {
    tl += textArray[i].length;
    if( (tl) <= selStartPos ) { modEndPos = modStartPos = i; }
    if( (tl) >= selEndPos ) { modEndPos = i; break; }
  }
  alert("start && end = "+modStartPos+" && "+modEndPos+"");
}
</script>
</head>
<body>
<textarea id="ta" name="ta" onMouseUp="magic(this)">
lognglognglognglognglognglognglognglognglogng
lognglognglognglognglognglogng
shortshortshort
a  a  
a
</textarea>
</body>
</html>

есть косяк - не ловит стык строк, т.е. если выбираешь от начала первой до конца второй, он считает как от 0 до 3