Вызов функции javascript из php не работает

Мои исследования в этом были довольно разочаровывающими, хотя я не понимаю, почему это не работает.

Когда моя индексная страница загружает свою предполагаемую для загрузки данных из базы данных через php, а затем эхо-данные в javascript, где форматы javascript и работает с этими данными, это отлично работает, если я помещаю событие onload в тело тела html который затем будет использовать данные, загруженные в данные переменной js. Это работает, но я не люблю использовать событие onload каждый раз, когда загружается страница.

Вот PHP-код, который находится в верхней части файла index.php:

if ($confirmation){

    $data = $membership->get_data("assump");

    echo '<script type="text/javascript">var data = '. json_encode($data) .';
        var dataLoaded = ' . json_encode(false) . '; loadData();</script>';

}

Функция loadData():

<script type="text/javascript">

    function loadData(){

        // Do stuff with the data

    }
</script>

Функция js function loadData() записывается далее в том же файле php перед телом закрывающего тега. Должен ли я создать php вместо script? или разместить script в другом месте? Или можно назвать эту функцию js?

Ответ 1

Похоже, у вас есть два фрагмента кода в двух отдельных блоках script. Это не сработает.

Для того, чтобы функция hoisting работала, они должны быть в одном и том же теге (там должна быть определена функция hoist).

Вот аналогичный вопрос с более подробным ответом: Почему моя функция javascript не вызывается в моем div?


ОБНОВЛЕНИЕ (для каждого запроса)

Браузер читает один блок JS за раз, поэтому подъем работает только внутри одного и того же блока (или если функция определена раньше, конечно). В вашем случае, возможно, самым простым решением было бы присвоение кода переменной PHP, а затем просто эхо в том же блоке script:

PHP

$js = '';

if ($confirmation){

    $data = $membership->get_data("assump");

    $js .= 'var data = '. json_encode($data) .';
        var dataLoaded = ' . json_encode(false) . '; loadData();';

}

HTML

<script type="text/javascript">

    <?= $js ?> // or <?php echo $js; ?>

    function loadData(){

        // Do stuff with the data

    }
</script>

Обратите внимание, что это позволяет вам вводить несколько строк/частей JS через PHP, поэтому я использовал $js .= ... вместо $js = ....

Обратите внимание, что это не будет работать с внешними .js файлами, если вы не сделаете PHP также синтаксическим анализом, а также сначала (о чем не беспокоиться в коде, поскольку ваш JS находится в файле HTML, который анализируется нормально).