Вставьте HTML в страницу с Ajax

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

Пример: Если пользователь нажмет на кнопку '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 функция возвращает ответ. Вероятно, существует другой способ сделать его... то же, которое поможет мне решить эту проблему.

11
задан saleem ahmed 6 October 2014 в 04:26
поделиться

4 ответа

Если вы используете функцию 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');
10
ответ дан 3 December 2019 в 08:54
поделиться

Я также предлагаю вам этого не делать, но после загрузки содержимого в 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;
    }

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

2
ответ дан 3 December 2019 в 08:54
поделиться

В HTML-коде вашего контента (тот, который вы получаете в результате вызова) создайте общую функцию javascript для каждой страницы контента, которая будет вызываться каждый раз, когда контент загружается на главную страницу ...

имя функции будет быть чем-то вроде: loadContentJavascript () {}

, и эта функция отвечает за загрузку всех функций, которые она будет загружать при событии onload.

0
ответ дан 3 December 2019 в 08:54
поделиться

Я не рекомендую вам этого делать, это может привести к нарушению безопасности.
Если вы уже используете jquery, используйте его функциональность ajax вместо исходной.
Когда запрос ajax завершится, выполните код анимации (просто оставьте его на странице, которая выполняет вызов ajax).

1
ответ дан 3 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: