Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для Inskipp
0 / 1 / 1
Регистрация: 27.02.2024
Сообщений: 114

Наблюдение: getBoundingClientRect иногда возвращает в свойствах нецелый long

02.02.2025, 15:26. Показов 2889. Ответов 42

Студворк — интернет-сервис помощи студентам
Приходится:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
const GetRect = function(ElementId){
 let Element = document.getElementById(ElementId);
 let rect = Element.getBoundingClientRect();
 return {
  Top: Math.round(rect.left), //xPosition
  Left: Math.round(rect.top), //yPosition
  Right: Math.round(rect.right),
  Width: Math.round(rect.width),
  Height: Math.round(rect.height)
 };
};
Обстоятельства:
Больше года не трогал модуль кода, который занимался взаимной привязкой хинтов к кнопкам. Все и так работало. А тут, внезапно, перестало (firefox стал более новый 133.03 (64 bit)).
Монитор: acer lcd monitor s 1191 HQL

Исследовал, и обнаружил, что getBoundingClientRect() начал в своих свойствах возвращать дробные числа width, height. Да и top, left и right, иногда. И, похоже, типа long.
И тут до меня дошло: поменялся монитор. У него очень нестандартное разрешение: 1366х768.
Пришлось кое где вставить в код что-то подобное Math.round(rect.width)

Добавлено через 15 минут
Хочется услышать мнение монстров!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.02.2025, 15:26
Ответы с готовыми решениями:

Почему программа иногда возвращает не нулевой результат, а иногда нуль?
С чем подобное может быть связана?

Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в степень p
Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в степень p и возвращает ap. Помогите...

В типе float иногда возвращает -0
Иногда на экран выводится -0,000, если точность 3 стоит. Тип float. о чем это может свидетельствовать? Неужто оо очень малом числе? ...

42
 Аватар для voraa
1254 / 1170 / 179
Регистрация: 21.01.2024
Сообщений: 5,442
02.02.2025, 21:18
Студворк — интернет-сервис помощи студентам
Hint где находится? Кто его родительский элемент? Какие стили у этого родителя?
0
 Аватар для Inskipp
0 / 1 / 1
Регистрация: 27.02.2024
Сообщений: 114
02.02.2025, 21:27  [ТС]
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<div class="find-hints-anchor noprint">
 <div class="menu-wrapper">
 <div id="find_hint" class="find-hint callout-balloon">
  ⇪ Кликните, чтобы найти текст на странице
 </div>
 <div id="text_to_find_hint" class="find-hint callout-balloon">
  ⇪ Введите текст, который Вы хотите найти. Допустимы русские буквы (регистр не важен), пробелы и знаки препинания. Недопустимые символы не будут введены.
 </div>
 <div id="clear_find_hint" class="find-hint callout-balloon">
  ⇪ Очистить искомый текст
 </div>
 <div id="find_down_hint" class="find-hint callout-balloon">
  ⇪ Найти текст ниже
 </div>
 <div id="find_up_hint" class="find-hint callout-balloon">
  ⇪ Найти текст выше
 </div>
 <div id="text_selection_hint" class="find-hint callout-balloon">
  ⇪ Что сейчас выделено на странице. Копируется в поле поиска, но недопустимые символы фильтруются. Потом можно будет поискать дргие места с таким текстом.
 </div>
 <div id="to_found_hint" class="find-hint callout-balloon">
  ⇪ Переместиться к выделенному
 </div>
 </div>
</div>
Вот эти два хинта не показываются: "text_to_find_hint" и "text_selection_hint"

Добавлено через 7 минут
voraa, Что-то с местным интерфесом. Могу я маленький zip с тестовым примером кинуть как-то? Почтой, чтоли...
0
 Аватар для voraa
