จะเรียกใช้ฟังก์ชัน JavaScript จาก PHP ได้อย่างไร


202

จะเรียกใช้ฟังก์ชัน JavaScript จาก PHP ได้อย่างไร

<?php

  jsfunction();
  // or
  echo(jsfunction());
  // or
  // Anything else?

รหัสต่อไปนี้จากxyz.html (ที่ปุ่มคลิก) มันเรียกwait()ในภายนอกxyz.js wait()สายนี้จะรอ

function wait() 
{
  xmlhttp=GetXmlHttpObject();
  var url="wait.php"; \
  xmlhttp.onreadystatechange=statechanged; 
  xmlhttp.open("GET", url, true); 
  xmlhttp.send(null);
} 

function statechanged()
{ 
  if(xmlhttp.readyState==4) {
       document.getElementById("txt").innerHTML=xmlhttp.responseText;
  }
}

และwait.php

<?php echo "<script> loadxml(); </script>"; 

โดยที่จะloadxml()เรียกรหัสจากไฟล์ PHP อื่นด้วยวิธีเดียวกัน

loadxml()จะปรับการทำงานอย่างอื่น แต่มันไม่ได้ถูกเรียกว่าวิธีการที่ฉันต้องการ


1
จาวาสคริปต์และ php ของฉันก็เป็นสิ่งภายนอกเช่นกัน
Zeeshan Rang

คำตอบ:


362

เท่าที่ PHP มีความกังวล (หรือจริงๆแล้วเว็บเซิร์ฟเวอร์โดยทั่วไป) หน้า HTML ไม่มีอะไรซับซ้อนกว่าสตริงขนาดใหญ่

งานแฟนซีทั้งหมดที่คุณสามารถทำได้กับภาษาเช่น PHP - การอ่านจากฐานข้อมูลและบริการบนเว็บและสิ่งสุดท้าย - เป้าหมายสุดท้ายคือหลักการพื้นฐานเดียวกันที่แน่นอน: สร้างสตริงของ HTML *

สตริง HTML ขนาดใหญ่ของคุณจะไม่กลายเป็นอะไรที่พิเศษไปกว่านั้นจนกว่ามันจะถูกโหลดโดยเว็บเบราว์เซอร์ เมื่อเบราว์เซอร์โหลดหน้าเว็บแล้วสิ่งมหัศจรรย์อื่น ๆ ก็เกิดขึ้นเช่นเลย์เอาต์สิ่งที่เป็นโมเดลของกล่องการสร้าง DOM และสิ่งอื่น ๆ อีกมากมายรวมถึงการใช้ JavaScript

ดังนั้นคุณไม่ "เรียก JavaScript จาก PHP" คุณ "รวมการเรียกใช้ฟังก์ชัน JavaScript ในผลลัพธ์ของคุณ"

มีหลายวิธีในการทำเช่นนี้ แต่ที่นี่เป็นคู่

ใช้เพียง PHP:

echo '<script type="text/javascript">',
     'jsfunction();',
     '</script>'
;

การหลบหนีจากโหมด php ไปยังโหมดเอาต์พุตโดยตรง:

<?php
    // some php stuff
?>
<script type="text/javascript">
    jsFunction();
</script>

คุณไม่จำเป็นต้องส่งคืนชื่อฟังก์ชันหรืออะไรทำนองนั้น ก่อนอื่นให้หยุดเขียนคำขอ AJAX ด้วยมือ คุณแค่ทำให้ตัวเองยาก รับ jQuery หรือหนึ่งในกรอบงานที่ยอดเยี่ยมอื่น ๆ

ประการที่สองเข้าใจว่าคุณกำลังจะเรียกใช้โค้ดจาวาสคริปต์เมื่อได้รับคำตอบจากการโทร AJAX

นี่คือตัวอย่างของสิ่งที่ฉันคิดว่าคุณกำลังทำกับ AJAX ของ jQuery

$.get(
    'wait.php',
    {},
    function(returnedData) {
        document.getElementById("txt").innerHTML = returnedData;

        //  Ok, here's where you can call another function
        someOtherFunctionYouWantToCall();

        // But unless you really need to, you don't have to
        // We're already in the middle of a function execution
        // right here, so you might as well put your code here
    },
    'text'
);

function someOtherFunctionYouWantToCall() {
    // stuff
}

ตอนนี้ถ้าคุณตั้งค่าการส่งชื่อฟังก์ชั่นจาก PHP กลับไปที่การโทร AJAX คุณก็สามารถทำได้เช่นกัน

$.get(
    'wait.php',
    {},
    function(returnedData) {
        // Assumes returnedData has a javascript function name
        window[returnedData]();
    },
    'text'
);

* หรือ JSON หรือ XML เป็นต้น


