Как передать переменные и данные из PHP в JavaScript?

У меня есть переменная в PHP, и мне нужно ее значение в моем коде JavaScript. Как я могу получить свою переменную из PHP в JavaScript?

У меня есть код, который выглядит так:

<?php
     ...
     $val = $myService->getValue(); // Makes an API and database call
?>

У меня есть код JavaScript, который нуждается в val и выглядит следующим образом:

<script>
    myPlugin.start($val); // I tried this, but it didn't work
    <?php myPlugin.start($val); ?> // This didn't work either
    myPlugin.start(<?=$val?> // This works sometimes, but sometimes it fails
</script>

Ответ 1

Есть несколько подходов для этого. Некоторые требуют больше накладных расходов, чем другие, а некоторые считаются лучше других.

Без определенного порядка:

  1. Используйте AJAX для получения необходимых данных с сервера.
  2. Отправьте данные на страницу и используйте JavaScript для получения информации из DOM.
  3. Вывод данных напрямую в JavaScript.

В этом посте мы рассмотрим каждый из перечисленных выше методов и рассмотрим плюсы и минусы каждого из них, а также способы их реализации.

1. Используйте AJAX для получения необходимых данных с сервера

Этот метод считается лучшим, потому что ваши сценарии на стороне сервера и на стороне клиента полностью отделены.

Доводы

  • Лучшее разделение между слоями - если завтра вы перестанете использовать PHP и захотите перейти на сервлет, REST API или какой-либо другой сервис, вам не придется менять большую часть кода JavaScript.
  • Более читаемый - JavaScript - это JavaScript, PHP - это PHP. Не смешивая их, вы получите более читаемый код на обоих языках.
  • Позволяет асинхронную передачу данных. Получение информации из PHP может быть дорогостоящим. Иногда вы просто не хотите ждать информацию, загружать страницу и получать информацию в любое время.
  • Данные не находятся непосредственно в разметке. Это означает, что ваша разметка очищена от любых дополнительных данных, и только JavaScript ее видит.

Против

  • Задержка - AJAX создает HTTP-запрос, а HTTP-запросы передаются по сети и имеют сетевые задержки.
  • Состояние - данные, извлеченные с помощью отдельного HTTP-запроса, не будут содержать никакой информации из HTTP-запроса, извлекшего HTML-документ. Вам может понадобиться эта информация (например, если документ HTML генерируется в ответ на отправку формы), и, если вы это сделаете, придется каким-то образом передавать ее. Если вы исключили возможность встраивания данных на страницу (которая у вас есть, если вы используете эту технику), это ограничивает вас файлами cookie/сессиями, которые могут зависеть от условий гонки.

Пример реализации

В AJAX вам нужны две страницы: одна - где PHP генерирует выходные данные, а вторая - где JavaScript получает эти выходные данные:

получить-data.php

/* Do some operation here, like talk to the database, the file-session
 * The world beyond, limbo, the city of shimmers, and Canada.
 *
 * AJAX generally uses strings, but you can output JSON, HTML and XML as well.
 * It all depends on the Content-type header that you send with your AJAX
 * request. */

echo json_encode(42); // In the end, you need to echo the result.
                      // All data should be json_encode()d.

                      // You can json_encode() any value in PHP, arrays, strings,
                      //even objects.

index.php (или как называется настоящая страница)

<!-- snip -->
<script>
    function reqListener () {
      console.log(this.responseText);
    }

    var oReq = new XMLHttpRequest(); // New request object
    oReq.onload = function() {
        // This is where you handle what to do with the response.
        // The actual data is found on this.responseText
        alert(this.responseText); // Will alert: 42
    };
    oReq.open("get", "get-data.php", true);
    //                               ^ Don't block the rest of the execution.
    //                                 Don't wait until the request finishes to
    //                                 continue.
    oReq.send();
</script>
<!-- snip -->

Приведенная выше комбинация двух файлов предупредит 42, когда файл завершит загрузку.

Еще немного материала для чтения

2. Перенесите данные на страницу и используйте JavaScript для получения информации из DOM.

Этот метод менее предпочтителен, чем AJAX, но все же имеет свои преимущества. Он все еще относительно разделен между PHP и JavaScript в том смысле, что в JavaScript нет прямого кода.

Доводы

  • Быстрые - операции DOM часто бывают быстрыми, и вы можете хранить и получать доступ к большому количеству данных относительно быстро.

Против

  • Потенциально несемантическая разметка - обычно происходит то, что вы используете какой-то <input type=hidden> для хранения информации, потому что легче получить информацию из inputNode.value, но это означает, что у вас есть бессмысленный элемент в ваш HTML. HTML имеет элемент <meta> для данных о документе, а HTML 5 вводит атрибуты data-* для данных специально для чтения с помощью JavaScript, который можно связать с конкретными элементами.
  • Загрязнение источника - данные, которые генерирует PHP, выводятся непосредственно в источник HTML, а это означает, что вы получаете больший и менее сфокусированный источник HTML.
  • Труднее получить структурированные данные - структурированные данные должны быть действительными HTML, иначе вам придется самостоятельно экранировать и преобразовывать строки.
  • Сильно связывает PHP с логикой ваших данных - поскольку PHP используется в презентации, вы не можете четко разделить их.

Пример реализации

Таким образом, идея состоит в том, чтобы создать какой-то элемент, который не будет отображаться пользователю, но будет видимым для JavaScript.

index.php

<!-- snip -->
<div id="dom-target" style="display: none;">
    <?php
        $output = "42"; // Again, do some operation, get the output.
        echo htmlspecialchars($output); /* You have to escape because the result
                                           will not be valid HTML otherwise. */
    ?>
</div>
<script>
    var div = document.getElementById("dom-target");
    var myData = div.textContent;
</script>
<!-- snip -->

3. Вывод данных напрямую в JavaScript

Это, наверное, проще всего понять.

Доводы

  • Очень легко реализуемое - для его реализации и понимания требуется совсем немного.
  • Не портит источник - Переменные выводятся непосредственно в JavaScript, поэтому DOM не затрагивается.

Против

  • Сильно связывает PHP с логикой ваших данных - поскольку PHP используется в презентации, вы не можете четко разделить их.

Пример реализации

Реализация относительно проста:

<!-- snip -->
<script>
    var data = <?php echo json_encode("42", JSON_HEX_TAG); ?>; // Don't forget the extra semicolon!
</script>
<!-- snip -->

Удачи!

Ответ 2

Я собираюсь попробовать более простой ответ:

Объяснение проблемы

Во-первых, давайте поймем поток событий, когда страница обслуживается с нашего сервера:

  • Сначала запускается PHP, он генерирует HTML, который подается клиенту.
  • Затем HTML-код доставляется клиенту, после того как PHP завершит работу с ним, я хотел бы подчеркнуть, что, как только код покидает сервер - PHP завершает работу с ним и больше не может получить к нему доступ.
  • Затем HTML с JavaScript достигает клиента, который может выполнить JavaScript на этом HTML.

В общем, главное, что нужно помнить, это то, что HTTP не имеет состояния. Как только запрос покинул сервер, сервер не может его коснуться. Итак, это оставляет наши варианты:

  1. Отправьте больше запросов от клиента после того, как начальный запрос сделан.
  2. Кодировать то, что сервер должен был сказать в первоначальном запросе.

Решения

Вот основной вопрос, который вы должны себе задать:

Я пишу веб-сайт или приложение?

Сайты в основном основаны на страницах, и время загрузки страницы должно быть максимально быстрым (например, Википедия). Веб-приложения более тяжелые в AJAX и выполняют множество обходных шагов, чтобы быстро получить информацию о клиенте (например, панель инструментов).

Веб-сайт

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

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

Вам нужно быстрое время отклика, которое оказывает огромное влияние на конверсию и время загрузки. В этом случае выполнение запросов Ajax является медленным для начального времени безотказной работы и не требуется.

У вас есть два способа решения проблемы

  • Установить cookie - cookie - это заголовки, отправляемые в HTTP-запросах, которые могут прочитать и сервер, и клиент.
  • Закодируйте переменную как JSON - JSON выглядит очень близко к объектам JavaScript, и большинство объектов JSON являются допустимыми переменными JavaScript.

Настройка cookie действительно не очень сложна, вы просто присваиваете ей значение:

setcookie("MyCookie", $value); // Sets the cookie to the value, remember, do not
                               // Set it with HTTP only to true.

Затем вы можете прочитать его с помощью JavaScript, используя document.cookie:

Вот краткий парсер, но ответ, который я привел выше, лучше проверен:

var cookies = document.cookie.split(";").
    map(function(el){ return el.split("="); }).
    reduce(function(prev,cur){ prev[cur[0]] = cur[1];return prev },{});

cookies["MyCookie"] // Value set with PHP.

Файлы cookie хороши для небольших данных. Это то, что часто делают службы отслеживания.

Как только у нас будет больше данных, мы можем вместо этого кодировать их с помощью JSON внутри переменной JavaScript:

<script>
    var myServerData = <?=json_encode($value)?>; // Don't forget to sanitize
                                                 //server data
</script>

Предполагая, что $value способен json_encode на стороне PHP (обычно это так). Эта техника - то, что Qaru делает, например, со своим чатом (только с использованием .NET вместо PHP).

заявка

Если вы пишете приложение - внезапно начальное время загрузки не всегда так важно, как текущая производительность приложения, и оно начинает окупаться, загружая данные и код отдельно.

Мой ответ здесь объясняет, как загрузить данные с помощью AJAX в JavaScript:

function callback(data){
    // What do I do with the response?
}

var httpRequest = new XMLHttpRequest;
httpRequest.onreadystatechange = function(){
    if (httpRequest.readyState === 4) { // Request is done
        if (httpRequest.status === 200) { // successfully
            callback(httpRequest.responseText); // We're calling our method
        }
    }
};
httpRequest.open('GET', "/echo/json");
httpRequest.send();

Или с помощью jQuery:

$.get("/your/url").done(function(data){
    // What do I do with the data?
});

Теперь серверу нужно просто содержать /your/url маршрут/файл, который содержит код, который захватывает данные и что-то с ними делает, в вашем случае:

<$php
     ...
     $val = myService->getValue(); // Makes an API and database call
     echo json_encode($val); // Write it to the output
 $>

Таким образом, наш файл JavaScript запрашивает данные и показывает их, а не запрашивает код или макет. Это чище и начинает окупаться, когда приложение становится выше. Это также улучшает разделение проблем и позволяет тестировать код на стороне клиента без какой-либо технологии на стороне сервера, что является еще одним плюсом.

Постскриптум: вы должны очень хорошо знать векторы атак XSS, когда вводите что-либо из PHP в JavaScript. Очень трудно избежать значений правильно и это зависит от контекста. Если вы не знаете, как обращаться с XSS, или не знаете об этом - прочитайте эту статью OWASP, эту и этот вопрос.

Ответ 3

Я обычно использую атрибуты data- * в HTML.

<div class="service-container" data-service="<?php echo $myService->getValue(); ?>">

</div>

<script>
    $(document).ready(function() {
        $('.service-container').each(function() {
            var container = $(this);
            var service = container.data('service');

            // Service variable now contains the value of $myService->getValue();
        });
    });
</script>

В этом примере используется jQuery, но его можно адаптировать для другой библиотеки или обычного JavaScript.

Вы можете прочитать больше о свойстве набора данных здесь: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset

Ответ 4

<script>
  var jsvar = <?php echo json_encode($PHPVar); ?>;
</script>

json_encode() требует:

  • PHP 5.2.0 и более
  • $PHPVar закодирован как UTF-8, Unicode.

Ответ 5

Просто используйте один из следующих способов.

<script type="text/javascript">
var js_variable  = '<?php echo $php_variable;?>';
<script>

ИЛИ

<script type="text/javascript">
    var js_variable = <?php echo json_encode($php_variable); ?>; 
</script>

Ответ 6

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

class mHeader {

    private $scripts = array();

    /**
     * @param string $id        Unique script identifier
     * @param string $src      Script src attribute
     * @param array  $deps       An array of dependencies ( script identifiers ).
     * @param array  $data       An array, data that will be json_encoded and available to the script.
     */
    function enqueue_script($id, $src, $deps = array(), $data = array()) {
        $this->scripts[$id] = array('src' => $src, 'deps' => $deps, 'data' => $data);
    }

    private function dependencies($script) {
        if ($script['deps']) {
            return array_map(array($this, 'dependencies'), array_intersect_key($this->scripts, array_flip($script['deps'])));
        }
    }

    private function _unset($key, &$deps, &$out) {
        $out[$key] = $this->scripts[$key];
        unset($deps[$key]);
    }

    private function flattern(&$deps, &$out = array()) {

        foreach($deps as $key => $value) {
            empty($value) ? $this->_unset($key, $deps, $out) : $this->flattern( $deps[$key], $out);
        }
    }

    function print_scripts() {

        if (!$this->scripts)
            return;

        $deps = array_map(array($this, 'dependencies'), $this->scripts);
        while ($deps)
            $this->flattern($deps, $js);

        foreach($js as $key => $script) {
            $script['data'] && printf("<script> var %s = %s; </script>" . PHP_EOL, key($script['data']), json_encode(current( $script['data'])));
            echo "<script id=\"$key-js\" src=\"$script[src]\" type=\"text/javascript\"></script>" . PHP_EOL;
        }
    }
}

Вызов функции enqueue_script() предназначен для добавления сценария, установки источника и зависимостей от других сценариев, а также дополнительных данных, необходимых для сценария.

$header = new mHeader();

$header->enqueue_script('jquery-ui', '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js', array('jquery'));
$header->enqueue_script('jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js');
$header->enqueue_script('custom-script', '//custom-script.min.js', array('jquery-ui'), array('mydata' => array('value' => 20)));

$header->print_scripts();

И метод print_scripts() приведенного выше примера отправит этот вывод:

<script id="jquery-js" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script>
<script id="jquery-ui-js" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js" type="text/javascript"></script>
<script> var mydata = {"value":20}; </script>
<script id="custom-script-js" src="//custom-script.min.js" type="text/javascript"></script>

Независимо от того, что скрипт 'jquery' ставится в очередь после 'jquery-ui', он печатается раньше, потому что он определен в 'jquery-ui', что он зависит от 'jquery'. Дополнительные данные для 'custom-script' находятся внутри нового блока скрипта и помещены перед ним, он содержит объект mydata который содержит дополнительные данные, теперь доступные для 'custom-script'.

Ответ 7

Попробуй это:

<?php
    echo "<script> var x = " . json_encode($phpVariable) . "</script>";
?>

-

-After пробует это некоторое время

Хотя это работает, однако это замедляет производительность. Поскольку PHP - это серверный скрипт, а JavaScript - это пользовательская.

Ответ 8

myPlugin.start($val); // Tried this, didn't work

Это не работает, потому что $val не определен в отношении JavaScript, то есть код PHP ничего не выводил для $val. Попробуйте просмотреть источник в своем браузере, и вот что вы увидите:

myPlugin.start(); // I tried this, and it didn't work

А также

<?php myPlugin.start($val); ?> // This didn't work either

Это не работает, потому что PHP попытается обработать myPlugin как константу, а если это не удастся, он попытается обработать ее как строку 'myPlugin' которую он попытается 'myPlugin' с выходом функции PHP start() и с тех пор не определено, это приведет к фатальной ошибке.

А также

 myPlugin.start(<?=$val?> // This works sometimes, but sometimes it fails

Хотя это, скорее всего, сработает, поскольку код PHP myPlugin допустимый JavaScript с ожидаемыми аргументами, в случае неудачи он, скорее всего, потому что myPlugin еще не готов. Проверьте ваш порядок исполнения.

Также вы должны заметить, что вывод PHP-кода небезопасен и должен фильтроваться с помощью json_encode().

РЕДАКТИРОВАТЬ

Потому что я не заметил пропущенных скобок в myPlugin.start(<?=$val?>: -\

Как указывает @Second Rikudo, для правильной работы $val потребуется заключительная скобка, например: $val="42);"

Это означает, что PHP теперь будет производить myPlugin.start(42); и будет работать, как ожидается, при выполнении кода JavaScript.

Ответ 9

Я выступил с простым методом назначения переменных JavaScript с помощью PHP.

Он использует атрибуты данных HTML5 для хранения переменных PHP, а затем назначается JavaScript при загрузке страницы.

Полный учебник можно найти здесь.

Пример:

<?php
    $variable_1 = "QNimate";
    $variable_2 = "QScutter";
?>
    <span id="storage" data-variable-one="<?php echo $variable_1; ?>" data-variable-two="<?php echo $variable_2; ?>"></span>
<?php

Вот код JavaScript

var variable_1 = undefined;
var variable_2 = undefined;

window.onload = function(){
    variable_1 = document.getElementById("storage").getAttribute("data-variable-one");
    variable_2 = document.getElementById("storage").getAttribute("data-variable-two");
}

Ответ 10

Вот тот, который я не вижу в качестве опции. Это похоже на использование Ajax, но явно отличается.

Сначала установите источник сценария непосредственно в файл PHP.

<script type="text/javascript" src="url_to_your_php_file.php" /></script>

Вы можете даже передать переменную обратно в файл PHP, например, в этом примере:

<script type="text/javascript" src="url_to_your_php_file.php?var1=value1" /></script>

Затем в "your_php_file.php":

<?php
    // THIS IS A SIMPLE EXAMPLE
    // it demonstrates one method of using the src attribute to link
    // to a PHP file which can generate JavaScript code dynamically
    // and share data between PHP and JavaScript
    // you may take this learning example and develop it further
    // relying on your own coding skills for validating data
    // and avoiding errors, of course
    header('content-type: text/javascript');

    // If you pass a $_GET variable from the JavaScript
    // you should add code to validate your $_GET variable(s)

    // You can add code to query a database
    // using $_GET['var1'] or some other criteria

    // You can add simple variable assignments
    $value = 'some value';

    // For the OP needs (assumes the class object has been defined)
    $val = $myService->getValue();
?>

function name() {
    // Pay attention because you need to use quotes properly
    // and account for possible quotes in the variable strings
    // to avoid both PHP and JavaScript errors
    // example assumes $val has been returned as a string
    // validate $val as needed using your method of choice
    var example1 = <?php echo '"' . $val . '"'; ?>;
    var example2 = <?php echo '"' . $value . '"'; ?>;
    var example3 = <?php echo '"some other data"'; ?>;
    alert( example1 + ' / ' + example2 );
}

<?php
    // You may even want to include additional files (.php or .js, etc.)
    @include 'local_path_to_some_other_js_file.js';
    @include 'local_path_to_some_other_php_file.php';

    exit;
?>

Ответ 11

Вот хитрость:

  1. Вот ваш 'PHP' для использования этой переменной:

    <?php
        $name = 'PHP variable';
        echo '<script>';
        echo 'var name = ' . json_encode($name) . ';';
        echo '</script>';
    ?>
    
  2. Теперь у вас есть переменная JavaScript с 'name', и вот ваш код JavaScript для использования этой переменной:

    <script>
         console.log("I am everywhere " + name);
    </script>
    

Ответ 12

Допустим, ваша переменная всегда целочисленная. В этом случае это проще:

<?PHP
    $number = 4;

    echo '<script>';
    echo 'var number = ' . $number . ';';
    echo 'alert(number);';
    echo '</script>';
?>

Выход:

<script>var number = 4;alert(number);</script>

Допустим, ваша переменная не является целым числом, но если вы попробуете описанный выше метод, вы получите что-то вроде этого:

<script>var number = abcd;alert(number);</script>

Но в JavaScript это синтаксическая ошибка.

Поэтому в PHP у нас есть вызов функции json_encode который кодирует строку в объект JSON.

<?PHP
    $number = 'abcd';

    echo '<script>';
    echo 'var number = ' . json_encode($number) . ';';
    echo 'alert(number);';
    echo '</script>';
?>

Поскольку abcd в JSON - это "abcd", это выглядит так:

<script>var number = "abcd";alert(number);</script>

Вы можете использовать тот же метод для массивов:

<?PHP
    $details = [
    'name' => 'supun',
    'age' => 456,
    'weight' => '55'
    ];

    echo '<script>';
    echo 'var details = ' . json_encode($details) . ';';
    echo 'alert(details);';
    echo 'console.log(details);';
    echo '</script>';
?>

И ваш код JavaScript выглядит так:

<script>var details = {"name":"supun","age":456,"weight":"55"};alert(details);console.log(details);</script>

Консольный вывод

Enter image description here

Ответ 13

  1. Преобразовать данные в JSON
  2. Вызовите AJAX для получения файла JSON
  3. Конвертировать JSON в объект Javascript

Пример:

ШАГ 1

<?php

   $servername = "localhost";
   $username = "";
   $password = "";
   $dbname = "";
   $conn = new mysqli($servername, $username, $password, $dbname);

   if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
   } 

   $sql = "SELECT id, name, image FROM phone";
   $result = $conn->query($sql);

   while($row = $result->fetch_assoc()){ 
      $v[] = $row;    
   }

  echo json_encode($v);

  $conn->close();
?>

ШАГ 2

function showUser(fnc) {
   var xhttp = new XMLHttpRequest();

   xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
         // STEP 3    
         var p = JSON.parse(this.responseText);
      }
   }
}

