Gecko: textarea.onscroll

18th August 2005 - 00:08

Относительно близкое к IE поведение:

window.onload = function() {
  var TAs = document.getElementsByTagName('textarea');
  for (var i=TAs.length; 0<i--;) {
    TAs[i].fired = 0;
    if (TAs[i].onscroll && TAs[i].addEventListener)
      TAs[i].addEventListener('DOMAttrModified', checkScroll, false);
  }
}

function checkScroll(e) {
  if (e.attrName != 'curpos' && e.attrName != 'maxpos')
    return;

  var TA = e.target;
  if (TA._scrollTop != TA.scrollTop || TA._scrollLeft != TA.scrollLeft) {
    TA._scrollTop = TA.scrollTop;
    TA._scrollLeft = TA.scrollLeft;
    TA.onscroll();
  }
}

//~ <textarea onscroll='fireMe(this)'...
function fireMe(TA) {
  TA.fired++;
  //~ <p id="justDebug"...
  document.getElementById('justDebug').innerHTML = 'fired = ' + TA.fired +
    ' :: scrollTop = ' + TA._scrollTop +
    ' :: scrollLeft = ' + TA._scrollLeft;
}

А вот переварить это в XBL сразу не получилось:

CSS:
textarea {-moz-binding:url('tascroll.xml#checkScroll')}

tascroll.xml:
<?xml version="1.0"?>
<bindings xmlns="http://www.mozilla.org/xbl">
  <binding id="checkScroll">
    <handlers>
      <handler event="DOMAttrModified"><![CDATA[ 
        if (!this.onscroll || (event.attrName != 'curpos' &&
            event.attrName != 'maxpos')) return;

        if (this._scrollTop != this.scrollTop || this._scrollLeft != this.scrollLeft) {
	  this._scrollTop = this.scrollTop;
	  this._scrollLeft = this.scrollLeft;
	  this.onscroll();
        }
      ]]></handler>
    </handlers>
  </binding>
</bindings>

Работает этот XBL криво: при навигации в textarea стрелками клавы скролится сама textarea и то только по вертикали, а вот курсор в тексте остаётся на месте. Ы?

Categories: dHtml | comments: (0)

Комментарии временно отключены.