试图从PHP脚本中访问外部JavaScript函数


Trying to access an external JavaScript function from within a PHP script

重新表述之前关于从PHP脚本中访问外部JavaScript函数的PHP/JavaScript问题。

我试图访问一个JavaScript函数MyJsFnct,这是MyPhp.php PHP脚本的MyJs.js JavaScript文件的一部分。

我使用的是Windows7, Internet Explorer 11.0.9600和XAMPP-V3.2.1与PHP-5.5.9。

我的Web根目录是C:'Apache-Php-MySql'htdocs

MyPhp.phpMyJs.jsC:'Apache-Php-MySql'htdocs'My-Php-Scripts中。

这是MyPhp.phpMyJs.js的框架,其中包含JavaScript函数MyJsFnct

注意MyPhp.phpMyJs.js是一个非常大的PHP/JavaScript项目的一部分,包含数百行代码。我把问题缩小到只有不能工作的代码。由于框架代码是一个更大项目的一部分,所以我不能仅仅用HTML代码替换PHP代码,或者用按钮替换链接。我需要找出为什么PHP代码不能访问JavaScript函数。

实际项目摘自PHP和MySQL for Dynamic Web Sites, 4th edition, by Larry Ullman, chapter 11,"PHP和JavaScript"

MyPhp.php

<!DOCTYPE html> 
<html lang ="en">
<head> 
<title>Page-Php-Js</title>
<meta http   equiv="content-type"   content ="text/html;   charset=UTF-8" /> 
<script type="text/javascript"  charset="utf-8"   src="MyJs.js"> </script>
</head>
<body> 
<?php 
print  "<a href='"javascript:MyJsFnct()'">Click</a> to call JS function (MyJsFnct)";
?> 
</body>
</html>

MyJs.js

function MyJsFnct() { 
    /* some code that lets me know that
       the JavaScript function has been called */
}

相关问题,是否有一种方法来确定哪个JavaScript函数已被调用?

当使用调试器(F12开发人员工具)时,PHP页面看起来与0错误,警告或消息,但当我单击JavaScript链接时,我得到以下错误:'MyJsFnct' is undefined .

这不是你希望得到的答案,但是:你做的事情真的错了,这将有希望帮助你至少让事情更接近正确。

第一步是知道PHP在哪里运行,JavaScript在哪里运行,以及HTML应该是什么样子。

根据您所展示的,您没有使用实际的PHP代码,所以我们不需要任何类型的<?php ... ?>标记和字符串转义。任何地方。

你真正需要的是一个普通的index.php文件,无论如何,它就是html:

<!doctype html> 
<html lang ="en">
  <head> 
    <title>Page-Php-Js</title>
    <meta charset="utf-8">
    <script src="MyJs.js"></script>
  </head>
  <body> 
    <button onclick="MyJsFnct()">Click</button>
  </body>
</html>

这里没有PHP代码,因为没有使用任何PHP代码。请求index.php将直接通过。还要注意,这是适当的HTML5,不像您的源代码:<meta>有一个字符集属性,您使用的格式是HTML 4.01。如果你说你使用的是HTML 4.01,那也没关系,但是<!doctype html>指令明确地告诉浏览器"这是HTML5!"此外,meta并不关闭/><script>元素不需要javascript的type(也不需要css的<style>元素)。

您还使用了<a>,如果它是一个按钮-有一个<button>元素,所以使用它代替。只有当您实际上链接到另一个资源(URL或#FragmentIdentifier)时才使用<a>。如果你不想让它看起来像一个按钮,那是无关紧要的:它是关于语义角色的。如果你可以点击它,让JS做一些事情,它是一个<button>,然后你使用一些CSS使它看起来无论你需要(包括纯文本)。按钮样式只是一些创造性的背景/前景/边框颜色由浏览器和完全可重写)。

现在,PHP将不执行。它运行在服务器上,根据别人的浏览器的请求生成你的内容。它被转移了,PHP死了。实际上,它的进程被杀死,服务器现在等待更多的新请求。如果这些是针对PHP文件的,它将再次启动PHP,一旦生成数据请求,PHP将再次停止运行。

所以它发送的页面不再受PHP控制:它现在存在于浏览器中,"客户端",在任何请求URL的计算机上。这可能是你,在同一台运行PHP的计算机上,但就"什么控制数据"而言,这并不重要:PHP死了,你的浏览器拿走了数据。现在我们进入了HTML+ javascript的领域。

所以,修复你的JavaScript: 不要使用document.write 。这是一个古老的,过时的JS调用,绝对不会做你认为它做的事情。如果您认为它将数据写入页面,那么您可以对告诉您使用它的人大喊大叫:这不是它的功能。它实际做的是将数据泵入活动数据流,如果没有活动数据流,则生成一个新的数据流,供浏览器使用。这意味着,如果您在页面加载后的任何时间调用它,它将擦除整个页面,并启动一个新的写流供浏览器解码。您的页面将消失。这是一个很糟糕的函数,你永远不应该使用它。 (有些时候你确实想使用它。这种情况非常罕见,而且通常非常低级,几乎总是与作为文件系统或流解释器在浏览器上工作有关。即使这样,这也是个坏主意)

你真正想要的是DOM操作。所以用这个代替MyJs.js:

function MyJsFnct() { 
  document.write ("Now inside JS function (MyJsFnct)</br></br>");
} 

你实际上想要这个:

function MyJsFnct() { 
  var p = document.createElement("p");
  p.textContent = "This paragraph was written by my JavaScript function";
  document.body.appendChild(p);
}

以正确的方式构建一个新段落,分配一些文本内容(如果没有HTML,不要试图使用innerHTML)。如果有HTML,您可能会不知不觉地陷入潜在的漏洞中)。然后这一段被添加到页面的末尾。做。

最后,不要使用<br>元素。这是从我们没有非常有用的CSS时遗留下来的,我们需要特殊的元素来添加垂直间距。我们现在用CSS来做这件事,<br>就是当你需要一个语义换行符的时候用的。所以不是视觉上的,而是当机器阅读器应该看到一行必须提前终止并出于某种原因恢复下一行时。一般情况下,没有这样的原因。