Ответ 14

После долгих исследований я обнаружил, что самый простой способ - легко передавать все виды переменных.

В сценарии сервера у вас есть две переменные, и вы пытаетесь отправить их клиентским сценариям:

$php_var1 ="Hello world";
$php_var2 ="Helloow";
echo '<script>';
echo 'var js_variable1= ' . json_encode($php_var1) . ';';
echo 'var js_variable2= ' . json_encode($php_var2) . ';';
echo '</script>';

В любом из ваших JavaScript-кодов, вызываемых на странице, просто вызывайте эти переменные.

Ответ 15

Я предполагаю, что данные для передачи являются строкой.

Как отмечали другие комментаторы, AJAX является одним из возможных решений, но его недостатки перевешивают плюсы: он имеет задержку и его сложнее программировать (ему нужен код для извлечения значения как server-, так и на стороне клиента), когда более простой функции выхода должно быть достаточно.

Итак, мы вернулись к побегу. json_encode($string) работает, если вы сначала кодируете исходную строку как UTF-8, если это не так, потому что для json_encode требуются данные UTF-8. Если строка в ISO-8859-1, вы можете просто использовать json_encode(utf8_encode($string)); в противном случае вы всегда можете использовать iconv чтобы сделать преобразование первым.

Но есть большая ошибка. Если вы используете его в событиях, вам нужно запустить htmlspecialchars() для результата, чтобы сделать его правильным кодом. И затем вы должны быть осторожны, используя двойные кавычки для включения события, или всегда добавлять ENT_QUOTES в htmlspecialchars. Например:

