简体   繁体   English

如何从.js脚本事件触发PHP函数?

[英]How to trigger an PHP function from an .js script event?

I'm writing an game aplication wich runs in the web browser. 我正在编写一个在网络浏览器中运行的游戏应用程序。 So far I got pretty much everything written in PHP and HTML/CSS. 到目前为止,我几乎已经掌握了用PHP和HTML / CSS编写的所有内容。 My current goal is to trigger an PHP function when a certain Javascript event is being run. 我当前的目标是在运行某个Javascript事件时触发PHP函数。 To be exact, when the (JS)currentTime reaches 0 in demo.js I want to set an php bool to true or directly trigger an php function from class.game.php 确切地说,当demo.js中的(JS)currentTime达到0时,我想将php bool设置为true或直接从class.game.php触发php函数

This is a part of my index.php file where I implement the timer element. 这是我实现timer元素的index.php文件的一部分。

Hello 你好

I'm writing an game aplication wich runs in the web browser. 我正在编写一个在网络浏览器中运行的游戏应用程序。 So far I got pretty much everything written in PHP and HTML/CSS. 到目前为止,我几乎已经掌握了用PHP和HTML / CSS编写的所有内容。 My current goal is to trigger an PHP function when a certain JS event is being run. 我当前的目标是在运行某个JS事件时触发PHP函数。 To be exact, when the (JS)currentTime reaches 0 in demo.js I want to set an php bool to true or directly trigger an php function from class.game.php . 确切地说,当demo.js中的(JS)currentTime达到0时,我想将php bool设置为true或直接从class.game.php触发php函数。 Below I will show you parts of the code. 下面,我将向您展示部分代码。

some includes: 其中包括:

index.php index.php

<script type="text/javascript" src="inc/jquery.min1.js"></script>
<script type="text/javascript" src="inc/jquery.timer.js"></script>
<script type="text/javascript" src="inc/demo.js"></script>

This is a part of my index.php file where I implement the timer element. 这是我实现timer元素的index.php文件的一部分。

index.php index.php

<div id="countdown" style="float: right; margin-top: 60px; margin-right: 30px">01:00:00 </div>

    <form id="example2form" style="float: right; margin-top: 25px;">
        <input type='button' value='Play/Pause' onclick='Example2.Timer.toggle();' />
        <input type='button' value='Stop/Reset' onclick='Example2.resetCountdown();' />
        <input type='text' name='startTime' value='300' style='width:30px;' />
    </form>

this is part of demo.js 这是demo.js的一部分

demo.js demo.js

/**
 * countdown function
 */
var Example2 = new (function() {
    var $countdown,
        $form, // Form used to change the countdown time
        incrementTime = 70,
        currentTime = 1000,
        updateTimer = function() {
            $countdown.html(formatTime(currentTime));
            if (currentTime == 0) {
                Example2.Timer.stop();
                timerComplete();
                Example2.resetCountdown();


                return;
            }
            currentTime -= incrementTime / 10;
            if (currentTime < 0) currentTime = 0;
        },
        timerComplete = function() {
            alert('Example 2: Countdown timer complete!');

        },
        init = function() {
            $countdown = $('#countdown');
            Example2.Timer = $.timer(updateTimer, incrementTime, true);
            $form = $('#example2form');
            $form.bind('submit', function() {
                Example2.resetCountdown();
                return false;
            });
        };
    this.resetCountdown = function() {
        var newTime = parseInt($form.find('input[type=text]').val()) * 100;
        if (newTime > 0) {currentTime = newTime;}
        this.Timer.stop().once();
    };
    $(init);
});

jquery.timer.js jquery.timer.js

