jQueryMobile показывает неправильное значение height () - PullRequest
1 голос
/ 21 марта 2012

У меня действительно простая наценка для домашнего / индексного экрана / страницы для приложения jQM:

<div id="home" class="container" data-role="page">
    <div class="grid-quarter">
        <a class="ui-link">
            <span class="grid-icon-container">
                <span class="grid-icon icon-lock"></span>
                <span class="grid-icon-text">LABEL TEXT</span>
            </span>
        </a>
    </div>
    <!-- 3 x the same -->
</div>

Проблема

Теперь это отлично работает на jsFiddle, но как толькокогда я добавляю точно такой же код в мое приложение jQM, функция js .height() (и любая другая попытка получить высоту элемента) завершается неудачей.

Я написал функцию, которая проверяет каждый бит при любой возможностиопределить высоту и не удается с JQM.Это терпит неудачу, даже если я пытаюсь получить это непосредственно от объекта DOM.И даже когда я вижу DOM-объект, имеющий точную установленную высоту.Забавно, как оно есть: .width() правильно выводит.

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


Тестовый код

// Trigger on Load and Resize 
$( '#home' ).on( 
     'pageinit'
    ,function( event )
    {
        fitIconFont( '.icon-font' );
    }
);
// Fit on Window size change
$( window ).resize( function()
{
    fitIconFont( '.icon-font' );
} );

function fitIconFont( class_name )
{
    // DEBUG
    jQuery( class_name ).each( function( index, element ) 
    {
            // WORKS:
        $( this ).on( 'click', function () 
        {
            console.log( $( this ).height() );
        } );
        console.log( $( element ).css('width') );
        console.log( $( element ).width() );

            // FAILS with 20px as output
        console.log( $( element ).css('height') );
        console.log( $( element ).height() );
        console.log( element.scrollHeight );
        console.log( element.offsetHeight );
        console.log( element.clientHeight );
        console.log( element );

        console.log( $( this ).height() );
        console.log( $( this ).css('height') );
        console.log( this.scrollHeight );
        console.log( this.offsetHeight );
        console.log( this.clientHeight );
        console.log( this );
    } );
}

Снимок экрана из Chrome dev bar

image

Ссылка на пример jsFiddle

Ответы [ 3 ]

1 голос
/ 22 октября 2013

HTML

<div id="header">
    <h1>Header</h1>
</div>
<div id="home" data-role="page" class="container" style="background-color: #aaa;">
    <div class="grid-half " style="background-color: #009ee0;">
        <a href="#" class="ui-link">
            <span class="grid-icon-container">
                <span class="icon-font icon-a"></span>
                <span class="grid-icon-text">Label A</span>
            </span>
        </a>
    </div>
    <div class="grid-half last" style="background-color: #FF00FF;">
        <a href="#" class="ui-link">
            <span class="grid-icon-container">
                <span class="icon-font icon-b"></span>
                <span class="grid-icon-text">Label B</span>
            </span>
        </a>
    </div>
    <div class="grid-half btop" style="background-color: #FFFF00;">
        <a href="#" class="ui-link">
            <span class="grid-icon-container">
                <span class="icon-font icon-c"></span>
                <span class="grid-icon-text">Label C</span>
            </span>
        </a>
    </div> 
    <div class="grid-half last btop" style="background-color: #000;">
        <a href="#" class="ui-link">
            <span class="grid-icon-container">
                <span class="icon-font icon-d"></span>
                <span class="grid-icon-text">Label D</span>
            </span>
        </a>
    </div>       
</div>

Сценарий

function fitIconFont( elements ) 
{
    $( elements ).each( function( key, el )
        {
            var 
                container         = $( el ).parent()
                container_height = parseInt( $( container ).outerHeight( true ), 0 )
                new_icon_height  = parseInt( container_height * 0.75, 0 ) + 'px'
                new_label_height = parseInt( container_height * 0.25, 0 ) + 'px'
            ;

            // Set font-sizes for icon & label
            $( el ).css( 'font-size', new_icon_height );
            $( el ).next().css( 'font-size', new_label_height );

            // Debug print
            $( '#header' ).text( 'current heights: Container: ' + container_height + ' / ' );
            $( '#header' ).append( 'Icon: ' + new_icon_height + ' / ' );
            $( '#header' ).append( 'Label: ' + new_label_height );
        }
    );
}

