Javascript, созданный в PHP, не выполняется

Я пытаюсь создать систему рулетки, которая должна работать следующим образом: пользователь нажимает кнопку отправки, которая затем проверяется в файле open_case_handler.php, чтобы узнать, достаточно ли у пользователя средств на его счете или нет, и если он будет повторять код javascript, который создаст анимацию для рулетки, а также выдаст выигрыш. В целях безопасности я выполняю код js на php, поэтому у пользователя нет доступа к нему, поскольку он выполняется на стороне сервера.

Проблема здесь в том, что код js и jquery не выполняется после достижения этой строки кода:

var gw = $(".gift").outerWidth(true);

в open_case_handler.php.

Вы заметите, что есть два предупреждения до и после кода предыдущей строки, о котором я только что упомянул. Если я раскомментирую предупреждение («TEST1»), оно будет выполнено, и появится предупреждающее сообщение, однако остальная часть кода не будет выполнена. Также, если я раскомментирую только предупреждение («ТЕСТ2»), оно не будет выполнено и ничего не произойдет.

Чтобы убедиться, что код javascript действительно работает. Я ранее тестировал его в файле javascript и использовал его в файле index.php, и он работал отлично.

index.php

Эта страница содержит рулетку со всеми различными изображениями каждого предмета. Кнопка отправки находится внизу. Это кнопка, которую пользователи нажимают, чтобы запустить рулетку.

    <div class='rafflebox'>
      <div class='pointer'></div>
      <div class='boxwrapper'>
        <ul class='giftwrapper'>

          <div class = "gift item bg-size2 box-bg3">
              <img class = "item-product2" src = "graphics/mouse.png" draggable = "false">
          </div>

          <div class = "gift item bg-size2 box-bg2">
              <img class = "item-product2" src = "graphics/mouse.png" draggable = "false">
          </div>

          <div class = "gift item bg-size2 box-bg3">
              <img class = "item-product2" src = "graphics/mouse.png" draggable = "false">
          </div>

          <div class = "gift item bg-size2 box-bg4">
              <img class = "item-product2" src = "graphics/mouse.png" draggable = "false">
          </div>


        </ul>
      </div>
    </div>

    <form  method = "post">
      <button type = "submit" name = "opening_case" class = "btn open-box-btn btn-openbox-font button"><img id = "lock" src = "graphics/iconos/Candado Cerrado Black.png">ABRIR CAJA</button>
    </form>

  </div>

open_case_handler.php

<?php
session_start ();

if (isset($_POST['opening_case']))
{
 opening_case ();

} 

function opening_case ()

{

if ($_SESSION['balance'] >= $_SESSION['box price'])

  {
    echo '
    <script>
      //alert("TEST1");
      var giftamount = 10;
      var gw = $(".gift").outerWidth(true);
      //alert("TEST2");
      var giftcenter = gw/2;
      var cycle = 7;

      var containercenter = $(".boxwrapper").outerWidth(true)/2;
      for(var i = 0; i <=5; i++)
        {
          var giftduplicate = $(".giftwrapper").children().clone(true,true);
           $(".giftwrapper").append(giftduplicate);
        }

      $(".button").click(function()
      {
            alert("You DO have sufficient funds");
            var btn = $(this);
            btn.hide();
            var randomgift = Math.floor(Math.random() * 4) + 1;
            var dev = Math.random()*(giftcenter+1);
            var distance = giftamount *  cycle * gw   + (randomgift*gw) - containercenter -24 +dev;

            console.info(distance);

            $( ".giftwrapper" ).css({left: "0"});

            $(".giftwrapper").animate({left: "- = "+distance},10000,function()
              {
                alert("You Won Gift" + randomgift);
                btn.show();
              });

    });


    </script>';

   } else {

    //to be done

  }
}


?>

Пожалуйста, не стесняйтесь высказывать свои идеи о том, как лучше построить этот тип системы. Я открыт для всех предложений, я новичок в этом.

Спасибо!!

В вашей форме нет атрибута action, загружается ли opening_case_handler.php через AJAX?

Chris G 07.10.2018 20:23
«Если я раскомментирую предупреждение (« TEST1 »), оно будет выполнено, и появится предупреждающее сообщение, однако остальная часть кода не будет выполнена». - Возможно ли, что у вас тогда будет ошибка $ is not defined в консоль? Это означало бы, что jQuery не загружен ... и это прерывает выполнение. ;)
Louys Patrice Bessette 08.10.2018 02:10

