Javascript через Ajax - PullRequest
       5

Javascript через Ajax

2 голосов
/ 22 июля 2010

Как я могу запустить javascript через ajax?

HTML-файл

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>FusionCharts 3.0 Dashboard</title>
<script language="JavaScript" src="../FusionCharts.js"></script>
<script language="JavaScript" src="../PowerMap.js"></script>
<script type="text/javascript">
function loadXMLDoc()
{
    if (window.XMLHttpRequest)
    {
         xmlhttp=new XMLHttpRequest();
    }
    else
    {
         xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            document.getElementById("ajax").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("POST","test.php",true);
    xmlhttp.send();
}
</script>
</head>
<body>
<div id="chart3" align="center"></div><br />
<div id="ajax"></div>
<input type="button" onclick="loadXMLDoc()" value="test" />    
</body>
</html>

php файл

<?
$html = '<script type="text/javascript">
window.onload = function start() {
    onClick();
}

function onClick() {
var myChart = new FusionCharts("../Charts/HLinearGauge.swf", "chart3", "580", "80", "0", "0");
myChart.setDataXML("<chart bgColor=\'FBFBFB\' bgAlpha=\'100\' showBorder=\'0\' chartTopMargin=\'0\' chartBottomMargin=\'0\'\n\
upperLimit=\'30\' lowerLimit=\'0\' ticksBelowGauge=\'1\' tickMarkDistance=\'3\' valuePadding=\'-2\' pointerRadius=\'5\'\n\
majorTMColor=\'000000\' majorTMNumber=\'3\' minorTMNumber=\'4\' minorTMHeight=\'4\' majorTMHeight=\'8\' showShadow=\'0\'\n\
pointerBgColor=\'FFFFFF\' pointerBorderColor=\'000000\' gaugeBorderThickness=\'3\'\n\     baseFontColor=\'000000\'\n\
gaugeFillMix=\'{color},{FFFFFF}\' gaugeFillRatio=\'50,50\'>\n\
<colorRange>\n\
    <color minValue=\'0\' maxValue=\'5\' code=\'FF654F\' label=\'z\'/>\n\
    <color minValue=\'5\' maxValue=\'15\' code=\'F6BD0F\' label=\'x\'/>\n\
</colorRange>\n\
</chart>");
myChart.render("chart3");
}
</script> ';

echo $html;

?>

Ответы [ 6 ]

2 голосов
/ 24 июля 2010

Для начала вы определяете событие window.onload ПОСЛЕ страницы, загруженной - к тому времени, когда пользователь нажмет кнопку, это событие уже давно будет запущено

Если вы используете jQuery, измените window.onload = function start() на $(document).ready(function(), затем добавьте ");" в конце функции.

Для прототипа используйте document.observe("dom:loaded", function()

Хотя, возможно, имеет смысл просто вызвать функцию или даже просто удалить функцию и выполнить операторы прямо

Что касается JS, не выполняющегося - я уже сталкивался с этим недоразумением, потому что innerHTML не запускает вставленный JS. Если вы используете jQuery, попробуйте $('ajax').append(xmlhttp.responseText) или Element.insert($('ajax'), xmlhttp.responseText) для Prototype.

Несмотря на то, что вы сами реализовали вызов AJAX, вы, вероятно, не используете никаких библиотек. В этом случае было бы проще заставить ваш PHP-файл возвращать только JS без тегов, тогда просто eval(xmlhttp.responseText)

Если вы не хотите этого делать, вам нужно будет просмотреть все теги сценария в ответе X (HT) ML и проверить их содержимое «вручную»

0 голосов
/ 27 июля 2010

Единственный способ сделать это, так или иначе, eval() с помощью скрипта, который вы загружаете через AJAX, в вызове AJAX. Скрипты, как правило, оцениваются только в том случае, если они находятся на странице загрузки, а новое содержимое, загружаемое через DOM / AJAX, не оценивается для скриптов (во-первых, onload () сработал давно), поэтому вам придется вручную вызывать любой скрипты, в которых вы AJAXing.

Как уже упоминалось выше, фреймворки делают это проще - флаг evalScripts в Prototype или просто функция evalScripts действительно хороши для этого, как мне кажется, и jQuery live () или getScript также являются опцией.

Если вы не используете платформу, вам придется делать это вручную, вызывая eval() в сценарии, который вы пытаетесь загрузить через AJAX. Итак, ваш код будет выглядеть примерно так:

xmlhttp.onreadystatechange=function()
{
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        document.getElementById("ajax").innerHTML=xmlhttp.responseText;
        eval(xmlhttp.responseText);

    }
}

Возможно, вам даже не понадобится устанавливать innerHTML, если Javascript - это все, для чего вы его используете. Предупреждение: использование eval() должно, как правило, насторожить вас из-за возможности инъекционных атак. Приведенные выше фреймворки выполняют некоторые проверки безопасности и безопасности для более безопасного выполнения сценариев, но это все еще рискованное предложение.

Если вы можете, вы должны переписать свой код, чтобы AJAX возвращал JSON или какую-либо другую структуру данных, и переместить фактический javascript в функцию получения (куда я вставил eval() выше), чтобы избежать таких рисков. В вашем коде, в зависимости от , почему вам нужен Javascript в другом файле, вы, вероятно, могли бы легко передать параметры, для которых вы генерируете скрипт, в массиве JSON, и вызвать new FusionCharts() и mychart.render() внутри вашего вызова AJAX. Это будет выглядеть примерно так:

xmlhttp.onreadystatechange=function()
{
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        document.getElementById("ajax").innerHTML=xmlhttp.responseText;
        cd = JSON.parse(xmlhttp.responseText);
        var myChart = new FusionCharts(cd.chartPath, cd.chartID, cd.chartWidth, cd.chartHeight, 0, 0);
        myChart.setDataXML(cd.dataXML);
        myChart.render(cd.chartID);
    }
}

Ваш AJAX вернулся:

{
  chartPath: "../Charts/HLinearGauge.swf",
  chartID: "chart3",
  chartWidth: "580",
  chartHeight: "80",
  dataXML: "<chart bgColor=\'FBFBFB\' bgAlpha=\'100\' showBorder=\'0\' chartTopMargin=\'0\' chartBottomMargin=\'0\'\n\ upperLimit=\'30\' lowerLimit=\'0\' ticksBelowGauge=\'1\' tickMarkDistance=\'3\' valuePadding=\'-2\' pointerRadius=\'5\'\n\ majorTMColor=\'000000\' majorTMNumber=\'3\' minorTMNumber=\'4\' minorTMHeight=\'4\' majorTMHeight=\'8\' showShadow=\'0\'\n\ pointerBgColor=\'FFFFFF\' pointerBorderColor=\'000000\' gaugeBorderThickness=\'3\'\n\     baseFontColor=\'000000\'\n\ gaugeFillMix=\'{color},{FFFFFF}\' gaugeFillRatio=\'50,50\'>\n\ <colorRange>\n\     <color minValue=\'0\' maxValue=\'5\' code=\'FF654F\' label=\'z\'/>\n\     <color minValue=\'5\' maxValue=\'15\' code=\'F6BD0F\' label=\'x\'/>\n\ </colorRange>\n\ </chart>"
}
0 голосов
/ 25 июля 2010

Попробуйте использовать jquery.live ()

0 голосов
/ 25 июля 2010

Весь этот javascript, который вы имеете в PHP-файле, вам нужно поместить в html-файл. Ну, я бы так сделал, по крайней мере. В противном случае вам придется использовать функцию live () jQuery для вызова тех функций javascript, которые есть в файле PHP.

Например, ваш тег скрипта в html-файле должен выглядеть следующим образом

<script type="text/javascript">
function Function4PHPHTML() {
var myChart = new FusionCharts("../Charts/HLinearGauge.swf", "chart3", "580", "80", "0", "0");
myChart.setDataXML("<chart bgColor='FBFBFB' bgAlpha='100' showBorder='0' chartTopMargin='0' chartBottomMargin='0'\n
upperLimit='30' lowerLimit='0' ticksBelowGauge='1' tickMarkDistance='3' valuePadding='-2' pointerRadius='5'\n
majorTMColor='000000' majorTMNumber='3' minorTMNumber='4' minorTMHeight='4' majorTMHeight='8' showShadow='0'\n
pointerBgColor='FFFFFF' pointerBorderColor='000000' gaugeBorderThickness='3'\n    baseFontColor='000000'\n
gaugeFillMix='{color},{FFFFFF}' gaugeFillRatio='50,50'>\n
<colorRange>\n
    <color minValue='0' maxValue='5' code='FF654F' label='z'/>\n
    <color minValue='5' maxValue='15' code='F6BD0F' label='x'/>\n
</colorRange>\n
</chart>");
myChart.render("chart3");
}
function loadXMLDoc()
{
    if (window.XMLHttpRequest)
    {
         xmlhttp=new XMLHttpRequest();
    }
    else
    {
         xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            document.getElementById("ajax").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("POST","test.php",true);
    xmlhttp.send();
}
</script>

Затем у вас есть AJAX, извлекайте только HTML из этого PHP-файла ... Так что после того, как вы нажмете на этот DIV и заполните все, у вас уже будет готов существующий Javascript для нового HTML.

0 голосов
/ 22 июля 2010

Вам, вероятно, придется вызывать нужную функцию, то есть onClick, вручную после установки innerHTML.

0 голосов
/ 22 июля 2010

Использование фреймворков Javascript значительно упрощает работу. Например, если вы используете jQuery, вы можете делать то, что вы хотите следующим образом:

$.getScript("test.php");

Это дает вам некоторые преимущества ... например, вам не придется беспокоиться о проблемах с утечками памяти в IE. Он будет работать в большинстве веб-браузеров и облегчит чтение вашего кода.

...