使用 PHP 将 JavaScript 添加到文档中


Adding JavaScript to document with PHP

好的,所以这应该很容易吧?测试.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