如何将变量和数据从PHP传递到JavaScript?
我在PHP中有一个变量,我需要它的值在我的JavaScript代码中。 我怎样才能让我的变量从PHP到JavaScript?
我有这样的代码:
<?php
...
$val = $myService->getValue(); // makes an api and db call
?>
我有需要val
JavaScript代码,看起来如下:
<script>
myPlugin.start($val); // tried this, didn't work
<?php myPlugin.start($val); ?> // this didn't work either
myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
</script>
实际上有几种方法可以做到这一点。 有些人需要比别人更多的开销,有些人认为比别人更好。
没有特别的顺序:
在这篇文章中,我们将检查上述每种方法,并查看每种方法的优缺点以及如何实现它们。
1.使用AJAX从服务器获取所需的数据
这种方法被认为是最好的,因为你的服务器端和客户端脚本是完全分离的 。
优点
缺点
实施例
使用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中没有直接的PHP。
优点
缺点
<input type=hidden>
来存储信息,因为从inputNode.value
获取信息更容易,但这样做意味着您没有任何意义你的HTML。 HTML具有关于文档的数据的<meta>
元素,并且HTML 5引入data-*
属性专门用于与可以与特定元素关联的JS读取的数据。 实施例
有了这个,我们的想法是创建一些不会显示给用户的元素,但对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
这可能是最容易理解的,也是最可怕的。 除非你知道你在做什么,否则不要这样做。
优点
缺点
实施例
实现相对简单:
<!-- snip -->
<script>
var data = <?php echo json_encode("42", JSON_HEX_TAG); ?>; //Don't forget the extra semicolon!
</script>
<!-- snip -->
祝你好运!
我会尝试一个更简单的答案:
问题的解释
首先,让我们了解从服务器提供页面时的事件流程:
所以真的,这里要记住的核心是HTTP是无状态的 。 一旦请求离开服务器,服务器就无法触摸它。 所以,我们的选择留给:
解决方案
这是你应该问自己的核心问题:
我正在写一个网站还是一个应用程序?
网站主要基于页面,页面加载时间需要尽可能快(例如 - 维基百科)。 Web应用程序更多的是AJAX,并执行大量往返以获取客户端的快速信息(例如 - 股票仪表板)。
网站
初始请求完成后,从客户端发送更多请求的速度很慢,因为它需要更多的HTTP请求,这些HTTP请求具有相当大的开销。 而且,它需要异步性,因为在完成AJAX请求时需要处理程序。
除非您的网站是用于从服务器获取该信息的应用程序,否则我不会建议再发出一个请求。
您希望快速响应时间对转换和加载时间产生巨大影响。 在这种情况下,创建Ajax请求对于初始正常运行时间是缓慢的并且不需要。
你有两种方法来解决这个问题
设置一个cookie实际上并不是很困难,你只需给它赋值:
setcookie("MyCookie", $value); // sets the cookie to the value, remember, do not
// set it with HTTP only to true.
然后,您可以使用document.cookie
使用JavaScript阅读它:
这是一个简短的滚动解析器,但是我在上面链接的答案有更好的测试:
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在JS变量中编码它:
<script>
var myServerData = <?=json_encode($value)?>; // don't forget to sanitize
//server data
</script>
假设$value
是PHP端的json_encode
(通常是)。 这种技术就是StackOverflow在聊天时所做的事情(只使用.net而不是php)。
应用
如果您正在编写应用程序 - 突然间,初始加载时间并不总是与应用程序的持续性能一样重要,并且它开始为单独加载数据和代码而付出代价。
我在这里的答案解释了如何在JavaScript中使用AJAX加载数据:
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 db call
echo json_encode($val); // write it to the output
$>
这样,我们的JS文件要求输入数据并显示它,而不是要求代码或布局。 这是更清洁,并随着应用程序变得更高而开始回报。 这也是更好的问题分离,它允许在不涉及任何服务器端技术的情况下测试客户端代码,这是另一个优点。
后记:当你注入任何从PHP到JavaScript的内容时,你必须非常了解XSS攻击向量。 很难正确地转义值,并且它是上下文敏感的。 如果你不确定如何处理XSS,或者不知道它 - 请阅读这篇OWASP文章,这个和这个问题。
我通常在html中使用data- *属性。
<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
链接地址: http://www.djcxy.com/p/23651.html