Функция щелкает только при наличии статических значений, но не будет щелкать, когда идентичные значения поступают из функции

#javascript #html #reactjs #machine-learning #tensorflow.js

Вопрос:

Я использую TensorflowJs и реагирую на интерфейсы на основе жестов. Я сопоставил курсор изображения с моим мобильным телефоном, и когда я перемещаю свой мобильный телефон по каналу камеры, он соответствующим образом перемещает элемент изображения.

Модель обнаружения объектов выполняется в компоненте react следующим образом:

 const runCoco = async () => {
    const net = await cocossd.load();
    console.log("COCOSSD model loaded.");
    //  Loop and detect hands
    setInterval(() => {
      detect(net);
    }, 10);
  };

  useEffect(runCoco,[]);
 
   //public variables
  const webcamRef = useRef(null);
  const canvasRef = useRef(null);
  const xScalar = 2.5;
  const yScalar = 1.7;
  const yShift = 389.203119516;
 

Я перемещаю элемент курсора на большую кнопку в своей программе, и когда я хочу нажать на элемент, я помещаю пластиковую бутылку в рамку (это был просто быстрый способ пройти тестирование). Когда бутылка обнаружена,я вызываю document.elementFromPoint(x, y) и в это время отправляю событие щелчка на элемент под курсором.

  const detect = async (net) => {
    // Check data is available
    if (
      typeof webcamRef.current !== "undefined" amp;amp;
      webcamRef.current !== null amp;amp;
      webcamRef.current.video.readyState === 4
    ) {
      // Get Video Properties
      const cursor = document.getElementById('cursor');  
      const video = webcamRef.current.video;
      const videoWidth = webcamRef.current.video.videoWidth;
      const videoHeight = webcamRef.current.video.videoHeight;

      // Set video width
      webcamRef.current.video.width = videoWidth;
      webcamRef.current.video.height = videoHeight;

      // Make Detections
      const obj = await net.detect(video);
      //console.log(obj);
        
      try
      {
        //all this manipulation below was just a good way I found to convert the bounding box outputs 
        //into comfortable larger x and y coordinates for the user to navigate with.
        x = (-1 * (((obj[0]['bbox'][0]   obj[0]['bbox'][2] ) / 2)))   640;
        y = obj[0]['bbox'][1] - 200; ///200px higher than the top of the bounding box
        
        x = x * xScalar;
        y = (y * yScalar);
      
        if (obj[0]['class'] === "cell phone" amp;amp; obj[0]['score'] > 0.8 )
        {
          prevX = x;
          prevY = y;
          cursor.style.transform = `translate(${ x }px, ${ y }px)`;
        }
        else if ( obj[0]['class'] === "bottle" )
        {
          
          console.log("");

          x = document.querySelector('#cursor').getBoundingClientRect().left;
          y = document.querySelector('#cursor').getBoundingClientRect().top;
          
          console.log( " Model Values: "   prevX   ", "   (prevY   yShift));
          console.log( " Cursor Values: "   x   " "   y );

          var ev = new MouseEvent('click', {
              'view': window,
              'bubbles': true,
              'cancelable': true,
              'screenX': x,
              'screenY': y
          });

          // x = 305.45550537109375;
          // y = 271.7203674316406;

          console.log( " Just before click: "   x   " "   y );
          var el = document.elementFromPoint( Math.trunc(x), Math.trunc(y) );
          console.log(" After click: "   x   " "   y)

          el.dispatchEvent(ev);
        }

      }
      catch (err)
      {
        console.error(err);
      }
    }
      
  }
 

Вот тут-то и возникает проблема:
Когда я передаю здесь буквальные значения, это работает. кнопка нажата, и все хорошо.

 x = 305.45550537109375;
y = 271.7203674316406;
 
 var el = document.elementFromPoint( Math.trunc(x), Math.trunc(y) ); 
    el.dispatchEvent(ev);
 

Но если я буду кормить его таким образом:

 x = document.querySelector('#cursor').getBoundingClientRect().left;
y = document.querySelector('#cursor').getBoundingClientRect().top;
 

Щелчок не зарегистрирован, отправленное событие ничего не делает.

Вот изображение некоторых выходов консоли, с помощью которых я пытался отладить ее: введите описание изображения здесь

Значения почти не отличаются, поэтому я действительно не могу понять, почему это не работает.

Это изображение кнопки и курсора в программе, если это помогает

Комментарии:

1. Почему вы входите в консоль «После щелчка», если вы еще не запустили событие?

2. Ты прав, это просто случайность, я сейчас же попробую. Спасибо. ПРАВКА: это не изменило результаты, но спасибо за место

3. Может ли быть так, что вы нажимаете на сам курсор? Можете ли вы добавить el в журналы?

4. @Надячибрикова i.imgur.com/y9DCJww.png Спасибо, на самом деле это был щелчок по курсору). Я оформил его с помощью «события указателя: нет», и теперь все работает.

5. Классно! Тайна разгадана 🙂