Alternative to get_element_value method for HtmlDialog

Yes, and the API docs are never wrong … :rolling_eyes:

If the above does not work,… then try something like this:

EDIT: This does not work either, See below.

(Collapsed as this example will also not work.)
module AuthorTest

  @@loaded ||= false

  class NiftyDialog < UI::HtmlDialog

    def initialize(*args)
      super(*args)
      @ready ||= {}
      @returned_values ||= {}
      add_action_callback('returned_value') {|ac,id,value|
        @returned_values[id]= value
      }
      add_action_callback('element_value_ready') {|ac,id|
        @ready[id]= true
      }
    end

    def get_element_value( id )
      @ready[id]= false
      self.execute_script(
        "sketchup.returned_value('#{id}',document.getElementById('#{id}').value,
          { onCompleted: function() {
              sketchup.element_value_ready('#{id}');
            }
          });"
      )
      until @ready[id]
        sleep(0.1)
      end
      @returned_values[id]
    end

  end # custom HtmlDialog subclass
  
  def self::open
    self::reset()
    
    @dlg = NiftyDialog::new(dialog_title: "Test")
    
    @dlg.set_html('
      <!DOCTYPE html>
      <html>
        <head>
        </head>
        <body>
          <div id="DataField">
            Testing 1, 2, 3, ...
          </div>
        </body>
      </html>
    '
    )
    @dlg.show
    sleep(1.0)
  end

  def self::test
    msg = "Getting the 'DataField' element's value ..."
    msg<< "  value is: \"#{@dlg.get_element_value('DataField')}\""
    puts msg
    UI.messagebox(msg,MB_OK)
  end

  def self::reset
    @dlg.close if @dlg && @dlg.visible?
    @dlg = nil
  end

  if !@@loaded
    sm = UI.menu("Plugins").add_submenu("Get Element Value Test")
    sm.add_item('Open Dialog') { self::open }
    sm.add_item('Test') { self::test }
    sm.add_item('Reset') { self::reset }
    @@loaded = true
  end

end

EDIT: For a working example see