JQuery width() не возвращает правильное значение в div с сгенерированным контентом

В приведенном ниже коде предупреждение не возвращает фактический размер #main, он всегда возвращает значение #main css width с% drop. Так что в этом случае я получаю 95 в оповещении. Если я предупреждаю parent(). Width(), я получаю 100.

Данные, возвращаемые из вызова .get(), представляют собой ul, иногда более широкие, чем #main, а иногда и нет. Ширина содержимого, по-видимому, не влияет на то, что возвращает .width().

Итак, мой вопрос: как получить истинную ширину пикселя #main?

CSS

#container {
    width: 100%;
}

#main {
    width: 95%;
    overflow: hidden; 
}

HTML:

<div id="conatiner">
    <div id="main"></div>
</div>

Javascript/JQuery:

$.get('page.php', function(result) {
    $('#main').html(result);
});
alert($('#main').width();

Ответ 1

Я столкнулся с этой проблемой при попытке реализовать jquery.autogrow-textarea в текстовых областях, используемых для встроенного редактирования. Текстовые поля содержались в div, которые еще не отображались (css display: none;). При отладке кода javascript .autogrow() я обнаружил, что jQuery .width() возвращал процентное значение с удаленным символом "%" в отличие от рассчитанной ширины в пикселях (например, 100 для 100%, 80 для 80%).

Вот пример jsfiddle, который иллюстрирует этот сценарий: http://jsfiddle.net/leeives/ujE6s/

Чтобы обойти это, я изменил свой код на .autogrow(), как только отобразилось текстовое поле. При этом звонки в .width() были точными.

Я не уверен, что вы работаете со скрытым контентом или нет, но подумал, что я напишу свой ответ, если другие наткнулись на это (как и я) при поиске проблемы с jQuery .width().

Ответ 2

Я столкнулся с этой проблемой. По какой-то причине (окружению) я не смог вытащить правильный .width() из div, у которого было процентное значение для ширины в CSS.

Принятый ответ на этот пост: браузеры webkit получают элемента .sphere() неправильно

где Габи ответила предложением: $(window).load(...) работал отлично.

  $(window).load(function () {
     alert($('#main').width();
  });

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

Ответ 3

Это потому, что AJAX является асинхронным. Когда вы запустите alert, запрос не вернется.

Фиксированный код:

$.get('page.php', function(result) {
    $('#main').html(result);
    alert($('#main').width());
});

Ответ 4

Это работает, если вы исправите последнюю строку своего кода:

alert($('#main').width());

Вот скрипка

http://jsfiddle.net/UMAbx/

Кроме того, div id=container был неправильно указан в HTML. Исправлено в скрипке.

Ответ 5

Я не могу воспроизвести это поведение. Возможно, кто-то перепробовал jQuery.fn.width() с реализацией, которая возвращает значение в процентах? Я бы отлаживал Firebug или подобное и проверял эту функцию.

Ответ 6

jQuery ширина() возвращает ширину элемента без его границы и отступов.

CSS width с другой стороны может включать в себя границу и дополнение (это зависит от поведения модели окна браузера /css по умолчанию).
Если вам нужна полная ширина элемента, вы должны использовать jQuery outerWidth().

$.get('page.php', function(result) {
    $('#main').html(result);
    alert($('#main').outerWidth();
});