2
นอกจากนี้ยังมีตัวเลือกในการเชื่อมโยงในไฟล์จาวาสคริปต์ภายนอกที่เรียกตัวเอง ... ในแบบที่คุณเก็บ JavaScript ไว้ในโค้ด JavaScript =)
PatrikAkerstrand

มันไม่ทำงาน ฉันลองทั้งคู่ การติดตามโปรแกรมของฉันคือจาก. html (เมื่อคลิกปุ่ม) มันจะไปยังฟังก์ชัน. js ภายนอกซึ่งโหลดไฟล์ php (โดยใช้ xmlhttp = GetXmlHttpObject (); var url = "phpwithmysqlwait.php"; xmlhttp.onreadystatechange = statechanged ; xmlhttp.open ("GET", url, true); xmlhttp.send (null);) และการเรียก php ของฉัน <? php echo "<script> loadxml (); </script>"; ?> โดยที่ loadxml เรียก php อื่นด้วยวิธีเดียวกัน loadxml () ทำงานได้ดีอย่างอื่น แต่มันไม่ได้ถูกเรียกในแบบที่ฉันต้องการ คุณสามารถโปรดแนะนำ somthing
Zeeshan รัง

9
ผู้ชายคนนี้ทำให้ทุกอย่างที่ฉันทำไปจนถึงตอนนี้ชัดเจนมาก
Kacy

4
@PeterBailey คนส่วนใหญ่มักจะดูถูกคนที่ทำแบบสอบถามนี้และทิ้งไว้ที่ คุณให้ความช่วยเหลือที่สร้างสรรค์กับฉันจริงๆ ขอบคุณมาก :)
Gideon Sassoon

2
@NilsSens ขอบคุณสำหรับคำถามของคุณ คุณยังคงเข้าใจผิดถึงบางสิ่งพื้นฐานที่นี่ PHP และจาวาสคริปต์ฝั่งไคลเอ็นต์จะไม่โต้ตอบกับแต่ละคนโดยตรง HTTP อยู่ตรงกลางเสมอ แม้จะมีการร้องขออาแจ็กซ์ที่เป็นกรณี เพื่อย้ำสิ่งที่ฉันเขียนในตอนนี้เมื่อ 7 ปีก่อนในคำตอบเดิมของฉัน: เมื่อทำงานเป็นเซิร์ฟเวอร์เว็บแอปพลิเคชัน PHP ทั้งหมดกำลังทำคือการสร้างสตริงของ HTML ซึ่งอาจหรือไม่รวมถึงจาวาสคริปต์
Peter Bailey

86

ฉันมักจะใช้ echo "<script> function(); </script>";หรืออะไรที่คล้ายกัน คุณไม่ได้เรียกใช้ฟังก์ชันใน PHP แต่จะใกล้เคียงกับที่คุณจะได้รับ


13
เพียงตรวจสอบให้แน่ใจว่าวางฟังก์ชั่น javascript ไว้ข้างหน้าสคริปต์ echoed หรือไม่สามารถเรียกใช้ได้
Nurp

เราสามารถคืนค่าเอาต์พุตของechoเป็นตัวแปรได้PHPหรือไม่?
alper

52

ต่อตอนนี้ (กุมภาพันธ์ 2555) มีคุณลักษณะใหม่สำหรับสิ่งนี้ ตรวจสอบที่นี่

ตัวอย่างโค้ด (นำมาจากเว็บ):

<?php

$v8 = new V8Js();

/* basic.js */
$JS = <<< EOT
len = print('Hello' + ' ' + 'World!' + "\\n");
len;
EOT;

try {
  var_dump($v8->executeString($JS, 'basic.js'));
} catch (V8JsException $e) {
  var_dump($e);
}

?>

สิ่งนี้อาจไม่เหมาะกับกรณีการใช้งานจริงของคำถาม แต่โดยชื่อคำถามคำตอบนี้ควรมีวิธีโหวตมากกว่า
Chris Schmitz

4
เพิ่งทราบว่าสิ่งนี้ต้องติดตั้งส่วนขยาย V8Js กับการติดตั้ง PHP ของคุณ
Velojet

11

คุณทำไม่ได้ คุณสามารถเรียกฟังก์ชั่น JS จาก HTML ออกมาโดย PHP แต่ที่เป็นทั้ง 'nother สิ่ง


ดีฉันสามารถเรียกใช้ฟังก์ชัน JS เช่นนี้: echo "<td onClick = loadxml ()> <i> คลิกเพื่อดูรายละเอียด </i> </td>"; .... แต่ฉันไม่ต้องการคลิกอะไรเลยตอนนี้ . ฉันแค่ต้องการ php ของฉันเพื่อเรียกใช้ฟังก์ชั่น JS กับเหตุการณ์ใด ๆ
Zeeshan Rang

2
ตัวอย่างนั้นใช้เหตุการณ์การคลิกใน HTML ไม่ใช่ php JavaScript คือฝั่งไคลเอ็นต์และ php คือฝั่งเซิร์ฟเวอร์ คุณไม่สามารถเรียก JavaScript ด้วย PHP ได้โดยตรง
MrChrister

7

มันเป็นไปไม่ได้. PHP เป็นภาษาฝั่งเซิร์ฟเวอร์และฝั่งไคลเอนต์ JavaScript และพวกเขาไม่รู้จักกันมากนัก คุณจะต้องใช้ล่าม JavaScript ฝั่งเซิร์ฟเวอร์ (เช่น Aptanas Jaxer) บางทีสิ่งที่คุณต้องการทำคือใช้ Ajax เช่น Architecture (ฟังก์ชัน JavaScript เรียกใช้สคริปต์ PHP แบบอะซิงโครนัสและทำบางสิ่งกับผลลัพธ์)

<td onClick= loadxml()><i>Click for Details</i></td>

function loadxml()
{
    result = loadScriptWithAjax("/script.php?event=button_clicked");
    alert(result);
}

// script.php
<?php
    if($_GET['event'] == 'button_clicked')
        echo "\"You clicked a button\"";
?>

7

หากคุณต้องการที่จะสะท้อนออกมาสำหรับการดำเนินการในภายหลังก็โอเค

หากคุณต้องการรัน JS และใช้ผลลัพธ์ใน PHP ใช้ V8JS

V8Js::registerExtension('say_hi', 'print("hey from extension! "); var said_hi=true;', array(), true);
$v8 = new V8Js();
$v8->executeString('print("hello from regular code!")', 'test.php');
$v8->executeString('if (said_hi) { print(" extension already said hi"); }');

คุณสามารถอ้างอิงที่นี่สำหรับการอ้างอิงเพิ่มเติม: อะไรคือส่วนขยายใน php v8js?

หากคุณต้องการรัน HTML & JS และใช้เอาต์พุตใน PHP http://htmlunit.sourceforge.net/เป็นวิธีการแก้ปัญหาของคุณ


3

PHP ทำงานในเซิร์ฟเวอร์ JavaScript ทำงานในไคลเอนต์ ดังนั้น php ไม่สามารถเรียกใช้ฟังก์ชัน JavaScript ได้


11
พูดอย่างเคร่งครัดนั่นไม่ใช่ความจริง นอกจากนี้ยังมี JavaScript ฝั่งเซิร์ฟเวอร์และในทางทฤษฎีคุณสามารถให้ทั้ง PHP และ JavaScript ทำงานบนเซิร์ฟเวอร์และโทรหากัน ในทางปฏิบัติมันเป็นหรือแน่นอนสถานการณ์ที่ไม่น่าเป็นไปได้มาก
Michael Borgwardt

2

คุณสามารถลองอันนี้ด้วย: -

    public function PHPFunction()
    {
            echo '<script type="text/javascript">
                 test();
            </script>'; 
    }
    <script type="text/javascript">
    public function test()
    {
        alert('In test Function');
    }
    </script>

-1 เนื่องจากไม่สามารถใช้งานได้ คุณกำลังโทรและกำหนดฟังก์ชั่นรอกเหล่านี้ในสองช่วงตึกแยกกัน อ่านสิ่งนี้และสิ่งนี้
Siraj Alam

2

ลองแบบนี้

<?php
 if(your condition){
     echo "<script> window.onload = function() {
     yourJavascriptFunction(param1, param2);
 }; </script>";
?>

1

คุณอาจไม่สามารถทำสิ่งนี้ได้โดยตรง แต่เป็น ห้องสมุดXajaxค่อนข้างใกล้เคียงกับที่คุณต้องการ ฉันจะสาธิตด้วยตัวอย่าง นี่คือปุ่มบนหน้าเว็บ:

<button onclick="xajax_addCity();">Add New City</button> 

สิ่งที่เราคาดเดาได้ง่ายxajax_addCity()คือฟังก์ชัน Javascript ใช่ไหม? ดีถูกและผิด สิ่งยอดเยี่ยมที่ Xajax อนุญาตคือเราไม่มีฟังก์ชั่น JS ใด ๆ ที่เรียกว่าxajax_addCity()แต่สิ่งที่เราทำมีคือฟังก์ชัน PHP ที่เรียกaddCity()ว่าสามารถทำสิ่งที่ PHP ไม่!

<?php function addCity() { echo "Wow!"; } ?>

ลองคิดดูสักครู่ พวกเราจะเรียกฟังก์ชั่น PHP จากจาวาสคริปต์! ตัวอย่างที่ง่ายเกินไปนั้นเป็นเพียงการกระตุ้นความอยากอาหารคำอธิบายที่ดีกว่านั้นก็คือเว็บไซต์ Xajax ขอให้สนุก!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.