Как я могу добавить значение к событию onClick в JavaScript, если имя функции находится в строке?

Я пытаюсь создать небольшой сценарий JavaScript, чтобы удовлетворить некоторые потребности пользователей (сценарий UserLand).

Операция очень проста, и чтобы сделать ее максимально простой, мне нужно добавить некоторые элементы в DOM, с CSS, текстом, функциями и т. Д.

Чтобы скрипт знал, какие элементы создавать, какой CSS применять, какой текст и т. Д. Я создал объект, имеющий следующую форму:

          options: {
      /* Button */
      'button': {
        'tagName'   : 'button',
        'innerHTML' : 'X',
        'css'       : {
          'position'          : 'fixed',
          'z-index'           : '9999999',
          'bottom'            : '20px',
          'left'              : '20px',
          'background-color'  : 'black',
          'cursor'            : 'pointer',
          'color'             : 'white',
          'width'             : '60px',
          'height'            : '60px',
          'border'            : 'none',
          'border-radius'     : '50%',
          'font-weight'       : 'bold',
          'font-size'         : '1.5rem'
        },
        'onClick'   : 'objectName.method()'
      }
    }

Мой скрипт выполняет следующий код в цикле:

          createElement: (element) => {
      
      /* Create element */
      const createElement = document.createElement( element.tagName );
      /* Add innerHTML */
      createElement.innerHTML = element.innerHTML;
      /* Add CSS */
      objectName.addCSStoElement( createElement, element.css );
      /* Add onClick event*/
      createElement.addEventListener( 'click', element.onClick, false );
      /* Add to DOM */
      document.body.appendChild ( createElement );

    }

Все работает правильно, кроме инструкции:

      createElement.addEventListener( 'click', element.onClick, false );

Я думаю, это потому, что это строка, и именно так она добавляется JS к событию onClick.

Предполагая, что я не ошибаюсь, как я могу добавить имя функции, чтобы ее можно было выполнить при нажатии на созданный элемент?

Надеюсь, я хорошо выразился и что мой плохой английский не приведет к путанице.

Спасибо за ваше время и вашу помощь, всем привет!

С уважением, Алекс

3 ответа

Поскольку вы конкретно спрашиваете об использовании строки для создания обработчика событий HTML для строки и знаете, что можете доверять содержимому строки (что в ней нет вредоносного содержимого), вы можете использовать setAttribute:

      createElement.setAttribute("onclick", element.onClick);

Живой пример:

Я воспроизвел ваш пример с необходимыми изменениями, и теперь он работает должным образом. Функция вызывается при нажатии кнопки.

      <html>
    <head><title>Example for string as function call</title></head>
    <body>
        <script type="text/javascript">
            let options = {
            /* Button */
            'button': {
                'tagName'   : 'button',
                'innerHTML' : 'X',
                'css'       : {
                    'position'          : 'fixed',
                    'z-index'           : '9999999',
                    'bottom'            : '20px',
                    'left'              : '20px',
                    'background-color'  : 'black',
                    'cursor'            : 'pointer',
                    'color'             : 'white',
                    'width'             : '60px',
                    'height'            : '60px',
                    'border'            : 'none',
                    'border-radius'     : '50%',
                    'font-weight'       : 'bold',
                    'font-size'         : '1.5rem'
                },
                //check how onClick method is changed
                'onClick'   : '(function(){console.log("hello");objectName.method();})'
            }
            };
            
            function createElement(element) {
                /* Create element */
                const createElement = document.createElement( element.tagName );
                /* Add innerHTML */
                createElement.innerHTML = element.innerHTML;
                /* Add CSS */
                objectName.addCSStoElement( createElement, element.css );
                /* Add onClick event*/
                //check how I am passing eval(element.onClick) instead of just element.onClick
                createElement.addEventListener( 'click',eval(element.onClick), false );
                /* Add to DOM */
                document.body.appendChild ( createElement );
            }

            createElement(options['button']);
        </script>
    </body>
</html>

Как указал TJ Crowder : убедитесь, что objectName является глобальной переменной

Вы можете добавить обработчик щелчка для кнопки, добавив атрибут и передав строку кода для вызова метода, предоставленного в объекте конфигурации.

В приведенном ниже примере объект добавляется в качестве аргумента вызова, чтобы метод мог просматривать event.target а также event.currentTarget для получения дополнительной информации о том, что было нажато.

Пример использования кнопки без всех остальных деталей конфигурации:

Это работает за счет того, что парсер HTML преобразует строку кода в объект функции, который вызывается одним щелчком мыши. event объект в качестве аргумента, как если бы вы поместили onclick атрибут в исходном HTML.

Никогда не делайте этого с ненадежным кодом, но я предполагаю, что данные конфигурации поступают из кода приложения, а не из пользовательского или непроверенного ввода.

Установка атрибута не подходит для добавления нескольких обработчиков событий к одному элементу, но внутри она создает функцию, которая выполняет код (строку), предоставленный в качестве значения атрибута, и вызывает addEventListener для тебя.

Другие вопросы по тегам