<?php
    $myvar = "I'm in \"UTF-8\" encoding and I have <script>script tags</script> & ampersand!";
    // Fails:
    //echo '<body onload="alert(', json_encode($myvar), ');">';
    // Fails:
    //echo "<body onload='alert(", json_encode($myvar), ");'>";
    // Fails:
    //echo "<body onload='alert(", htmlspecialchars(json_encode($myvar)), ");'>";

    // Works:
    //echo "<body onload='alert(", htmlspecialchars(json_encode($myvar), ENT_QUOTES), ");'>";
    // Works:
    echo '<body onload="alert(', htmlspecialchars(json_encode($myvar)), ');">';

    echo "</body>";

Однако вы не можете использовать htmlspecialchars в обычном коде JavaScript (код, заключенный в теги <script>... </script>). Это делает эту функцию подверженной ошибкам, забывая htmlspecialchars результат при написании кода события.

Можно написать функцию, которая не имеет такой проблемы и может использоваться как в событиях, так и в обычном коде JavaScript, если вы заключаете свои события всегда в одинарные или в двойные кавычки. Вот мое предложение, требующее, чтобы они были в двойных кавычках (что я предпочитаю):

<?php
    // Optionally pass the encoding of the source string, if not UTF-8
    function escapeJSString($string, $encoding = 'UTF-8')
    {
        if ($encoding != 'UTF-8')
            $string = iconv($encoding, 'UTF-8', $string);
        $flags = JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS|JSON_HEX_QUOT|JSON_UNESCAPED_SLASHES;
        $string = substr(json_encode($string, $flags), 1, -1);
        return "'$string'";
    }

