Динамически создайте страницу jQuery Mobile через JavaScript после нажатия
Мое приложение jQuery Mobile состоит из одной страницы index.html
и содержит только одну страницу со ссылкой при запуске:
<div data-role="page">
<div data-role="content">
<a id="startPageLink" href="startPage">start</a>
</div>
</div>
Когда пользователь нажимает на ссылку запуска, я хочу асинхронно загружать содержимое для startPage
из моего JSON api. В обратном вызове я хотел бы создать все необходимые элементы DOM для startPage
через JavaScript и добавить к нему контент. Для этого я создал метод createStartPage(data)
.
Каков правильный способ реализации таких динамически созданных страниц, так что открытие index.html#startPage
также работает? Я думаю, что должен быть способ подключиться к $.mobile.changePage()
, чтобы включить пользовательский код загрузки/создания страницы, но я ничего не нашел. Или есть лучшее решение этой проблемы?
Ответы
Ответ 1
У меня было время, чтобы пообщаться с этим, и я нашел решение, которое работает (проверено).
НЕКОТОРЫЕ ПРИМЕЧАНИЯ:
- javascript, заключенный в $(document).ready(); предназначен для динамического создания страницы, если пользователь переходит к вашему файлу index.html с уже добавленной меткой хеша (т.е. index.html # some_hash_mark).
- Функция create_page (page_id) предназначена для создания страницы из ссылки (или программно, если хотите).
- Обратите внимание, что ядро jquery script и jQuery mobile css загружаются перед оператором $(document).ready(), но после загрузки загружается jQuery mobile script.
- Обратите внимание, что тегу body присваивается id, который переопределяется при добавлении к нему страниц.
Пример документа
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.css"/>
<script type="text/javascript" charset="utf-8" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
//check if hash exists and that it is not for the home screen
if (window.location.hash != '' && window.location.hash != '#page_0') {
//set whatever content you want to put into the new page
var content_string = 'Some ' + window.location.hash + ' text...<br><br><a href="#page_0">go to home screen</a>';
//append the new page onto the end of the body
$('#page_body').append('<div data-role="page" id="' + window.location.hash.replace('#','') + '"><div data-role="content">' + content_string + '</div></div>');
//add a link on the home screen to navaigate to the new page (just so nav isn't broken if user goes from new page to home screen)
$('#page_0 div[data-role="content"]').append('<br><br><a href="#' + window.location.hash.replace('#','') + '">go to ' + window.location.hash.replace('#','') + ' page</a>');
}
});
function create_page(page_id) {
//set whatever content you want to put into the new page
var string = 'FOO BAR page...<br><br><a href="#page_0">return to home screen</a>';
//append the new page onto the end of the body
$('#page_body').append('<div data-role="page" id="' + page_id + '"><div data-role="content">' + string + '</div></div>');
//initialize the new page
$.mobile.initializePage();
//navigate to the new page
$.mobile.changePage("#" + page_id, "pop", false, true);
//add a link on the home screen to navaigate to the new page (just so nav isn't broken if user goes from new page to home screen)
$('#page_0 div[data-role="content"]').append('<br><br><a href="#' + page_id + '">go to ' + page_id + ' page</a>');
//refresh the home screen so new link is given proper css
$('#page_0 div[data-role="content"]').page();
}
</script>
<title>Fixed Headers Example</title>
<script src="http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.js"></script>
</head>
<body id="page_body">
<div data-role="page" id="page_0">
<div data-role="content">Some #page_0 text...<br><br><a href="javascript: create_page('foo_bar_page');">create new page</a></div>
</div>
</body>
</html>
Ответ 2
Вот мой метод динамического добавления контента на мои сайты JQuery Mobile:
-
Сначала создаю "wrapper" data-role = page div так:
<div data-role="page" id="my_page_id">
<div data-role="content">
<script>
$('#my_page_id').live('pageshow', function() {
my_data_loading_function('my_page_id');
});
</script>
<div id="my_page_id-content"></div>
</div><!--/content-->
</div><!--/page-->
-
Затем я загружаю данные из внешнего источника в тег div, расположенный на моей странице "обертка":
function my_data_loading_function(page) {
if ($('#' + page + '-content').is(':empty')) {
$.mobile.pageLoading();
$('#' + page + '-content').load("my_external_script.php", function() {
$.mobile.pageLoading(true);
$('#' + page + '-content ul').listview();
$('#' + page + '-content ul').page();
});
}
}
Некоторые примечания:
-
$mobile.pageLoading(). и $.mobile.pageLoading(true); показать и скрыть (соответственно) развертку загрузки JQuery Mobile.
-
if ($ ('#' + page + '-content'). is (': empty')) {позволяет пользователю переходить от динамически созданной страницы, а затем возвращаться и не иметь повторно загрузите данные до тех пор, пока не произойдет полное обновление страницы.
-
Моя динамически созданная страница включала в основном список, поэтому listview() заставляет фреймворк jquery обновлять список, выбранный для добавления правильного css, page() делает то же самое с другими элементами страницы; однако вам может понадобиться использовать только тот или иной контент в зависимости от вашего контента (или вообще ничего, если его просто текст).
-
Я понимаю, что это не создает целую страницу динамически, потому что страница "обертка" уже жестко закодирована, но если вы хотите добавить целую новую страницу, вы, вероятно, можете использовать что-то вроде: (untested)
$(document).append('<div data-role="page" id="my_page_id"><div data-role="content">FOO BAR</div></div>');
$('#my_page_id').page();
Если вы действительно хотите сделать все это динамически созданным, вы можете проверить для window.location.hash и создать свой файл data-role = page div с идентификатором, установленным как window.location.hash.
Также я использую JQuery 1.6 и JQuery Mobile 1.0a4.1
Я надеюсь что-то там может помочь кому-то там:)
Ответ 3
Мне решение Jasper не работает, но я нашел это решение, которое выглядит более чистым и работает нормально
Ответ 4
Вы смотрите на метод загрузки jquery ajax? Похоже, вы можете просто загрузить эту страницу и заменить тело каждый раз, когда у вас появится запрос.
ссылка
Ответ 5
В этом примере на JSFiddle я беру вызов API от Flickr и запускаю результаты через механизм jquery tmpl, чтобы добавить новую страницу в документ, а затем вызвать $.mobile.changePage() на вновь вставленную страницу, Я думаю, вы увидите, насколько полезно спаривание jQuery tmpl + apis + jquery mobile.
http://jsfiddle.net/sgliser/8Yq36/5/