Да, после проверки консоли я заметил, что произошла ошибка и действительно была связана с тем, что jQuery не был загружен. У меня был скрипт jQuery внизу моего файла, но я заменил его вверху, и он заработал. Спасибо!!

Dylan Ramirez 08.10.2018 19:19

Что касается отсутствующего атрибута действия, я подумал, что он мне не нужен, если я просто включу файл open_case_handler.php в index.php, а затем просто проверю наличие кнопки отправки POST.

Dylan Ramirez 08.10.2018 19:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
114
3

Ответы 3

Попробуйте использовать Пример цитирования строки Heredoc для печати вашего JavaScript:

$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

Heredoc text behaves just like a double-quoted string, without the double quotes. This means that quotes in a heredoc do not need to be escaped, but the escape codes listed above can still be used. Variables are expanded, but the same care must be taken when expressing complex variables inside a heredoc as with strings.

Если это просто файл с кодом php. Вы можете попробовать несколько ниже.

<?php

echo "some stuff here" 

if ($condition){ ?>

<script>
alert("condition true");
</script>

<?php } else { ?>

<script>
alert("condition false");
</script>


<?php }?>

Когда форма отправляется, она перенаправляет вас на страницу PHP (т.е. когда вы нажимаете кнопку «Отправить» в index.php, вы будете перенаправлены на open_case_handler.php), а затем страница PHP отправит вас обратно на страницу индекса с новой информацией. Таким образом, ваш код javascript печатается в файле open_case_handler.php, поэтому ваш javascript не запускается. Кроме того, ваш код javascript всегда будет виден, если вы не сделаете что-то действительно творческое, поэтому, если вы пытаетесь обрабатывать любую конфиденциальную информацию, делайте это на PHP или в любой другой серверной структуре, которую вы используете.

Есть способы решить эту проблему, но я бы порекомендовал другой подход для решения этой проблемы. Вы можете использовать запрос AJAX, который в основном работает следующим образом:

  1. Вы отправляете запрос на свой PHP-сервер с данными, которые хотите отправить.
  2. Ваш PHP-сервер обработает запрос и отправит его вам.
  3. Ваш код Javascript обработает результат и покажет анимацию или что бы вы ни делали.

    Таким образом, ваш алгоритм не отображается, а ваш клиент (сторона javascript) обрабатывает только информацию, введенную пользователем, а результаты приходят с сервера.

В вашем случае мы можем сделать это, используя следующие изменения

Index.php (теперь его можно заменить на index.html)

  <button type = "submit" id = "opening_case" name = "opening_case" class = "btn open-box-btn btn-openbox-font button"><img id = "lock" src = "graphics/iconos/Candado Cerrado Black.png">ABRIR CAJA</button>
  <script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<script>
    $("#opening_case").on("click", ()=>{
        // $.get( "opening_case_handler.php?opening_case=true", function( data ) {
        //     console.info(data.funds)
        // });
        $.ajax({
            url: "opening_case_handler.php?opening_case=true",
            success: (data)=>{
                if (data.funds) {
                    alert("You DO have sufficient funds")
                } else {
                    ("You don't have sufficient funds")
                }
            },
            dataType: "JSON"
        });
    })
</script>

open_case_handler.php

<?php

if (isset($_GET['opening_case'])) {
   $result = [
      "funds" => true,
   ];
   $ResultsInJSON= json_encode($result);
   echo $ResultsInJSON; 
} 
?>

Index.php отправит запрос при нажатии кнопки с помощью AJAX, который вы можете прочитать здесь https://api.jquery.com/jquery.get/, тогда ваш PHP получит запрос и ответ с кодом JSON, который может быть обработан с использованием данных. Все, что показано в примере выше.

Примечание. Я не эксперт по PHP, но считаю, что в данном случае лучше использовать этот метод.

Примечание 2: вам не нужен JQuery для Ajax, но это проще! Вот как это сделать без JQuery https://www.w3schools.com/xml/ajax_xmlhttprequest_send.asp

Большое спасибо за такое подробное объяснение и примеры, это сработало! Я определенно согласен с вами, такой подход определенно лучше для построения систем такого типа.

Dylan Ramirez 08.10.2018 19:16

Другие вопросы по теме