Единственный способ сделать это, так или иначе, 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>"
}