Правильный способ обращаться со слушателями в Jint - PullRequest
0 голосов
/ 08 января 2020

Используя следующие JavaScript коды с веб-сайта Mozilla:

const Something = function(element) {
  // |this| is a newly created object
  this.name = 'Something Good';
  this.handleEvent = function(event) {
    console.log(this.name); // 'Something Good', as this is bound to newly created object
    switch(event.type) {
      case 'click':
        // some code here...
        break;
      case 'dblclick':
        // some code here...
        break;
    }
  };

  // Note that the listeners in this case are |this|, not this.handleEvent
  element.addEventListener('click', this, false);
  element.addEventListener('dblclick', this, false);

  // You can properly remove the listeners
  element.removeEventListener('click', this, false);
  element.removeEventListener('dblclick', this, false);
}

const s = new Something(window);

Для этого я создал следующий window объект в C# для обработки AddEventListener/removeEventListener.

namespace JintTestsForms {
    public sealed class JsWindow {
        private Engine _engine;
        public JsWindow(Engine engine) {
            _engine = engine;
        }
        public void addEventListener(string type, object listener) {
        }
        public void addEventListener(string type, object listener, bool useCapture) {
        }
        public void addEventListener(string type, object listener, object options) {
        }
        public void removeEventListener(string type, object listener, bool useCapture)
        {
        }
    }
}

Для большинства JavaScript кодов прослушивателей событий Jint правильно устанавливает listener для функции (Func<,,,>), но для вышеуказанного Jint задает для параметра listener тип ExpandoObject. Как вы отправляете события в этом случае?

...