Como chamar uma função JavaScript do PHP?

202

Como chamar uma função JavaScript do PHP?

<?php

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

O código a seguir é de xyz.html (em um clique de botão) que chama a wait()em um xyz.js externo . Isso wait()chama 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;
  }
}

e wait.php

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

onde loadxml()chama o código de outro arquivo PHP da mesma maneira.

A loadxml()está funcionando bem de outra forma, mas não está sendo chamado o jeito que eu quero.

Zeeshan Rang
fonte
1
Também o meu javascript e php são externos.
Zeeshan Rang

Respostas:

362

No que diz respeito ao PHP (ou realmente, um servidor web em geral), uma página HTML não é nada mais complicada do que uma grande string.

Todo o trabalho sofisticado que você pode fazer com linguagens como PHP - lendo bancos de dados e serviços da Web e tudo mais - o objetivo final final é exatamente o mesmo princípio básico: gerar uma sequência de HTML *.

Sua grande string HTML não se torna nada mais especial do que isso até ser carregada por um navegador da web. Uma vez que um navegador carrega a página, em seguida, todos os outros mágica acontece - o layout, material de modelo de caixa, geração DOM, e muitas outras coisas, incluindo a execução de JavaScript.

Portanto, você não "chama JavaScript do PHP", "inclui uma chamada de função JavaScript na sua saída".

Existem muitas maneiras de fazer isso, mas aqui estão algumas.

Usando apenas PHP:

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

Escapando do modo php para o modo de saída direta:

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

Você não precisa retornar um nome de função ou algo assim. Antes de tudo, pare de escrever solicitações AJAX manualmente. Você só está dificultando a si mesmo. Obtenha o jQuery ou um dos outros excelentes frameworks existentes.

Em segundo lugar, entenda que você já estará executando o código javascript assim que a resposta for recebida da chamada AJAX.

Aqui está um exemplo do que eu acho que você está fazendo com o AJAX do 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
}

Agora, se você está decidido a enviar um nome de função do PHP de volta para a chamada AJAX, você também pode fazer isso.

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

* Ou JSON ou XML etc.

Peter Bailey
fonte
2
Há também, obviamente, a opção de vincular um arquivo javascript externo que faz a chamada em si ... Dessa forma, você mantém o JavaScript onde ele pertence, no código JavaScript. =)
PatrikAkerstrand
isto não está a funcionar. Eu tentei os dois. o seguinte do meu programa é, de .html (no clique do botão), ele passa para uma função .js externa que carrega um arquivo php (usando xmlhttp = GetXmlHttpObject (); var url = "phpwithmysqlwait.php"; xmlhttp.onreadystatechange = statechanged ; xmlhttp.open ("GET", url, true); xmlhttp.send (null);) e meu php call <? php echo "<script> loadxml (); </script>"; ?> onde loadxml chama outro php da mesma maneira. O loadxml () está funcionando bem, caso contrário, mas não está sendo chamado da maneira que eu quero. você pode por favor sugerir somthing
Zeeshan Rang
9
Esse cara deixou tudo o que tenho feito até agora tão claro.
Kacy
4
@ PeterBailey A maioria das pessoas geralmente insulta a pessoa por fazer essa pergunta e deixa por isso mesmo. Você realmente me deu uma ajuda realmente construtiva. então obrigado :)
Gideon Sassoon
2
@NilsSens Obrigado pela sua pergunta. Você ainda entende mal algo fundamental aqui. PHP e javascript do lado do cliente não interagem diretamente entre si. HTTP está sempre no meio. Mesmo com solicitações do Ajax, esse é o caso. Para reiterar o que escrevi há mais de 7 anos na minha resposta original: ao funcionar como um servidor de aplicativos da web, tudo o que o PHP está fazendo é gerar uma string de HTML, que pode ou não incluir javascript.
Peter Bailey
86

Eu sempre uso echo "<script> function(); </script>";ou algo parecido. você não está tecnicamente chamando a função em PHP, mas isso é o mais próximo que você pode chegar.

GSto
fonte
13
Apenas certifique-se de colocar a função javascript antes do script ecoado, ou ela não pode ser chamada.
Nurp
Podemos retornar a saída de echopara uma variável in PHP?
alper
52

Por enquanto (fevereiro de 2012), há um novo recurso para isso. Confira aqui

Exemplo de código (retirado da 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);
}

?>
bertzzie
fonte
Isso pode não se encaixar exatamente no caso de uso da pergunta original, mas seguindo o título da pergunta, essa resposta deve ter muito mais votos.
22915 Chris Schmitz
4
Esteja ciente de que isso requer a instalação da extensão V8Js na sua instalação do PHP.
Velojet
11

Você não pode. Você pode chamar uma função JS do HTML gerado pelo PHP, mas isso é algo totalmente diferente.

Matthew Flaschen
fonte
bem, eu sou capaz de chamar uma função JS como esta: echo "<td onClick = loadxml ()> <i> Clique para obter detalhes </i> </td>"; .... mas eu não quero clicar em nada agora . Eu só quero o meu php chamar uma função JS com qualquer evento.
Zeeshan Rang
2
Esse exemplo está usando um evento click em HTML, não em php. JavaScript é do lado do cliente e php é do lado do servidor. Você não pode chamar diretamente JavaScript com PHP.
MrChrister
7

Isso não é possível. PHP é uma linguagem do lado do servidor e do lado do JavaScript e eles realmente não sabem muito um do outro. Você precisaria de um interpretador de JavaScript do servidor (como Aptanas Jaxer). Talvez o que você realmente queira fazer seja usar um Ajax como Architecture (a função JavaScript chama o script PHP de forma assíncrona e faz algo com o resultado).

<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\"";
?>
Daff
fonte
7

Se você quiser repetir para execução posterior, tudo bem

Se você deseja executar o JS e usar os resultados no PHP, use 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"); }');

Você pode consultar aqui para referência adicional: O que são extensões no php v8js?

Se você deseja executar HTML & JS e usar a saída em PHP http://htmlunit.sourceforge.net/ é a sua solução

Pian0_M4n
fonte
3

O PHP é executado no servidor. JavaScript é executado no cliente. Portanto, o php não pode chamar uma função JavaScript.

Daniel Moura
fonte
11
A rigor, isso não é verdade. Há também JavaScript do lado do servidor e, teoricamente, você poderia ter o PHP e o JavaScript em execução em um servidor e se chamando. Na prática, é ou é claro um cenário muito improvável.
Michael Borgwardt
2

você pode tentar este também: -

    public function PHPFunction()
    {
            echo '<script type="text/javascript">
                 test();
            </script>'; 
    }
    <script type="text/javascript">
    public function test()
    {
        alert('In test Function');
    }
    </script>
umesh
fonte
-1, pois isso não funcionará. Você está chamando e definindo essas funções de elevação em dois blocos separados. Leia isto e isto
Siraj Alam
2

tente assim

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

Talvez você não consiga fazer isso diretamente, mas a biblioteca Xajax está bem próxima do que você deseja. Vou demonstrar com um exemplo. Aqui está um botão em uma página da web:

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

Nosso palpite intuitivo seria que xajax_addCity()é uma função Javascript, certo? Bem, certo e errado. O legal do Xajax é que não temos nenhuma função JS chamada xajax_addCity(), mas o que temos é uma função PHP chamada addCity()que pode fazer o que o PHP faz!

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

Pense sobre isso por um minuto. Estamos praticamente invocando uma função PHP a partir do código Javascript! Esse exemplo simplificado foi apenas para aguçar o apetite, uma explicação melhor está no site do Xajax, divirta-se!

Hamman Samuel
fonte