Как правильно привязать обработчик, если элемент не был найден на странице?

Я использую такую конструкцию:

const $ = document.querySelector.bind(document);

Как правильно привязать обработчик, если элемент не был найден на странице?

$('#my_id').onclick = function() {

};

Чтобы не возникало ошибки:

Uncaught TypeError: Cannot set properties of null (setting 'onclick')


Ответы (3 шт):

Автор решения: OPTIMUS PRIME

Если querySelector возвращает null, вместо него можно подсунуть новый созданный элемент, на который будет добавлен обработчик.

function $(selector) {
  return document.querySelector(selector) || document.createElement('div');
}


$('#test-1').addEventListener('click', () => console.log(0));
$('#test-2').addEventListener('click', () => console.log(0));
<button id="test-1"> Click </button>

Но таким «молчаливым» подходом рискуете пропустить ошибку, если вдруг элемент должен был быть на странице, но его нет. Т.е. можно делать две функции, одну назвать $, пусть дает ошибку если элемента нет, вторую как-то по другому, чтобы использовать только там, где ожидается отсутствие элемента.

→ Ссылка
Автор решения: yar85

window.$ = el => new Proxy({
  el: (el instanceof HTMLElement) ? el : document.querySelector(el), 
}, { 
   get(target, prop) {
     return target.el?.[prop]; 
   }, 
   set(target, prop, value) {
    if (target.el instanceof HTMLElement)           // присваивание по условию
      target.el[prop] = value; 
    return true; 
  }, 
});

$('#not-exist').onclick = () => console.log('?');  // ошибки нет
$('#my-id').onclick = () => console.log('?'); 
<button id="my-id">?</button>

→ Ссылка
Автор решения: Alexandr

Можно реализовать с помощью оператора опциональной последовательности

document.querySelector('#my_id')?.addEventListener('click' , ()=>{
   [код обработки]
})
→ Ссылка