#javascript #jquery #navigation #jquery-mobile
#javascript #jquery #навигация #jquery-mobile
Вопрос:
Мое мобильное приложение jQuery состоит из одной index.html
страницы и содержит только одну страницу со ссылкой при запуске:
<div data-role="page">
<div data-role="content">
<a id="startPageLink" href="startPage">start</a>
</div>
</div>
Когда пользователь нажимает на ссылку start, я хочу загрузить содержимое для startPage
из моего JSON api асинхронно. При обратном вызове я хотел бы создать все необходимые элементы DOM для startPage
с помощью JavaScript и добавить к нему содержимое. Я создал createStartPage(data)
метод для этого.
Каков правильный способ реализовать такие динамически создаваемые страницы, чтобы открытие index.html#startPage
также работало? Я думаю, что должен быть способ подключиться к $.mobile.changePage()
, чтобы включить пользовательский код загрузки / создания страницы, но я ничего не нашел. Или есть лучшее решение для этой проблемы?
Комментарии:
1. Последняя версия jQuery Mobile (27 мая) содержит изменения в том, как
$.mobile.changePage()
работает, которые могут быть полезны: jquerymobile.com/blog/2011/05/27 /…
Ответ №1:
У меня было некоторое время, чтобы повозиться с этим, и я нашел решение, которое работает (протестировано).
НЕКОТОРЫЕ ПРИМЕЧАНИЯ:
- javascript, инкапсулированный в $(document).ready(); предназначен для динамического создания страницы, если пользователь переходит на ваш index.html файл с уже добавленной меткой хэша (т.е. index.html#some_hash_mark).
- Функция create_page(page_id) предназначена для создания страницы по ссылке (или программно, если хотите).
- Обратите внимание, что основной скрипт jquery и jquery mobile css загружаются перед $(document).оператор ready(), но после этого загружается скрипт jquery mobile.
- Убедитесь, что тегу body присвоен идентификатор, который обновляется при добавлении к нему страниц.
Образец документа
<!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 != '' amp;amp; 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>
Комментарии:
1. Это решает проблему, как начать с конкретной динамической страницы. Спасибо. Но как создавать дополнительные страницы по запросу (после нажатия a <li><a>)?.
2. создайте страницу (page_id)… это функция для создания страницы по ссылке. Она создает страницу, инициализирует ее, затем перенаправляет пользователя на новую страницу. Специальная функция, о которой я написал выше, также создает ссылку на домашней странице, поэтому, если пользователь вернется на домашнюю страницу, он может снова перейти на вновь созданную страницу. Это было задокументировано в ПРИМЕЧАНИИ № 2.
<li><a href="javascript:create_page('page_id_here');">link text</a></li>
Ответ №2:
Для меня решение Jasper не работает, но я нашел это решение, которое выглядит чище и работает нормально
Комментарии:
1. Это намного лучшее решение.
Ответ №3:
Вот мой метод динамического добавления контента на мои веб-сайты Jquery Mobile:
-
Сначала я создаю «оболочку» 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 ($(‘#’ страница ‘-содержимое’).is(‘:пустой’)) { позволяет пользователю перемещаться от динамически созданной страницы, а затем возвращаться и не загружать данные повторно, пока не произойдет полное обновление страницы.
-
Моя динамически создаваемая страница включала в себя в основном список, поэтому listview () заставляет jquery mobile framework обновлять выбранный список, чтобы добавить правильный css, page () делает то же самое с другими элементами страницы; однако вам может потребоваться использовать только один или другой в зависимости от вашего контента (или вообще ничего, если это обычный текст).
-
Я понимаю, что это не создает всю страницу динамически, потому что страница «оболочки» уже жестко запрограммирована, но если вы хотите добавить целую новую страницу, вы, вероятно, можете использовать что-то вроде: (непроверено)
$(document).append('<div data-role="page" id="my_page_id"><div data-role="content">FOO BAR</div></div>'); $('#my_page_id').page();
Если вы действительно хотите, чтобы все это создавалось динамически, вы можете проверить наличие window.Расположение.хэшируйте и создайте свой data-role=page div с идентификатором, установленным в качестве окна.местоположение.хэш.
Также я использую Jquery 1.6 и Jquery Mobile 1.0a4.1
Я надеюсь, что там что-то может кому-то помочь 🙂
Комментарии:
1. Это решение по-прежнему требует наличия всех оболочек страницы, прежде чем переходить по ссылке. Но у меня потенциально есть тысячи ссылок, которые ведут на тысячи разных страниц. Разве нет способа не создавать тысячи неиспользуемых страниц?
Ответ №4:
Вы смотрели на метод загрузки ajax в jquery? Похоже, вы могли бы просто загрузить нужную страницу и заменять тело каждый раз, когда у вас возвращается запрос.
Ответ №5:
В этом примере на JSFiddle я принимаю вызов API из Flickr и прогоняю результаты через механизм jquery tmpl, чтобы добавить новую страницу к документу, а затем вызываю $.mobile.changePage() для вновь вставленной страницы. Я думаю, вы увидите, насколько полезно сочетание jquery tmpl API jquery mobile.