 
     # These handlers must be set dynamically based on rqElement.
     @rqElement.find('div.control').find('input, select, textarea').on('change', => @checkAndTell())
-    @rqElement.find("div.control input[type=text]").on('keyup', => @checkAndTell())
-    @rqElement.find("div.control input[type=number]").on('keyup', => @checkAndTell())
-    if @rqType == 'long_text'
-      @ckeditorInstance().on('change', => @checkAndTell())
+    @rqElement.find('div.control input[type=text]').on('keyup', => @checkAndTell())
+    @rqElement.find('div.control input[type=number]').on('keyup', => @checkAndTell())
+    @textarea().on('tbwchange', => @checkAndTell()) if @rqType == 'long_text'
 
     # Set result to initial value on page load. Don't refresh because the manager calls refresh just
     # once on page load (if we 'tell' when each checker initializes, the manager would evaluate many times)

  actual: ->
    switch @rqType
      when 'long_text'
        # Use ckeditor if available, else use textarea value (usually just on startup).
        ckeditor = @ckeditorInstance()
        content = if ckeditor then ckeditor.getData() else @rqElement.find('div.control textarea').val()

        # Strip wrapping <p> tag for comparison.
        content.trim().replace(/(^<p>|<\/p>$)/ig, '')

      when 'integer', 'decimal', 'counter'
        parseFloat(@rqElement.find("div.control input[type=number]").val())

      when 'select_one', 'select_multiple' then @condition.optionNodeId
      else @condition.value

  longTextContent: ->
    # Use wysiwyg editor if available, else use textarea value (usually just on startup).
    if @textarea().trumbowyg
      @textarea().trumbowyg('html')
    else
      @textarea().val()

  textarea: ->
    @rqElement.find('div.control textarea')
