DEV Community

Cover image for How to handle anything
Matt Ellen-Tsivintzeli
Matt Ellen-Tsivintzeli

Posted on

How to handle anything

This is just a small change. Initially I created functionality to allow for click events to be handled, like so:

if(el.getAttribute('onclick'))
{
  let onclick = el.getAttribute('onclick');
  el.setAttribute('onclick', '');
  if(onclick in _internal.originalViewmodel.functions)
  {
    el.addEventListener('click', _internal.originalViewmodel.functions[onclick].bind(_internal));
   }
}
Enter fullscreen mode Exit fullscreen mode

Obviously people will want to handle any element event, so I need to expand handling to allow for that.

My chosen method is a little brittle. I assume an attribute that starts on is and event, and assign accordingly.

for(let attr of el.attributes)
{
  if(attr.name.startsWith('on'))
  {
    let eventName = attr.name.substring(2);
    let eventHandlerName = attr.value;
    if(eventHandlerName in _internal.originalViewmodel.functions)
    {
      el.setAttribute(attr.name, '');
      el.addEventListener(eventName, _internal.originalViewmodel.functions[eventHandlerName].bind(_internal));
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

So now this is possible:

<div id="app">
  <input type="text" onkeyup="annoy">
</div>
Enter fullscreen mode Exit fullscreen mode
import {rjsf} from '../rjsf.js'

(function()
{
  const appElement = document.getElementById('app');

  const app = new rjsf(appElement);

  const viewmodel = 
        {
          functions:
          {
            annoy: function(e)
            {
              e.preventDefault();
              alert('this is annoying isn\'t it?');
            }
          },
        };

  app.init(viewmodel);

})();
Enter fullscreen mode Exit fullscreen mode

Which will alert a message every time there is a keyup event in the input box.

Next time will be a longer article investigating how to make a for element.

Please let me know any thoughts or questions you have in the comments below.

❀, share, and follow for the next instalment!

Top comments (0)