;(function($) {
    $.timer = function(func, time, autostart) { 
        this.set = function(func, time, autostart) {
            this.init = true;
            if(typeof func == 'object') {
                var paramList = ['autostart', 'time'];
                for(var arg in paramList) {if(func[paramList[arg]] != undefined) {eval(paramList[arg] + " = func[paramList[arg]]");}};
                func = func.action;
            }
            if(typeof func == 'function') {this.action = func;}
            if(!isNaN(time)) {this.intervalTime = time;}
            if(autostart && !this.isActive) {
                this.isActive = true;
                this.setTimer();
            }
            return this;
        };
        this.once = function(time) {
            var timer = this;
            if(isNaN(time)) {time = 0;}
            window.setTimeout(function() {timer.action();}, time);
            return this;
        };
        this.play = function(reset) {
            if(!this.isActive) {
                if(reset) {this.setTimer();}
                else {this.setTimer(this.remaining);}
                this.isActive = true;
            }
            return this;
        };
        this.pause = function() {
            if(this.isActive) {
                this.isActive = false;
                this.remaining -= new Date() - this.last;
                this.clearTimer();
            }
            return this;
        };
        this.stop = function() {
            this.isActive = false;
            this.remaining = this.intervalTime;
            this.clearTimer();
            return this;
        };
        this.toggle = function(reset) {
            if(this.isActive) {this.pause();}
            else if(reset) {this.play(true);}
            else {this.play();}
            return this;
        };
        this.reset = function() {
            this.isActive = false;
            this.play(true);
            return this;
        };
        this.clearTimer = function() {
            window.clearTimeout(this.timeoutObject);
        };
        this.setTimer = function(time) {
            var timer = this;
            if(typeof this.action != 'function') {return;}
            if(isNaN(time)) {time = this.intervalTime;}
            this.remaining = time;
            this.last = new Date();
            this.clearTimer();
            this.timeoutObject = window.setTimeout(function() {timer.go();}, time);
        };
        this.go = function() {
            if(this.isActive) {
                this.action();
                this.setTimer();
            }
        };

        if(this.init) {
            return new $.timer(func, time, autostart);
        } else {
            this.set(func, time, autostart);
            return this;
        }
    };
})(jQuery);

part of class.game.php class.game.php的一部分

/**
    * Purpose: end the game
    * Preconditions: turns on the game over flag
    * Postconditions: game over flag is true
    **/
    function end()
    {
        $this->over = true;
    }

/**
    * Purpose: return bool to indiciate whether or not the game is over
    * Preconditions: none
    * Postconditions: returns true or flase
    **/
    function isOver()
        {
            if ($this->won)
                return true;

            if ($this->over)
                return true;

            if ($this->health < 0) 
                return true;

            return false;
        }

when 什么时候

timerComplete(); timerComplete();

is triggered in demo.js I want to trigger function 在demo.js中触发,我想触发功能

end() 结束()

in class.game.php, how do I accomplish this? 在class.game.php中,我该如何完成?

Here is a quick AJAX example. 这是一个快速的AJAX示例。

demo.js demo.js

timerComplete = function() {
    alert('Example 2: Countdown timer complete!');
    sendAjax();
}

function sendAjax()
{
  if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
  }
  else
  {// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  xmlhttp.onreadystatechange=function()
  {
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
      if(xmlhttp.responseText.match("success")){
          alert("AJAX returns success");
      }else{
          // something bad heppened
      }
    }
  }
  xmlhttp.open("GET","class.game.php?isTimerComplete=1",true);
  xmlhttp.send();
}    

class.game.php class.game.php

if(isset($_GET["isTimerComplete"])==true)
{
    // Do additional sanitizations here,
    // e.g. http://www.w3schools.com/php/php_form_validation.asp
    $isTimerComplete=$_GET["isTimerComplete"];
    if($isTimerComplete){
        echo "success";
        yourFunction(); // function that set an php bool to true
    }
}

Please go to sites like AJAX Tutorial . 请访问AJAX教程之类的网站。

Or google something like "Ajax php example" to learn more about AJAX and how it interact with php files. 或使用Google之类的“ Ajax php示例”来了解有关AJAX以及它如何与php文件交互的更多信息。

just to complement @user2875289's answer, if you have jquery already on your web page why dont you use it, just do this in javascript: 只是为了补充@ user2875289的答案,如果您的网页上已有jquery,为什么不使用它,只需在javascript中执行此操作:

timerComplete = function() {
    alert('Example 2: Countdown timer complete!');
    callPHPMethod("class.game.php?isTimerComplete=1", function(returnedPHPfunctionValue){
         // it was success, now you can do something with returnedPHPfunctionValue
    });
}

function callPHPMethod(method, callback)
{
  $.ajax({
        url: method,
        method: "GET",
        success: function(data){
              if($.isFunction(callback)) callback(data)
        },
        error: function(){
              //do something with error
        }
  });

in your PHP, do as @user2875289 pointed: 在您的PHP中,按照@ user2875289的指示进行操作:

if(isset($_SESSION["isTimerComplete"]) != true)
{
    // Do additional sanitizations here
    $isTimerComplete=$_GET["isTimerComplete"];
    //
    if($isTimerComplete){
        echo "success";
        yourPHPFunction(); // function that set an php bool to true
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM