Подтвердить что ты не робот

Команда JQuery Mobile триггера ( "создать" ) не работает

JQuery Mobile делает мой крик сегодня вечером. Я пытаюсь создать пользовательские элементы управления, поэтому я не повторяю некоторые элементы через свое приложение, и это дает мне трудное время. В частности, у меня есть следующий файл HTML:

<div id="custom-header" data-role="header" data-position="inline" data-theme="f">
    <a href="index.html" data-icon="back" style="margin-top:5px" data-theme="b">Back</a>
    <div style="text-align: center; padding-top: 5px; padding-bottom: 3px"><img src="../images/logo.png" ></div>
    <a href="index.html" data-icon="home" style="margin-top:5px" data-theme="b">Home</a>
</div>

В основном файле, который я делаю:

<script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script src="http://code.jquery.com/mobile/1.0rc2/jquery.mobile-1.0rc2.min.js"></script>        
<div data-role="page" id="test-console" data-theme="m">

    <div id="me-header"></div>

    <script>

        $.get('header.html', function (retData) {
            $('me-header').html(retData).trigger('create');
        });

     </script>

</div>

Итак, проблема: заголовок не отображается так же, как при вклеивании содержимого header.html прямо на мою страницу JQM. Он почти чувствует, что триггер ( "создать" ) ничего не делает.

Любые идеи? Я сжег около трех часов, и учебники, такие как http://jquerymobiledictionary.pl/faq.html, похоже, не применяются..

4b9b3361

Ответ 1

Я считаю, что нашел "лучший" ответ. Короче говоря, элементы роли данных "header" и "footer" не являются стандартными виджетами. Это своего рода гибридная конструкция. Я нашел это, просто перейдя по исходному коду JQueryMobile. У них нет метода "create", поэтому его нельзя вызвать.

Моим обходным решением было просто применить классы непосредственно к моему коду, вместо того, чтобы ожидать, что виджет сделает это для меня. Не идеально, но он работает достаточно хорошо.

Ответ 2

При изменении заголовка, нижнего колонтитула или содержимого вы можете вызвать pagecreate на странице:

$('#me-header').closest(":jqmData(role='page')").trigger('pagecreate');

Это ошибка jQM: https://github.com/jquery/jquery-mobile/issues/2703. Согласно комментарию в отчете о выпуске, вызов pagecreate несколько раз может вызвать проблемы, хотя, как описано в https://github.com/jquery/jquery-mobile/issues/2703#issuecomment-4677293.

Ответ 3

Я обнаружил, что триггер ('create');

Работает, когда применяется к телу следующим образом:

$('body').append(html).trigger('create');

Но проблема, с которой я сейчас сталкиваюсь, - это список ul, который бросает ошибку undefined.

Ответ 4

этот вопрос уже достаточно велик, но я просто столкнулся с проблемой, поэтому вот как я его обработал - (это поддерживает заданную тему данных и применяет правильные роли для содержащихся divs и заголовков)

$('your_selector').find('div[data-role="header"], div[data-role="footer"]').each(
    function( ){
        var dR = $(this).attr('data-role');
        var dT = $(this).attr('data-theme');
        $(this).addClass('ui-' + dR + ' ui-bar-' + dT).attr('role', (dR == 'header' ? 'banner' : 'contentinfo') ).children('h1, h2, h3, h4').each(
            function( ){
                $(this).addClass('ui-title').attr({'role':'heading', 'aria-level':'1'});
            }
        )
    }
);

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

Ответ 5

Для меня .trigger('create'); всегда работает, если применяется к элементу с data-role="page"

Попробуйте следующее: $('#test-console').trigger('create');

Надеюсь, что это поможет.

Ответ 6

$('me-header').html(retData).trigger('create');

должен быть:

$('me-header').append(retData).trigger('create');

Ответ 7

Возможно, попробуйте:

$('#me-header').append(retData).trigger('create');

Ответ 8

Это не ответ на конкретную проблему OP, но одна из причин, почему работающий .trigger('create') не работает, может заключаться в том, что jQuery Mobile не загружен должным образом в текущей области действия и, таким образом, не реагирует на триггер - что может произойти при плохо настроенной настройке RequireJS, например.

Не стоит проверять console.log($. mobile), если он показывает undefined...

Ответ 9

Как и другие, я делаю все возможное, чтобы вводить заголовок на странице. Как сказал Anthony, проблема в заголовке не является "основным" виджетами. Классы не добавляются jqm, выполняющим инъекцию.

Мне не очень нравится добавлять класс ui сам.

Мое предложение (сумасшедшее?) состоит в том, чтобы создать совершенно новую страницу (включая заголовок), а затем извлечь тег заголовка, включая всю церемонию класса ui, добавленную jqm. Я действительно не знаю перфорации, но, похоже, он работает и кажется более реалистичным, чем добавление класса руками.

Ниже приведен пример

. Вам нравится?

$( '[data-role=page]' ).on( 'pageinit', function ( event, ui ) {
  var sHeader = '<div data-role="header" id="tobechanged" data-position="fixed" data-id="CPL">';
        sHeader += '<a href="#panelImageDetailLeft" data-icon="bars" data-iconpos="notext" data-shadow="false" data-iconshadow="false">Menu1</a>';
        sHeader += '<h1>What a nice title </h1 >';
        sHeader += '<a href="#panelImageDetailRight" data-icon="bars" data-iconpos="notext" data-shadow="false" data-iconshadow="false">Menu2</a>';
sHeader += '</div>';

//Create a temporary page to initialize all the ui-class 
//var sId = core.misc.GUID_new();
var sId = "azerty";
$( '#body' ).append( '<div data-role="page" id="' + sId + '">' + sHeader + '<div data-role="content">content</div></div>' );
$.mobile.initializePage(); //do not know if needed
$( '#' + sId ).page();  //very important to let jqm generate the class ui
//console.log( "page():\n" + $( '#' + sId ).html() );

var $myHeader = $( '#tobechanged' );
//console.log( "tobechanged:\n" + $myHeader.html());

//clean the temporary page
$( '#' + sId ).empty();
$.mobile.initializePage(); //do not know if needed

//replace the id
//console.log( "myheader id: ... " + $myHeader.attr( "id" ) ); 
$myHeader.attr( "id", $( "#" + event.target.id ).attr("id") + "Header" );
//console.log( "myheader id: ... " + $myHeader.attr( "id" ) ); 

$( "#" + event.target.id ).find( "[data-role=header]" ).replaceWith( $myHeader );

});

Ответ 10

Призвание:

trigger('pagecreate');

сразу после:

trigger('create');

работает для меня.