Попытка вызвать код JS, который передается обратно из вызова AJAX - PullRequest
0 голосов
/ 12 июня 2010

Хорошо, у меня есть функция javascript, которая извлекает некоторый HTML ...

function updateQuestions(i){
    var url = 'getQuestions.php?sys=' + i;
    if (receiveReq.readyState == 4 || receiveReq.readyState == 0) {
        receiveReq.open("GET", url, true);
        receiveReq.onreadystatechange = handleQuestionsUpdate; 
        receiveReq.send(null);
    }
}

function handleQuestionsUpdate() {
    if (receiveReq.readyState == 4) {
        var a=receiveReq.responseText;
        document.getElementById('questions').innerHTML=a;
        checkSpeakers(); //Error Occurs Here, even though checkSpeakers() is a function in the returned HTML chunk.
    }   
}

Этот HTML - это не просто HTML, а, в частности, форма и часть javascript. Javascript жестко запрограммирован в HTML и на него не ссылается

Это нормально, что этот извлеченный код JS не распознается во время вызова? Если да, то какова моя альтернатива, если мне нужно, чтобы JS менялся каждый раз, когда обновляется div?

Это текст, возвращаемый в функцию javascript.

function checkPillowSpeakers()
{
    var pillowSpeakers = document.getElementById('Q9').value + document.getElementById('Q10').value;
    document.getElementById('PS1').style.display = ((pillowSpeakers > 0)? '' : 'none');
    document.getElementById('PS2').style.display = ((pillowSpeakers > 0)? '' : 'none');
}~ARRAYSEPERATOR~<html>....</html>

Код JS отделен от кода HTML тегом ~ ARRAYSEPERATOR ~. Проблема в том, что я не хочу сейчас выполнять код, просто хочу поставить его в очередь, чтобы я мог вызвать его по команде.

Ответы [ 5 ]

1 голос
/ 23 июня 2010

После долгих исследований кажется, что у Eval () есть проблемы с памятью ... поэтому я действительно столкнулся с этим решением:

//Firstly, create a div called codeHolder

var javascriptCode="function test(){.....}";
var JSONCode=document.createElement("script");
JSONCode.setAttribute("type","text/javascript");
JSONCode.text=javascriptCode;

var cell=document.getElementById("codeHolder");
if ( cell.hasChildNodes() )
    while ( cell.childNodes.length >= 1 )
        cell.removeChild( cell.firstChild );

cell.appendChild(JSONCode);
1 голос
/ 12 июня 2010

Сначала вы должны попытаться получить часть JavaScript из содержимого HTML. Тогда вы можете легко выполнить его, используя функцию eval() из JavaScript;

1 голос
/ 12 июня 2010

Мой ответ от Как вызвать Javascript в Ajax Response? IE: закрыть форму div в случае успеха

// response is the data returned from the server
var response = "html\<script type=\"text/javascript\">alert(\"foo\");<\/script>html";
var reScript = /\<script.*?>(.*)<\/script>/mg;
response = response.replace(reScript, function(m,m1) {
    var fn = new Function(m1); // this will make the eval run in the global scope
    fn(); //will run alert("foo");
    return "";
});
alert(response); // will alert "htmlhtml"
0 голосов
/ 12 июня 2010

Существует также responseXML:

receiveReq.responseXML.getElementsByTagName('input')

и т. Д. И т. П.

0 голосов
/ 12 июня 2010

вы должны подумать об использовании js-lib для ajax для совместимости с браузером и уменьшения утечек памяти - но если вы хотите сделать это самостоятельно, вы должны выполнить eval () переданный обратно javascript, прежде чем вы сможете его использовать.

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