1254 / 1170 / 179
Регистрация: 21.01.2024
Сообщений: 5,442
02.02.2025, 21:31
В devtoolse можно посмотреть, куда именно уезжает ваш hint.
Когда вы делаете getBoundingClientRect, он дает координаты left и top относительно левого верхнего угла окна,не относительно документа или родителя. (Если сделать роллинг страницы, то координаты, left и top будут уже другие т.к. элемент сдвинется относительно окна.
А когда вы указываете style.left и style.top вы указываете координаты относительно левого верхнего угла его родителя (если hint имеет position absolute или смещение от того места, где он должен бы был находиться, если position relative

Добавлено через 59 секунд
Цитата Сообщение от Inskipp Посмотреть сообщение
Могу я маленький zip с тестовым примером кинуть как-то? Почтой, чтоли...
Маленький zip (до 25Мб) можно и тут кинуть.
0
 Аватар для Inskipp
0 / 1 / 1
Регистрация: 27.02.2024
Сообщений: 114
02.02.2025, 21:32  [ТС]
Вот rar
Вложения
Тип файла: rar notepad.rar (691.4 Кб, 3 просмотров)
0
 Аватар для voraa
1254 / 1170 / 179
Регистрация: 21.01.2024
Сообщений: 5,442
02.02.2025, 21:34
И чего там запускать и смотреть?
0
 Аватар для Inskipp
0 / 1 / 1
Регистрация: 27.02.2024
Сообщений: 114
02.02.2025, 21:40  [ТС]
Это, в общем-то, тестовый фрагмент. Запускать "TestNotepad 11.html"
0
 Аватар для voraa
1254 / 1170 / 179
Регистрация: 21.01.2024
Сообщений: 5,442
02.02.2025, 21:49
Ну а чего смотреть то? Когда и где эти хинты должны появляться? Какая функция из какого файла их должна показывать?
Я как бы свой магический кристалл в полировку сдал. А без него - никак.
0
 Аватар для Inskipp
0 / 1 / 1
Регистрация: 27.02.2024
Сообщений: 114
02.02.2025, 22:00  [ТС]
В принципе, он был полностью рабочим, пока не начались проблемы с хинтами...

Добавлено через 1 минуту
И не надо критиковать найденный там алгоритм контекстного поиска - он еще сырой...

Добавлено через 3 минуты
voraa,
Ну а чего смотреть то?
Мышой сверху по меню поводи, увидишь: не везде хинты появляются...
0
 Аватар для voraa
1254 / 1170 / 179
Регистрация: 21.01.2024
Сообщений: 5,442
02.02.2025, 23:29
Очень загадочная функция EventIsInside. Как я понял, она возвращает true, когда мышь приходит с какого то элемента внутри кнопки. Там span с картинкой. Вот когда с него снова на кнопку мышь приходит, тогда и true. Тогда и хинт появляется. Но у input нет внутреннего элемента. Эта функция возвращает false, когда мышь извне приходит на input, а больше событие mouseover и не возникает.
Переусложненный алгоритм.
Проще использовать события mouseenter и mouseleave. Мышь пришла - мышь ушла. и все. А откуда пришла, куда ушла - не важно.

Кстати, большой недостаток. Положения хинтов вычисляются один раз в самом начале. Если в процессе просмотра изменяется размер окна браузера - они съезжают. Вычислять надо каждый раз перед показом.

Добавлено через 53 минуты
Цитата Сообщение от Inskipp Посмотреть сообщение
И не надо критиковать найденный там алгоритм контекстного поиска - он еще сырой...
Вспомнил, что у нас на работе один коллега когда то брал поиск отсюда
https://www.seabreezecomputers.com/tips/find.htm
Ну разумеется его стилизовали под себя и лишнее выкидывали
1
 Аватар для Inskipp
0 / 1 / 1
Регистрация: 27.02.2024
Сообщений: 114
03.02.2025, 08:24  [ТС]
voraa,
Проще использовать события mouseenter и mouseleave
Я про них и не знал вовсе... Спасибо.

Добавлено через 2 минуты
voraa,
Вспомнил, что у нас на работе один коллега когда то брал поиск отсюда
Спасибо, посмотрю.

Добавлено через 3 минуты
В общем, проблема пока не решена. Никто и не предположил, как решить.
Явно, что-то с шириной div. Но она вполне нормальная 333px. Что за...

Добавлено через 6 минут
voraa,
Положения хинтов вычисляются один раз в самом начале. Если в процессе просмотра изменяется размер окна браузера - они съезжают. Вычислять надо каждый раз перед показом.
Это будет перебор. Они вычисляются от левого верхнего угла viewport. Этого достаточно. Тем более, я вовсе не ориентируюсь на смартфоны или коммерческое применение.
Моя задача проста: дома, для своих, выбрать нужную информацию и отправить на печать. ВСЁ!

Добавлено через 9 минут
voraa,
Очень загадочная функция EventIsInside. Как я понял, она возвращает true, когда мышь приходит с какого то элемента внутри кнопки. Там span с картинкой. Вот когда с него снова на кнопку мышь приходит, тогда и true.
Неа. Она проверяет, что событие произошло внутри кнопки. Т.е. мышь (указатель) не уехала за ее пределы.
Т.е. страхуюсь от событий внутри кнопки.
Ну, картинка внутри тоже может сгенерировать ''mouseover'...
0
 Аватар для voraa
1254 / 1170 / 179
Регистрация: 21.01.2024
Сообщений: 5,442
03.02.2025, 08:35
Лучший ответ Сообщение было отмечено Inskipp как решение

Решение

Цитата Сообщение от Inskipp Посмотреть сообщение
В общем, проблема пока не решена. Никто и не предположил, как решить.
Явно, что-то с шириной div. Но она вполне нормальная 333px. Что за...
Что вы к этой ширине прицепились
Вот ваша функция, которая показывает хинт

JavaScript
1
2
3
4
5
6
7
const MouseOverFindHandler = function(event, HintBlock, ButtonElement){
 if (!EventIsInside(event.relatedTarget, ButtonElement)){
  HideHintsForFind();
 } else {
  HintBlock.style.visibility = 'visible';
 };
};
EventIsInside никогда не вернет true (что бы хинт появился), когда мышь наводится на <input>.
Когда наводится на button true возвращается, когда мышь переходит на кнопку с внутреннего span. А у input нет никакого внутреннего элемента. Вы же сами этот код придумали, неужели не понятно, как это работает?

Добавлено через 2 минуты
Цитата Сообщение от Inskipp Посмотреть сообщение
Она проверяет, что событие произошло внутри кнопки.
Событие внутри может происходить только если внутри есть какой то внутренний элемент и мышь с него снова попадает на заданный. Если просто водить мышью по элементу без внутренних, то будут события mousemove, а не mouseover.
1
 Аватар для Inskipp
0 / 1 / 1
Регистрация: 27.02.2024
Сообщений: 114
03.02.2025, 08:39  [ТС]
voraa,
Когда наводится на button true возвращается, когда мышь переходит на кнопку с внутреннего span. А у input нет никакого внутреннего элемента. Вы же сами этот код придумали, неужели не понятно, как это работает?
Туплю.
0
 Аватар для voraa
1254 / 1170 / 179
Регистрация: 21.01.2024
Сообщений: 5,442
03.02.2025, 08:40
Лучший ответ Сообщение было отмечено Inskipp как решение

Решение

Цитата Сообщение от Inskipp Посмотреть сообщение
Ну, картинка внутри тоже может сгенерировать ''mouseover'...
Какая картинка внутри input?
1
 Аватар для Inskipp
0 / 1 / 1
Регистрация: 27.02.2024
Сообщений: 114
03.02.2025, 08:53  [ТС]
voraa,
Событие внутри может происходить только если внутри есть какой то внутренний элемент и мышь с него снова попадает на заданный. Если просто водить мышью по элементу без внутренних, то будут события mousemove, а не mouseover.
Да. Это трудная мысль. Но я ее признал.
0
 Аватар для voraa
1254 / 1170 / 179
Регистрация: 21.01.2024
Сообщений: 5,442
03.02.2025, 08:58
Цитата Сообщение от Inskipp Посмотреть сообщение
Это будет перебор. Они вычисляются от левого верхнего угла viewport. Этого достаточно. Тем более, я вовсе не ориентируюсь на смартфоны или коммерческое применение.
Моя задача проста: дома, для своих, выбрать нужную информацию и отправить на печать. ВСЁ!
А стоит ли тогда напрягаться со всякими хинтами и поисками? Зачем они на печати?
Вот, что получается, если менять размер окна браузера

Ну, если и так сойдет, то другое дело.
Миниатюры
Наблюдение: getBoundingClientRect иногда возвращает в свойствах нецелый long  
1
 Аватар для Inskipp
0 / 1 / 1
Регистрация: 27.02.2024
Сообщений: 114
03.02.2025, 10:26  [ТС]
Как все было просто в ассемблере... Есть событие - реагируй. Нет события - пропускай.

Добавлено через 4 минуты
voraa,
А стоит ли тогда напрягаться
Скучно. Суставы болят. Все плохо. Не телевизор же смотреть?
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3827 / 1664 / 429
Регистрация: 14.03.2022
Сообщений: 4,181
03.02.2025, 10:26
Цитата Сообщение от Inskipp Посмотреть сообщение
Есть событие - реагируй. Нет события - пропускай.
Так работает любой ЯП, JS не исключение.
1
 Аватар для voraa
1254 / 1170 / 179
Регистрация: 21.01.2024
Сообщений: 5,442
03.02.2025, 10:37
Цитата Сообщение от Inskipp Посмотреть сообщение
Есть событие - реагируй. Нет события - пропускай.
Так события то разные.
Цитата Сообщение от Inskipp Посмотреть сообщение
Скучно. Суставы болят. Все плохо. Не телевизор же смотреть?
Из нетленного
Если мне неймется и не спится,
Или с похмелья нет на мне лица,
Открою Кодекс на любой странице,
И, не могу, читаю до конца.

(с) В.С. Высоцкий
У меня так с MDN было.
И вам советую.
Тогда бы знали и про mouseenter c mouseleave
И про метод contains, что бы определять является ли один узел потомком другого, а не паренты перебирать.
1
 Аватар для Inskipp
0 / 1 / 1
Регистрация: 27.02.2024
Сообщений: 114
03.02.2025, 11:13  [ТС]
voraa,
Вспомнил, что у нас на работе один коллега когда то брал поиск отсюда
Мне, пока, мой алгоритм нравится. Но, сравню.

Добавлено через 5 минут
voraa,
И про метод contains, что бы определять является ли один узел потомком другого, а не паренты перебирать.
Не совсем понял. Точнее, совсем не понял. Это как?
0
 Аватар для voraa
1254 / 1170 / 179
Регистрация: 21.01.2024
Сообщений: 5,442
03.02.2025, 11:15
Цитата Сообщение от Inskipp Посмотреть сообщение
Не совсем понял. Точнее, совсем не понял. Это как?
https://developer.mozilla.org/... e/contains

JavaScript
1
n1.contains(n2); // === true если  n1===n2 или n2 потомок n1 (содержится в n1)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.02.2025, 11:15
Помогаю со студенческими работами здесь

Функция иногда возвращает ложные данные
Имеется web сервис для проверки статуса заказа, при тестировании всплыл баг, иногда функция запроса из базы выдает неверные данные. ...

Иногда функция возвращает значение NaN
Доброго времени суток. У меня следующая проблема. Не всегда, но в 70% случаев функция возвращает значение NaN. Никак не могу найти...

Now().DateString() иногда возвращает пустую строку
Добрый день! В программе предусмотен вывод информации о дате и времени Информацию получаю так TDateTime NowTime = Now(); ...

Функция типа long double возвращает странные значения
Не могу получить правильный результат long double при вызове функции. Возвращаются странные значения. Где засада не пойму? #include...

LAST_INSERT_ID() иногда возвращает ноль. Это не хорошо
Создается запись в БД. Сразу после этого пытаемся получить её ID: $SQL = ' SELECT LAST_INSERT_ID() AS last_id '; $st =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru