Làm thế nào để gọi một hàm JavaScript từ PHP?


202

Làm thế nào để gọi một hàm JavaScript từ PHP?

<?php

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

Đoạn mã sau là từ xyz.html (trên một nút bấm), nó gọi a wait()trong xyz.js bên ngoài . Cuộc wait()gọi này chờ Wait.php.

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;
  }
}

chờ đợi.php

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

nơi loadxml()gọi mã từ một tệp PHP khác theo cùng một cách.

Nó hoạt loadxml()động tốt, nhưng nó không được gọi theo cách tôi muốn.


1
Ngoài ra javascript và php của tôi là bên ngoài.
Zeeshan Rang

Câu trả lời:


362

Theo như PHP có liên quan (hay thực sự là một máy chủ web nói chung), một trang HTML không có gì phức tạp hơn một chuỗi lớn.

Tất cả công việc ưa thích bạn có thể làm với ngôn ngữ như PHP - đọc từ cơ sở dữ liệu và dịch vụ web và tất cả những thứ đó - mục tiêu cuối cùng là nguyên tắc cơ bản chính xác giống nhau: tạo ra một chuỗi HTML *.

Chuỗi HTML lớn của bạn không trở nên đặc biệt hơn thế cho đến khi được trình duyệt web tải. Khi một trình duyệt tải trang, thì tất cả các phép thuật khác sẽ xảy ra - bố cục, công cụ mô hình hộp, tạo DOM và nhiều thứ khác, bao gồm thực thi JavaScript.

Vì vậy, bạn không "gọi JavaScript từ PHP", bạn "bao gồm một lệnh gọi hàm JavaScript trong đầu ra của bạn".

Có nhiều cách để làm điều này, nhưng đây là một cặp vợ chồng.

Chỉ sử dụng PHP:

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

Thoát khỏi chế độ php sang chế độ đầu ra trực tiếp:

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

Bạn không cần phải trả lại tên hàm hoặc bất cứ thứ gì tương tự. Trước hết, ngừng viết yêu cầu AJAX bằng tay. Bạn chỉ làm khó chính mình. Nhận jQuery hoặc một trong những khung công tác xuất sắc khác.

Thứ hai, hiểu rằng bạn đã thực thi mã javascript sau khi nhận được phản hồi từ cuộc gọi AJAX.

Đây là một ví dụ về những gì tôi nghĩ bạn đang làm với AJAX của 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
}

Bây giờ, nếu bạn đã chết khi gửi tên hàm từ PHP trở lại cuộc gọi AJAX, bạn cũng có thể làm điều đó.

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

* Hoặc JSON hoặc XML, v.v.


2
Ngoài ra còn có tùy chọn liên kết trong một tệp javascript bên ngoài thực hiện cuộc gọi đó ... Bằng cách đó, bạn giữ JavaScript ở nơi nó thuộc về, trong mã JavaScript. =)
PatrikAkerstrand

đây không phải là làm việc. tôi đã thử cả hai. Phần tiếp theo của chương trình của tôi là, từ .html (nhấp vào nút), nó chuyển đến một hàm .js bên ngoài tải tệp php (sử dụng xmlhttp = GetXmlHttpObject (); var url = "phpwithmysqlwait.php"; xmlhttp.onreadystatechange ; xmlhttp.open ("GET", url, true); xmlhttp.send (null);) và cuộc gọi php của tôi <? php echo "<script> loadxml (); </ script>"; ?> nơi loadxml gọi một php khác theo cùng một cách. Loadxml () đang hoạt động tốt, nhưng nó không được gọi theo cách tôi muốn. bạn có thể vui lòng đề nghị một cái gì đó không
Zeeshan Rang

9
Anh chàng này đã làm mọi thứ tôi đang làm cho đến bây giờ rất rõ ràng.
Kacy

4
@PeterBailey Hầu hết mọi người thường xúc phạm người đó khi thực hiện yêu cầu này và để nó ở đó. Bạn thực sự đã cho tôi sự giúp đỡ thực sự mang tính xây dựng. cảm ơn bạn rất nhiều :)
Gideon Sassoon

2
@NilsSens Cảm ơn câu hỏi của bạn. Bạn vẫn hiểu sai một cái gì đó cơ bản ở đây. PHP và javascript phía máy khách không tương tác trực tiếp với nhau. HTTP luôn ở giữa. Ngay cả với các yêu cầu Ajax là trường hợp. Để nhắc lại những gì tôi đã viết hơn 7 năm trước trong câu trả lời ban đầu của tôi: khi hoạt động như một máy chủ ứng dụng web, tất cả PHP đang làm là tạo ra một chuỗi HTML, có thể bao gồm hoặc không bao gồm javascript.
Peter Bailey

86

Tôi luôn luôn chỉ sử dụng echo "<script> function(); </script>";hoặc một cái gì đó tương tự. Về mặt kỹ thuật, bạn không gọi hàm trong PHP, nhưng điều này gần như bạn sẽ nhận được.


13
Chỉ cần đảm bảo đặt chức năng javascript trước tập lệnh được lặp lại hoặc không thể gọi nó.
Nurp

Chúng ta có thể trả lại đầu ra của echomột biến trong PHPkhông?
alper

52

Cho đến bây giờ (tháng 2 năm 2012) có một tính năng mới cho việc này. Kiểm tra tại đây

Mẫu mã (lấy từ web):

<?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);
}

?>

Điều này có thể không phù hợp chính xác với trường hợp sử dụng của câu hỏi ban đầu, nhưng đi theo tiêu đề câu hỏi, câu trả lời này sẽ có nhiều phiếu hơn.
Chris Schmitz

4
Chỉ cần lưu ý rằng điều này yêu cầu cài đặt phần mở rộng V8Js để cài đặt PHP của bạn.
Velojet

11

Bạn không thể. Bạn có thể gọi một hàm JS từ HTML outputted bởi PHP, nhưng đó là một tổng thể 'Nother điều.


tôi cũng có thể gọi một hàm JS như thế này: echo "<td onClick = loadxml ()> <i> Nhấp để biết chi tiết </ i> </ td>"; .... nhưng tôi không muốn nhấp vào bất cứ điều gì ngay bây giờ . tôi chỉ muốn php của tôi gọi một hàm JS với bất kỳ sự kiện nào.
Zeeshan Rang

2
Ví dụ đó là sử dụng một sự kiện nhấp chuột trong HTML, không phải php. JavaScript là phía máy khách và php là phía máy chủ. Bạn không thể gọi trực tiếp JavaScript bằng PHP.
MrChrister

7

Đó là không thể. PHP là ngôn ngữ phía Máy chủ và phía máy khách JavaScript và họ không thực sự biết nhiều về nhau. Bạn sẽ cần một Trình thông dịch JavaScript phía máy chủ (như Aptanas Jaxer). Có lẽ những gì bạn thực sự muốn làm là sử dụng Ajax như Architecture (hàm JavaScript gọi tập lệnh PHP không đồng bộ và thực hiện một cái gì đó với kết quả).

<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

Nếu bạn muốn lặp lại để thực hiện sau thì không sao

Nếu bạn muốn thực thi JS và sử dụng các kết quả trong PHP, hãy sử dụng 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"); }');

Bạn có thể tham khảo tại đây để tham khảo thêm: Phần mở rộng trong php v8js là gì?

Nếu bạn muốn thực thi HTML & JS và sử dụng đầu ra trong PHP http://htmlunit.sourceforge.net/ là giải pháp của bạn


3

PHP chạy trong máy chủ. JavaScript chạy trong máy khách. Vì vậy, php không thể gọi hàm JavaScript.


11
Nói đúng ra, điều đó không đúng. Ngoài ra còn có JavaScript phía máy chủ và về mặt lý thuyết bạn có thể chạy cả PHP và JavaScript trên máy chủ và gọi cho nhau. Trong thực tế, đó là một kịch bản rất khó xảy ra.
Michael Borgwardt

2

bạn cũng có thể thử cái này: -

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

-1 vì điều này sẽ không hoạt động. Bạn đang gọi và xác định các chức năng cẩu này trong hai khối riêng biệt. Đọc cái nàycái này
Siraj Alam

2

thử như thế này

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

1

Bạn có thể không thể trực tiếp làm điều này, nhưng thư viện Xajax khá gần với những gì bạn muốn. Tôi sẽ chứng minh bằng một ví dụ. Đây là một nút trên trang web:

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

Dự đoán trực quan của chúng tôi sẽ xajax_addCity()là một chức năng Javascript, phải không? Vâng, đúng và sai. Điều thú vị mà Xajax cho phép là chúng ta không có bất kỳ hàm JS nào được gọi xajax_addCity(), nhưng cái chúng ta có là một hàm PHP addCity()có thể làm bất cứ điều gì PHP làm!

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

Hãy suy nghĩ về nó trong một phút. Chúng tôi hầu như đang gọi một hàm PHP từ mã Javascript! Ví dụ đơn giản hóa quá mức đó chỉ là để kích thích sự thèm ăn, một lời giải thích tốt hơn là trên trang web Xajax, hãy vui vẻ!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.