// Trigger on Load and Resize 
// Fit on Window load
$( window ).on( 'load' )
{
    fitIconFont( '.icon-font' ) ;
}
// Fit on Window size change
$( window ).resize( function()
{
    fitIconFont( '.icon-font' );
} );

// Fit on Page Show
jQuery( '#home' ).on( 
     'pageshow'
    ,function( event )
     {
        fitIconFont( '.icon-font' );
     }
).trigger( 'updatelayout' );

// Fit on Orientation Change
jQuery( '#home' ).on( 
     'orientationchange'
    ,function( event )
     {
        fitIconFont( '.icon-font' );
     }
).trigger( 'updatelayout' );

/**
 * Update grid container height/width on change of device orientation
 */
$( '#home' ).on( 
    'orientationchange'
    ,function( e )
     {
         $( '.grid-half' ).each( function( index, el )
         {
             //if ( 'portrait' !== e.orientation )
             $( el ).width( window.innerWidth * .5 );
             $( el ).height( window.innerHeight * ( 'portrait' !== e.orientation ? .6 : .5 ) );
         } );
     }
);

CSS

body, html { 
    height: 100%; 
    margin: 0;
    padding: 0; 
    font-size: 100%;
}
#header {
    height: 10%;
    width: 100%;
    line-height: 1;
    font-weight: bold;
}
#header {
    text-align: center;
}
#home {
    width: 100%;
    height: 90%;
}
    /* Grid */
    .grid-half {
        display: table;
        position: relative;
        float: left;
        width: 49.8%;
        height: 50%;
    }
    .grid-half.last {
        border-left: 1px dashed white;
    }
    .grid-btop {
        border-top: 1px dashed white;
    }
        .grid-half .ui-link {
            display: table-cell;
            position: absolute;
            height: 100%;
            width: 100%;
            vertical-align: middle;
            text-align: center;
            text-decoration: none;
        }
        .grid-half .grid-icon-container {
            display: block;
            position: relative;
            top: 25%;
            margin: 0 auto;
            height: 50%;
            width: 50%;
            border: 1px dotted #ddd;
        }
        .grid-half .icon-font {
            margin: 0 auto;
            position: relative;
            display: block;
            height: 75%;
            width: 100%;
            background-color: #bdbddb;
        }
        .grid-icon-text {
            display: block;
            position: relative;
            height: 25%;
            width: 100%;
            margin: 1% auto 0;
            text-align: center;
            background-color: #fff;
        }

/* Icons */
[class^="icon-"]:before,
[class*=" icon-"]:before {
    font-family: Arial;
    font-weight: normal;
    display: inline-block;
    text-decoration: inherit;
    text-align: center;
}
.icon-a:before     { content: "C"; color: #FFFF00; }
.icon-b:before     { content: "M"; color: #009ee0; }
.icon-c:before     { content: "Y"; color: #000; }
.icon-d:before     { content: "K"; color: #FFFF00; }

/* Style */
#header,
a {
    color: #333;
    font-family: Helvetica, Arial, sans-serif;
    text-decoration: none;
}

Пример: http://jsfiddle.net/kaiser/qAcSR/

1 голос
/ 21 марта 2012

Когда вы запустили этот код в JSFiddle, вы, вероятно, не связались с настройками слева для того, когда загружать JavaScript (расположен чуть выше выпадающего списка Framework). По умолчанию установлено значение onLoad, что эквивалентно $(window).on('load', ...). Когда window.load выстрелит, все ресурсы будут загружены и стилизованы должным образом, чтобы вы могли получить точную высоту.

Он работает в обработчике событий click, потому что все ресурсы на странице загружены, и вы можете получить точное чтение. width, вероятно, сообщается правильно, потому что он не изменяется после полной загрузки страницы, что обычно происходит, поскольку элементы уровня блока по умолчанию занимают 100% ширины.

Я пытаюсь использовать настройку no wrap (body) в JSFiddle, чтобы код выполнялся одновременно с тем местом, где я обычно помещал код (внизу документа).

0 голосов
/ 23 марта 2012

По какой-то причине все это работает только с добавлением обоих on( 'pageinit' ) И ( document ).ready().

Не знаю почему, но этот способ срабатывает и на настольном компьютерекак мобильные устройства.Забавно как есть: если я использую только одно из двух: Nada, ничего, nix работает.

...