Как перезагрузить все javascripts после запроса ajax? - PullRequest
3 голосов
/ 08 сентября 2011

У меня есть страница с большим количеством javascript. У меня есть контент, и у него есть эффекты JavaScript. Я хочу изменить содержимое на другое содержимое (конечно, с теми же эффектами JavaScript), используя ajax.

Вот мой код для запроса ajax:

<head>
<script type="text/javascript">
function ajax(txt) {
    if (window.XMLHttpRequest)
    {
        xmlhttp = new XMLHttpRequest();
    }
    else
    {
        xmlhttp = new ActiveXObject("MICROSOFT.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 & xmlhttp.status==200)
        {
            document.getElementById("content").innerHTML=xmlhttp.responseText;

  }
  }
    xmlhttp.open("GET", "index.php?p="+txt, true);
    xmlhttp.send();
}
</script>
</head>
<body>
<div id="content">
...content...
</div>
<input type="button" onclick=ajax('2') value="click" />
</body>

Проблема в том, что контент изменен, но новый контент не имеет эффектов javascript. И я думаю, что javascripts необходимо перезагрузить, но как я могу сделать это после запроса AJAX?

Спасибо

Ответы [ 3 ]

0 голосов
/ 08 сентября 2011

Если перезагрузка файлов Javascript является решением, вы можете попробовать эту функцию:

function inject(src, cb, target){
    target = target || document.body;
    var s = document.createElement('SCRIPT');
    s.charset = 'UTF-8';
    if(typeof cb === 'function'){ 
        s.onload = function(){
            cb(s);
        }; 
        s.onreadystatechange = function () {
            (/loaded|complete/).test(s.readyState) && cb(s);
         };                     
    }
    s.src = src;
    target.appendChild(s);
    return s;
};

И использовать ее:

inject('path/to/new.js');

или использовать функцию обратного вызова, если хотитевызвать действие при загрузке файла:

inject('path/to/new.js', function(s){
  //the file is loaded
});
0 голосов
/ 16 февраля 2012

Включите JavaScript для эффектов внутри старых и новых content блоков и перезапустите сценарии эффектов после вставки нового узла, например:

/** 
 * Evaluates scripts included via innerHTML.
 * @param {Node} node Node containing scripts.
 * */
function evalScripts(node){
    if (!node) return;

    var st = node.getElementsByTagName('SCRIPT');
    var strExec;

    for (var i = 0; i < st.length; i++) {
        strExec = st[i].text;
        //st[i].parentNode.removeChild(st[i]);
        st[i].text = '';

        try {
            var x = document.createElement('script');
            x.type = 'text/javascript';
            x.innerHTML = strExec;

            document.getElementsByTagName('head')[0].appendChild(x);
        } 
        catch (bug) {}
    }
};

Также может быть хорошей идеей удалить старые сценарии из head как-то, если вы планируете много таких операций.

0 голосов
/ 08 сентября 2011

Вам не нужно перезагружать файлы javascript.Все, что вам нужно сделать, это дать «эффектам» понять, что на вашей странице есть новый контент.Обычно вам нужно снова запустить функцию.В случае использования функции jquery это $ (document.ready (...)).Если ваши «эффекты» не заключены в функцию, оберните их и вызовите эту функцию при изменении содержимого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...