簡體   English   中英

嘗試從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.js位於C:\\Apache-Php-MySql\\htdocs\\My-Php-Scripts

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

注意MyPhp.phpMyJs.js是一個非常大的PHP / JavaScript項目的一部分,該項目包含數百行代碼。 我將問題縮小為無法正常工作的代碼。 由於骨架代碼是更大項目的一部分,因此我不能只用HTML代碼替換PHP代碼,也不用按鈕替換鏈接。 我需要找出為什么PHP代碼無法訪問JavaScript函數的原因。

實際項目取材於Larry Ullman的第4版動態網站的PHP和MySQL,第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>具有charset屬性,您使用的格式為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>非常適合需要語義換行的情況。 因此,這不是視覺上的問題,而是機器讀取器應看到某行必須盡早終止並出於任何原因而恢復下一行的情況。 在正常情況下,沒有這種原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM