好的,所以这应该很容易吧?测试.php:
function some_javascript() {
echo "Hello";
echo "<script type='text/javascript'>alert('Hello')<script>";
}
当您尝试加载测试时,您将收到一个警报窗口.php。
我一定错过了一些东西,因为我无法使用模态窗口作为目标并通过 post 进行 AJAX 请求来使其工作。
以下是我正在尝试执行的操作的基本结构:
索引.html:
<html>
<head>
<style>
#modal {
visibility:hidden;
}
</style>
</head>
<body>
<div id="modal">
</div>
<button onclick="call_ajax();">Call Ajax</button>
</body>
</html>
call_ajax() 将模态可见性设置为"可见",将其 innerHTML 设置为来自 test.php 的响应文本(我不写代码,因为我在这里似乎没有问题;文本发送得很好(我得到"hello"),发送的帖子数据根据需要进行处理)。但是没有警报窗口!相反,我得到"警报('你好')"。
除此之外,代码工作正常,但我无法让 javascript 工作。一定有一些细节我错过了。有什么想法吗????
您不能通过innerHTML
添加标签来运行<script>
标签。看到这个问题:脚本可以用innerHTML插入吗?
echo "<script type='text/javascript'>alert('Hello')<script>";
应该是
echo "<script type='text/javascript'>alert('Hello')</script>";
另外,正如有人在我下面发布的那样,脚本不能以这种方式运行。
首先,脚本代码不能作为 HTML 插入,它会这样显示(它确实如此)。
其次,即使您在文档中插入 SCRIPT 元素,初始分析也已完成,并且不会执行警报。
您可以做的是解析脚本代码并对其进行评估:
<!DOCTYPE html>
<html>
<head>
<style>
#modal {
visibility:hidden;
}
</style>
<script type="text/javascript">
function call_ajax() {
var ajaxData = "Hello'n<script type='text/javascript'>alert('Hello')<'/script>";
var scriptStartPos = ajaxData.indexOf("<script type='text/javascript'>");
if(scriptStartPos >= 0) {
var scriptPos0=scriptStartPos+31;
var scriptEndPos= ajaxData.indexOf("<'/script>", scriptPos0);
if(scriptEndPos >= scriptPos0) {
eval(ajaxData.substring(scriptPos0,scriptEndPos));
}
}
}
</script>
</head>
<body>
<div id="modal">
</div>
<button onclick="call_ajax();">Call Ajax</button>
</body>
</html>
请注意,在这种情况下我使用了未转义的单引号。
基本上Ajax Request
不会加载Javascript
代码。
我正在使用这样的东西来让Javascript
代码从 ajax 的responseText
工作;
Javascript :
//pseudo function :
function call_ajax() {
var ajaxResponse = "some data you have received with ajax";
var div = document.createElement("div");
div.innerHTML = ajaxResponse;
var script = div.getElementsByTagName("script");
for(var i=0; i < script.length; i++) {
try{eval(script[i].innerHTML)}catch(ex){alert(ex)};
}
};
此代码将创建一个空白div
元素,其中innerHTML
将使用 ajax 加载数据。Javascript 会将你的简单文本转换为 html 节点,然后你可以通过查找"script"标签来查找响应是否包含Javascript
代码,然后只需尝试评估javascript
代码来执行代码,现在你就完成了。
PS:在我看来,用ajax加载javascript不是一个好主意。看看如果你对同一个javascript代码做两个ajax请求会怎样:它将加载相同的代码两次,所以代码可能会因此而变得有问题。
有很多Javascript库可以为你做到这一点。
尝试延迟加载:https://github.com/rgrove/lazyload