2012-01-21 3 views
1

Я знаю, когда вы переключаете страницы с помощью jquery mobile, используя ajax, он только захватывает DOM в теле с помощью data-role="page". Проблема в том, что это приложение для мобильного телефона, работающее на мобильном устройстве, поэтому полная загрузка страниц без ajax довольно медленна, получая все сценарии JS, CSS.Есть ли способ захватить javascript на jquery mobile ajax load

Я искал разные вещи. Документы говорят, что вы можете добавить javascript в dom и поставить его под элемент data-role="page", но я все еще не могу заставить его запускать этот путь.

То, что я сейчас пытаюсь это есть сценарий начальной загрузки, который входит в верхней части первой страницы и на pagechange он пытается вставить JS, специфичный для этой страницы в йоте

function insertScript(script, container) { 
var elem = document.createElement('script'); 
elem.type = 'text/javascript'; 
elem.src = 'Assets/Scripts/' + script + '.js'; 
container.appendChild(elem); 
} 
$(document).bind('pagechange', function(event){ 

//get the path to the html asset 
var path = document.location.pathname; 

//split up 
var arr = path.split('/'); 

//get the relevant part of the path ie index.html 
var page = arr[arr.length-1]; 

// grab a list of all the divs's found in the page that have the attribute "role" with a value of "page" 
var pages = $('div[data-role="page"]'), 
// the current page is always the last div in the Array, so we store it in a variable 
currentPage = pages[pages.length-1]; 

//if the page is index add index.js to the last dom node 
if (page == 'index.html') { 
    insertScript('index', currentPage); 
} 

}); 

Тогда для пример index.js имеет следующее:

$("#start_page").live('pageinit', function() { 
    alert('on start page');  
}); 

но функция pageinit никогда не срабатывает. Любые идеи

** редактировать:

У меня есть несколько страниц HTML, используя index.html и home.html, например

* index.html

<html> 
<head> 
<script type="text/javascript" src="js/phonegap-1.3.0.js"></script> 
<script type="text/javascript" src="js/jquery.min.js"></script> 
<script type="text/javascript" src="js/jquery.mobile-1.0.min.js"></script> 
<script type="text/javascript"> 
$("#index_page").live('pageinit', function() { 

//do some page specific js functions for index.html 
}); 

</head> 
<body> 
<div data-role="page" id="index_page"> 
<a href='home.html'>go to home page</a> 
</div> 
</body> 
</html> 

** home.html

<html> 
<head> 
<script type="text/javascript"> 
$("#home_page").live('pageinit', function() { 

    //this is the JS I want to pull 
}); 

</head> 
<body> 
<div data-role="page" id="home_page"> 
<h1>this is the home page</h1> 
</div> 
</body> 
</html> 

Так что произойдет, когда я нажму на ссылку из индекса в дом, дом будет обновлен, но любой JS o n страница home.html НЕ будет вставлена ​​на страницу через AJAX, поэтому я пытаюсь выяснить, как это сделать.

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

ответ

0

Не уверен, что именно вы пытаетесь выполнить, но вы можете прокручивать каждую ссылку на странице с помощью javascript и устанавливать onclick для возврата false, но перенаправлять href на вызов ajax. Страница php получит URL-адрес запрашиваемой страницы, проанализирует xml и вернет содержимое тела. Затем это может заменить тело первой страницы.

+0

Я добавил некоторую информацию к вопросу, чтобы лучше подобрать то, что я прошу. В основном, я хочу использовать javascript для конкретных страниц при навигации с помощью ajax – Brian

1

Имейте в виду, что когда jQuery Mobile загружает другую страницу через AJAX, все, что она делает, это вставить <div data-role="page"> с новой страницы в существующую страницу <body>. Все, что за пределами этого div может также не существовать. Поэтому, когда вы тянете вторую страницу, сценарий, который вы хотите вставить, на самом деле отсутствует.

Пути, которыми вы можете это сделать, - это включить скрипт внутри вашего div или загрузить весь ваш javascript в HEAD. Следует также обратить внимание на это немного мудрости на

http://code.jquery.com/mobile/latest/demos/docs/api/events.html

«для обработчиков, которые будут вызываться во время начальной загрузки страницы, вы должны связать их перед JQuery Mobile выполняет. Это может быть сделано в mobileinit обработчик, как описано на глобальной странице конфигурации. "

О, и еще одна вещь, которую нужно помнить ...копирование javascript на страницу, которая уже загружена, фактически не будет выполнена;)

+0

Даже если JS завернут в событие pageInit? – Brian

+0

http://stackoverflow.com/questions/1197575/can-scripts-be-inserted-with-innerhtml кажется полезным здесь. Но я по-прежнему думаю, что основная проблема, которую вы будете иметь, - это сделать заказ, который будет загружать страницу, запускать скрипты в jQuery Mobile и запускать события. http://jacob4u2.posterous.com/documentready-with-jquery-mobile был очень полезен для меня. –

+0

Эта вторая ссылка, я думаю, может иметь ответ, но я еще не совсем там. скрипка JS, похоже, не работает для меня. С этой структурой, если хотите, вам нужно ссылаться на конкретный JS-файл, например, мне нужно разместить как где-то ? Или nav.js идет и захватывает функцию? – Brian

0

Я еще не встречал проблему. наконец, я использую тег iframe и добавлю в div data-role="page".

Так же, как это:

<iframe style="display:none" onload="javascript:js_fun()"></iframe>

затем js_fun() работает. Таким образом, можно загрузить js-код или файл с помощью ajax.