Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Не срабатывает elem.style.left при первом использовании элемента
Форумы портала PHP.SU » Клиентская разработка » JavaScript & VBScript » Не срабатывает elem.style.left при первом использовании элемента

Страниц (1): [1]
 

1. Romeo4755 - 16 Апреля, 2016 - 18:08:12 - перейти к сообщению
Здравствуйте. Есть элемент:
CODE (html):
скопировать код в буфер обмена
  1. <button type="button" draggable="true" class="wordbutton" id="textlin11" ondragstart="startdraging(this.id)" ondragend="newposition(this.id)" ondrag="beingdragged (this.id)">текст My big text</button>


При первом ondragstart позиция элемента (elem.style.left или elem.style.top) - пуста, вообще ничего alert не пишет. Если отпустить элемент и снова начать его тащить - все нормально. Если выбирать и таскать другие элементы, а потом вернуться к заданному - тоже все нормально. Но после загрузки страницы, когда в первый раз пытаешься тащить - координаты элемента через elem.style не определяются. Алерт показывает, что сам элемент определяется правильно.
Пробую в разных браузерах.
Что такое?

Вот начало обработчик (стандартный) (поправка, чтобы элемент таскался за то место, за которое его взяли, а не за угол):
CODE (javascript):
скопировать код в буфер обмена
  1. function startdraging (elemId) {
  2.   var elem = document.getElementById(elemId);
  3.   var event = event || window.event;
  4.  
  5. var inncurX = event.clientX;
  6. var inntim = parseInt (elem.style.left);
  7. //alert (elem.style.left);
  8.  
  9. if (!isNaN(inntim)) {popravka_drag_X = inncurX  - inntim;} else {popravka_drag_X = 0;}
  10.  
  11. var inncurY = event.clientY;
  12. var inntim = parseInt (elem.style.top);
  13. if (!isNaN(inntim)) {popravka_drag_Y = inncurY  - inntim;} else {popravka_drag_Y= 0;}
  14. }
2. Pinkya_rabbit - 16 Апреля, 2016 - 21:17:37 - перейти к сообщению
Ну давайте размышлять логически. Свойства к элементу у вас прикрепляются, стало быть функция на него срабатывает. Почему может не срабатывать свойство left изначально. Согласно w3c этим свойством обладают все элементы, которые позиционированы как relative, absolute, или fixed. попробуйте ему в стилях его позиционировать. Например position:relative
3. Romeo4755 - 16 Апреля, 2016 - 23:29:08 - перейти к сообщению
Мда. Логически рассуждать тут у меня не получается. Действительно, свойство left не должно отсутствовать.
В стилях стоит absolute, замена на relative дела не меняет.

Однако!
После того, как панелям назначили места, отличные от указанного в стилях, проблема пропала.
В стиле:
CODE (html):
скопировать код в буфер обмена
  1. .wordpanel {
  2.    position: absolute;
  3.    top: 150px; left: 55px; z-index: 5; }


В JS при начальной расстановке панелей:
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2.   document.getElementById("wordpanel"+i).style.top = correctwordvertposition [i] +"px";
  3.   document.getElementById("wordpanel"+i).style.left = correctwordhorposition [i] +"px";


Теперь сразу все таскается за нужное место.
Причем, если закомментить одну из строчек указанных - соответствующее качество слетит и с первой попытки панелька под курсором будет глючить вертикально или горизонтально при первом перетаскивании.
4. Pinkya_rabbit - 17 Апреля, 2016 - 02:41:31 - перейти к сообщению
Я почитал ещё и вот что начитал. На том же w3c. Я во многом ещё учусь, многого не понимаю. В общем, если не задать при позиционировании элемента значение позиции, как сделал ты, то тогда, для left значение устанавливается initial. initial - это не значение, заданное браузером, а значение по умолчанию для элемента HTML, определённое в спецификации CSS. Оно не зависит ни от браузера, ни от наследования. значение для параметра left пустое. поэтому ты получал пустоту, если не задать параметры. я конечно нуб =) но мне не стыдно за это. это было интересно столько всего поначитал
5. Romeo4755 - 18 Апреля, 2016 - 15:18:29 - перейти к сообщению
Pinkya_rabbit пишет:
Я почитал ещё и вот что начитал. На том же w3c. Я во многом ещё учусь, многого не понимаю. В общем, если не задать при позиционировании элемента значение позиции, как сделал ты, то тогда, для left значение устанавливается initial. initial - это не значение, заданное браузером, а значение по умолчанию для элемента HTML, определённое в спецификации CSS. Оно не зависит ни от браузера, ни от наследования. значение для параметра left пустое. поэтому ты получал пустоту, если не задать параметры. я конечно нуб =) но мне не стыдно за это. это было интересно столько всего поначитал

Спасибо большое за информацию. Подтверждает мои выводы. Позиции были установлены - но в css (для всех панелей - одно место, просто для того, чтобы начальное значение БЫЛО). Такой подлости JS, видимо не ожидал.
Все время попадаю пальцем в эти разрывы между html, js и css - причем не в описанные специфики и различия и не в проблемы, вызванные порядком создания элементов, а именно в непредусмотренные разработчиками случаи. Я берусь за веб редко - для перенесения программ Дельфи онлайн, так что за всем не уследишь.

 

Powered by ExBB FM 1.0 RC1