Показать сообщение отдельно
  #2 (permalink)  
Старый 18.02.2010, 20:09
Интересующийся
Отправить личное сообщение для prike Посмотреть профиль Найти все сообщения от prike
 
Регистрация: 18.06.2009
Сообщений: 11

Далее привожу исходный текст функции vsk_frm_cursor_offset библиотеки vegUI и пояснения почему она не работала у меня.

/*****************************************************************************/
/** Function: vsk_frm_cursor_offset
  * Returns the (pixels) position of the caret in an input style element
  *
  * Parameters:
  *
  *	Node input - input or textarea node
  *
  * Returns:
  *
  * 	Object - containing x and y for the caret position
  *
  * (start code)
  * { x : n, y : n }
  * (end)
  */

function vsk_frm_cursor_offset(input) {
  if (document.selection) { 
    
    var r = document.selection.createRange();
    
    var i;
   
    if(input.nodeName == 'TEXTAREA') {
      var x = r.offsetLeft - r.boundingLeft;
      var y = r.offsetTop - r.boundingTop;
    } else {
      var x = r.offsetLeft;
      var y = r.offsetTop;
    }
   
    return {
      x : x,
      y : y
    };
  
  } else if(typeof input.setSelectionRange != 'undefined') {
    
    var n = document.createElement('div'), i;
    n.style.wrap = 'hard';
    n.style.whiteSpace = 'pre';
    n.style.position = 'absolute';
    n.style.zIndex = -10;
    
    if(input.parentNode.position != 'absolute' && input.parentNode.position!='relative')
      input.parentNode.position = 'relative';
    
    // !!! Здесь временный элемент div вставляется в родительский элемент текcтового поля, если это - ячейка таблицы
    // разметка будет "прыгать" при выполнении этой функции, лучше добавлять к body
    input.parentNode.appendChild(n);
    
    // !!! Копирование стилей не работает в Fire Fox, т.к. 
    // в цикле переменная i представляет из себя не имя стиля а его индекс, т.к. s - массив а не объект, 
    // а конструкция for in применяется к объектам JavaScript
    var s = document.defaultView.getComputedStyle(input,null);

    for(i in s) {
      if(
        i.indexOf('font')>-1 ||
	i.indexOf('padding')>-1
      ) {
        n.style[i] = s[i];
      }
    }

    n.style.width = input.offsetWidth+'px';
    n.style.height = input.offsetHeight+'px';
    n.style.left = input.offsetLeft+'px';
    n.style.top = input.offsetTop+'px';
    n.style.overflow = 'auto';

   
    n.innerHTML = input.value.replace(
      new RegExp("(.{1,"+(input.cols+1)+"})",'g'),"$1\n"
    );
   
    n.scrollLeft = input.scrollLeft;
    n.scrollTop = input.scrollTop;

    var r = document.createRange();
    var e = document.createElement('span');

    r.setStart(n.firstChild, input.selectionStart);
    r.setEnd(n.firstChild, input.selectionStart);
    r.surroundContents(e);

    var obj = { 
      x : e.offsetLeft - n.scrollLeft,
      y : e.offsetTop - n.scrollTop
    };

    n.parentNode.removeChild(n);
    
    return obj; 
  }
}


Кроме проблем указанных в комментариях этот код не учитывает возможности смещение текста для элемента input, если пользователь прокрутил содержимое текстового поля, т.к. scrollLeft для input равен 0 в Fire Fox.

Последний раз редактировалось prike, 18.02.2010 в 20:13.
Ответить с цитированием