Функция требует PHP 5. 4+. Пример использования:

<?php
    $myvar = "I'm in \"UTF-8\" encoding and I have <script>script tags</script> & ampersand!";
    // Note use of double quotes to enclose the event definition!
    echo '<body onload="alert(', escapeJSString($myvar), ');">';
    // Example with regular code:
    echo '<script>alert(', escapeJSString($myvar), ');</script>';
    echo '</body>';

Ответ 16

Согласно вашему коду

<$php
     $val = $myService->getValue(); // Makes an API and database call
     echo '<span id="value">'.$val.'</span>';
$>

Теперь вы можете получить значение с помощью DOM, использовать innerHTML для span id, в этом случае вам не нужно делать никаких обращений к серверу, или Ajax, или другим способом.

Ваша страница напечатает его с помощью PHP, а ваш JavaScript получит значение с помощью DOM.

Ответ 17

<?php

    $val = $myService->getValue(); // Makes an API and database call

    echo "
        <script>
            myPlugin.start({$val});
        </script> ";

?>

Ответ 18

Для тех, у кого есть проблемы с использованием приведенного ниже кода, и он продолжает показывать <?php echo $username?> Или что-то подобное, отредактируйте файл httpd.conf в разделе mime_module, добавив это приложение AddType/x-httpd-php.html..htm ', потому что он может быть отключен по умолчанию.

<?php
    $username = 1;
?>

<script type="text/javascript">
    var myData = <?php echo $username ?>;
    console.log(myData);
    alert(myData);
</script>

Ответ 19

Использование:

<?php
    $your_php_variable= 22;
    echo "<script type='text/javascript'>var your_javascript_variable = $your_php_variable;</script>";
?>

и это сработает. Это просто присвоение переменной JavaScript, а затем передача значения существующей переменной PHP. Поскольку PHP пишет здесь строки JavaScript, он имеет значение переменной PHP и может передавать ее напрямую.

Ответ 20

 <script>
     window.$val = '$myService->getValue()';
 </script>

Ответ 21

Вы можете использовать его:

<script language='javascript'> var a=<?php echo $a;?>; </script>

и помните, что php перед выполнением, когда закончить запуск javascript для запуска. aren't parallels, являются секвенциальными.