December 17th, 2007

Faking 'onpaste' in Firefox

When trying to find a solution for cleaning Rich Text pasting into a textarea, we needed to find a way to detect pastes and trigger an event based on said action. Internet Explorer and Safari both have an onpaste event that allows you to hook javascript into a paste event, but Firefox does not allow this.

After a little Googling, I didn’t really come across much of a solution so I decided to roll my own.

  function checkForPaste(event) {
    var e = event.element();
    if ((e.previousValue && e.value.length > e.previousValue.length + 1) ||
        (!e.previousValue && e.value.length > 1)) { 
      if (e.onpaste) {
        e.onpaste(e)
      } else if (e.readAttribute("onpaste")) {
        eval(e.readAttribute("onpaste"));
      }
    }
      e.previousValue = e.value;
  }

  function firefoxOnPaste() {
    $$('textarea').each(function(e) { 
      if (e.onpaste || e.readAttribute("onpaste")) {
        Event.observe(e,'input',checkForPaste);
      }
    });
  }

  if (Prototype.Browser.Gecko) {
    document.observe('dom:loaded', firefoxOnPaste);
  }

This snippet of code will automatically detect if an onpaste has been either added to a textarea’s attribute list (e.g. <textarea onpaste='alert("Pasted!")/>) or set programmatically. It will then automatically simulate paste detection using the oninput event and trigger the onpaste code when it believes a paste has been made.

The snippet will detect correctly for all pasting I’ve tried, including selecting a chunk and pasting a replacement. The only major caveat I’ve seen thus far is that the first input change after the page load will register as a paste if the textarea’s value has already been set. In any case, I thought it was a relatively straightforward way to solve the problem.

3 Responses to “Faking 'onpaste' in Firefox”

  1. Phillip Says:
    You script works great with an onpaste event for a textarea… Doesn’t work so well with the onpaste event is in a div, though ex:
    <textarea></textarea>
    ________

    Any thoughts on how to get this to work? I’m trying to use nicEdit WYSIWYG editor, which strips the textarea, so i need the surrounding divs to have the onpaste action.

    many thanks, Phillip

  2. Pramod Says:

    I am getting “Prototype is not defined” error any Idea??

  3. Michael Bleigh Says:

    Pramod – This script depends on the Prototype Javascript library that can be found at http://www.prototypejs.org/

    Sorry if that wasn’t more clear!

Leave a Reply