Я в настоящее время разрабатываю веб-сайт, и мне нужно это загрузки страниц динамично на основе того, какие действия пользователь делает.
Пример: Если пользователь нажмет на кнопку 'Settings', то функция ajax загрузит из внешней страницы код и поместит в отделение с тегом 'настройки'.
Это - код, который я использую для выполнения запроса Ajax:
function get_page_content(page, target_id)
{
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function()
{
if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
document.getElementById(target_id).innerHTML = xmlhttp.responseText;
// After getting the response we have to re-apply ui effects or they
// won't be available on new elements coming from request.
$('button').sb_animateButton();
$('input').sb_animateInput();
}
}
xmlhttp.open('GET', 'engine/ajax/get_page_content.php?page=' + page, true);
xmlhttp.send();
}
И это - то, куда результаты ajax будут помещены первым отрывком:
<div id="settings_appearance">
</div>
Код называют от функции здесь:
<div class="left_menu_item" id="left_menu_settings_appearance" onclick="show_settings_appearance()">
Appearance
</div>
И это - HTML, который функция ajax поместит в settings_appearance
отделение:
<script type="text/javascript">
$(function()
{
$('#upload_hidden_frame').hide();
show_mybrain();
document.getElementById('avatar_upload_form').onsubmit = function()
{
document.getElementById('avatar_upload_form').target = 'upload_hidden_frame';
upload_avatar();
}
});
</script>
<div class="title">Appearance</div>
<iframe id="upload_hidden_frame" name="upload_hidden_frame" src="" class="error_message"></iframe>
<table class="sub_container" id="avatar_upload_form" method="post" enctype="multipart/form-data" action="engine/ajax/upload_avatar.php">
<tr>
<td><label for="file">Avatar</label></td>
<td><input type="file" name="file" id="file" class="file_upload" /></td>
<td><button type="submit" name="button_upload">Upload</button></td>
</tr>
<tr>
<td><div class="hint">The image must be in PNG, JPEG or GIF format.</div></td>
</tr>
</table>
Я хотел бы знать, существует ли способ выполнить также код JavaScript, это возвращается функцией ajax (кнопка загрузки в коде возврата не работает из-за этого), и если возможно применяться, некоторые настроили ui эффекты, которые я создаю, которые загружаются основной страницей.
Спасибо за помощь.
P.S. Это - сценарий, который применяет эффекты UI:
<script type="text/javascript">
// UI effects
$(document).ready(function()
{
$('button').sb_animateButton();
$('input').sb_animateInput();
$('.top_menu_item').sb_animateMenuItem();
$('.top_menu_item_right').sb_animateMenuItem();
$('.left_menu_item').sb_animateMenuItem();
});
</script>
Эффекты P.P.S. ui не применяются к элементам HTML (такой, как введено и кнопки) возвращенный функцией Ajax. Я использовал немного обходного решения путем применения снова ui-эффектов после того, как ajax функция возвращает ответ. Вероятно, существует другой способ сделать его... то же, которое поможет мне решить эту проблему.
Если вы используете функцию jQuery ajax (или упрощенную функцию jQuery get) и установите тип данных html, то jQuery будет оценивать содержимое любых тегов сценария, включенных в результаты.
Ваш вызов $.get будет выглядеть примерно так:
$.get('engine/ajax/get_page_content.php?page=' + page,null,function(result) {
$("#"+target_id).html(result); // Or whatever you need to insert the result
},'html');
Я также предлагаю вам этого не делать, но после загрузки содержимого в div передайте этой функции идентификатор элемента. Это даже обработает document.write
function do_JS(e){
var Reg = '(?:<script.*?>)((\n|.)*?)(?:</script>)';
var match = new RegExp(Reg, 'img');
var scripts = e.innerHTML.match(match);
var doc = document.write;
document.write = function(p){ e.innerHTML = e.innerHTML.replace(scripts[s],p)};
if(scripts) {
for(var s = 0; s < scripts.length; s++) {
var js = '';
var match = new RegExp(Reg, 'im');
js = scripts[s].match(match)[1];
js = js.replace('<!--','');
js = js.replace('-->','');
eval('try{'+js+'}catch(e){}');
}
}
document.write = doc;
}
. Лучшим решением будет добавить функцию, которую вы можете вызвать в конце обновления, чтобы показать эффекты.
В HTML-коде вашего контента (тот, который вы получаете в результате вызова) создайте общую функцию javascript для каждой страницы контента, которая будет вызываться каждый раз, когда контент загружается на главную страницу ...
имя функции будет быть чем-то вроде: loadContentJavascript () {}
, и эта функция отвечает за загрузку всех функций, которые она будет загружать при событии onload.
Я не рекомендую вам этого делать, это может привести к нарушению безопасности.
Если вы уже используете jquery, используйте его функциональность ajax вместо исходной.
Когда запрос ajax завершится, выполните код анимации (просто оставьте его на странице, которая выполняет вызов ajax).