Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.12.2010, 21:26
Интересующийся
Отправить личное сообщение для digitalbrain Посмотреть профиль Найти все сообщения от digitalbrain
 
Регистрация: 28.07.2010
Сообщений: 21

clientWidth при инициализации элемента 0
Здравствуйте! Есть класс для создания никого элемента интерфейса пользователя. Элемент создается по нажатию мышки. Размеры задаются через CSS
function Box(Class){
  var obj=this;
  this.Class=(Class)?Class:'Def';
  this.body=document.createElement('div');
  document.body.appendChild(this.body);
  this.body.className=this.Class;
  this.body.setAttribute('data-GUIclass','Seeker');
 
  this.h=this.body.clientHeight;//оно 0
  this.w=this.body.clientWidth;//оно тоже 0
}
var Box=new Box();


ну если чуть позже опросить размеры то все нормально.

что делать? Оо размеры нужны для формировании остальных элементов( Помогите)

Последний раз редактировалось digitalbrain, 04.12.2010 в 21:32.
Ответить с цитированием
  #2 (permalink)  
Старый 04.12.2010, 21:33
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от digitalbrain
Есть класс
В js нет классов!

Сообщение от digitalbrain
что делать?
В чем суть вопроса-то?

Сообщение от digitalbrain
document.body.appendChild(this.body);
не поторопились закрыть?!

Последний раз редактировалось monolithed, 04.12.2010 в 21:37.
Ответить с цитированием
  #3 (permalink)  
Старый 04.12.2010, 21:42
Интересующийся
Отправить личное сообщение для digitalbrain Посмотреть профиль Найти все сообщения от digitalbrain
 
Регистрация: 28.07.2010
Сообщений: 21

Сообщение от monolithed
В js нет классов!
Ну может привычных и нет не С++ же но псевдоклассы таки есть.
Нужно получить размеры div что создается в "конструкторе" ну или просто в теле функции Box. В Css для этого div задано width:100px;height:100px; допустим. Как мне их получить внутри функциии Box? Они там 0 почему то.
Ответить с цитированием
  #4 (permalink)  
Старый 04.12.2010, 21:51
Интересующийся
Отправить личное сообщение для digitalbrain Посмотреть профиль Найти все сообщения от digitalbrain
 
Регистрация: 28.07.2010
Сообщений: 21

Сообщение от monolithed
не поторопились закрыть?!
Извините за непонятливость, но что то я не понял в чем там проблема (? Я конечно эту строку вставил только для того что бы показать что div вставляется в DOM дерево , но на самом деле там просто еще один div-родитель.
Ответить с цитированием
  #5 (permalink)  
Старый 04.12.2010, 22:17
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Найдите два отличия и пойми почему так получается:

<style type="text/css">
.name {
    border: 1px solid;
    float: left;
    margin: 5px;
    text-align: center;
    width: 100px;
    height: 22px;
}
</style>

<script type="text/javascript">
window.onload = function(){
    document.onclick = function(){
       (new function(){
           this.create = function(name){
               var div = document.createElement('div');
               div.className = name ? name : 'def';
               var width = window.getComputedStyle(div, null).width || div.currentStyle.width;
               var height = window.getComputedStyle(div, null).height || div.currentStyle.height;
               div.innerHTML = width + ' / ' + height;
               div.setAttribute('data-GUIclass','Seeker');
               return document.body.appendChild(div);
           };
           return this;
        }).create('name');
    };
};
</script>


<style type="text/css">
.name {
    border: 1px solid;
    float: left;
    margin: 5px;
    text-align: center;
    width: 100px;
    height: 22px;
}
</style>

<script type="text/javascript">
window.onload = function(){
    var object = new function(){
       this.create = function(name){
           var div = document.createElement('div');
           div.className = name ? name : 'def';
           div.setAttribute('data-GUIclass','Seeker');
           return document.body.appendChild(div);
       };
       return this;
    };

    document.onclick = function(){
        object.create('name');
        var div = document.getElementsByTagName('div'), i = div.length;
        while(i--){
            div[i].innerHTML = div[i].clientWidth+'px' + ' / ' + div[i].clientHeight+'px';
        }
    };
};
</script>

Последний раз редактировалось monolithed, 05.12.2010 в 10:04.
Ответить с цитированием
  #6 (permalink)  
Старый 04.12.2010, 22:55
Интересующийся
Отправить личное сообщение для digitalbrain Посмотреть профиль Найти все сообщения от digitalbrain
 
Регистрация: 28.07.2010
Сообщений: 21

Интересное решение) Но почему то в Chrome не пашет -"Cannot read property 'width' of undefined" , но в FF все норм... будем разбираться..Спасибо за Ваши труды! Респект!
Ответить с цитированием
  #7 (permalink)  
Старый 04.12.2010, 23:10
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от digitalbrain
Но почему то в Chrome не пашет
переименуйте свойства, если не поможет, то Chrome в принципе ругается верно, т.к. элемент еще не создан. Поэтому второй вариант предпочтительней.
Ответить с цитированием
  #8 (permalink)  
Старый 05.12.2010, 00:06
Интересующийся
Отправить личное сообщение для digitalbrain Посмотреть профиль Найти все сообщения от digitalbrain
 
Регистрация: 28.07.2010
Сообщений: 21

Вот блин, не в том была собака зарыта у меня. Смотрю же что у Вас свойства clientWidth нормально возвращают размеры в теле , стал рыть что ж не так с моим кодом. Оказалось на момент использования этих свойств div привязан к родителю div другого объекта , но div-родитель вставляется в DOM позже ...выходит цепочка с div не приатачена никуда еще, когда я вызываю clientWidth и возвращает 0. Хотя я не понимаю почему не может браузер дать размеры объекта который не в DOM дереве пока. Единственый выход сразу все атачить к document.body, а потом переатачить куда надо..Спасибо )
Ответить с цитированием
  #9 (permalink)  
Старый 05.12.2010, 09:26
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от digitalbrain
Хотя я не понимаю почему не может браузер дать размеры объекта который не в DOM дереве пока.
А как он будет считать размеры элементов, которых нет в дереве? На размеры же влияют соседние элементы.
Ответить с цитированием
  #10 (permalink)  
Старый 05.12.2010, 13:37
Интересующийся
Отправить личное сообщение для digitalbrain Посмотреть профиль Найти все сообщения от digitalbrain
 
Регистрация: 28.07.2010
Сообщений: 21

ну можно было бы считать размеры на основе CSS правил для него, что применяются для элемента в независимости от родителей элемента div.Class1{}, все ровно бы переменялся к div с классом Class1, где бы не стоял он в DOM, а потом когда бы вставляли в DOM его пересчитать размеры...Короче меня бы в разработчики браузеров ))))
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ссылка на себя при инициализации объекта folibis Общие вопросы Javascript 2 22.11.2010 11:48
Изменение стиля родительского элемента при :hover дочернего lanzs Элементы интерфейса 2 16.10.2010 13:28
Как запустить функцию при отображении элемента в окне браузера? Kostushko Events/DOM/Window 6 27.09.2010 11:03
Проблема при инициализации событий sms9 Events/DOM/Window 2 21.01.2010 22:14
раскрывать/скрывать <td> при выборе определенного элемента списка zip Элементы интерфейса 2 19.01.2009 13:58