js和php在同一个文件中相互获取值的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js和php在同一个文件中相互获取值的问题相关的知识,希望对你有一定的参考价值。
文件名是index.php
<script>
var linka;
linka=window.location.href;
</script>
<?php
$ch[0]="<script>document.write(linka);</script>";
echo $ch[0]."<br />";
<script>
到这步为止,php获得js的变量非常顺利
下面接着
<script>
var k;
k="<?php echo $ch[0];?>";
alert(k);
</script>
为什么输出是"alert(k);",而不是k的值?求解释
你好php是服务端脚本语言,js是浏览器端脚本语言,除非使用ajax进行数据提交否则,一但服务端生成好页面传到浏览器端后就不再参与浏览器端的“运算”,所以你想在同一个页面中不重新进行请求就js和php相互获取值是不现实的。
另:
你的代码分析如下:
<script>var linka;
linka=window.location.href;
</script>
<?php
$ch[0]="<script>document.write(linka);</script>";
echo $ch[0]."<br />";
<script>
到这步为止,php获得js的变量非常顺利
下面接着
<script>
var k;
k="<?php echo $ch[0];?>";
alert(k);
</script>
其实你的整个页面都是php的,执行
这一句的时候,php的$ch[0]仅仅只是被赋予了"<script>document.write(linka);</script>"这个字符串,js代码并没有运行.php也并没有获得js的变量!获得的只是字符串而已.
事实上$ch[0]被赋予的并不是字符串,你可以自己找个环境试试。
因为新浪专业版微博认证会传递给网站首页带参数的url,又一定要在网站首页调用一个js写的认证函数,所以才会嫌麻烦看看能不能写在一起。
给你看这个程序的一部分,再给你看看运行效果:
可见在php中将js和php混写是完全没有问题的。
echo $ch[0]."<br />";
这部分,实际上用php生成是多此一举。
因为传到浏览器端时输是
<script>document.write(linka);</script>直接就写
<script>document.write(linka);</script>
不需要放到php里,就能实现。
php在服务端讲"<script>document.write(linka);</script>"这个字符串赋值到$ch[0],后面就输出$ch[0]也就是"<script>document.write(linka);</script>"这个字符串到浏览器端页面后,才由浏览器端来执行document.write(linka).
不是说不能php和JS能混写就可以在同一页面上只通过进行交互。而是php和js的执行环境不一样,一个在服务端,一个在客户端。要想在服务端获取浏览器端的数据,则必须有“请求——应答”的过程。
<script>var k;
k="<?php echo $ch[0];?>";
alert(k);
</script>
这一段传到浏览器端后就是:<script>
var k;k="<script>document.write(linka);</script>"
alert(k);
</script>
另请注意:页面在服务端生成之后,要想再和服务端(这里即你的php程序)交互,则必须要通过再次的请求才行。这点,可以去补一下B/S模式的运行机制。
要从浏览器端的页面上传数据给服务端程序,建议还是通过ajax进行,如果不用ajax就用隐藏的iframe嵌入页面并将提交数据目标指向该iframe,然后在返回给iframe的代码里使用parent对象与父页面交互。
参考技术A 你这个浏览器中显示的值是因为<script>document.write(linka);</script>这句话显示的并不是php获取到了js变量中的值。如果你一定要用的话,就在js中写location.href="location.href?a="+linka;在PHP中写$ch[0]
=$_GET["a"];就可以获得了
对了linka里你要用截取字符串的函数把前半部分截掉,这点你自己试试。追问
新浪调用应用时会给你注册应用的实际链接post一点信息
专业版应用框架会GET给您的应用以下信息:
cid
viewer
sub_appkey
tokenString
但是添加授权也必须在注册应用的这个链接的页面,程序是新浪的JS程序!
通过ajax可以解决这个问题,但是能否把两者写在一起呢?
参见对另一位的追问,只是js变量获取php变量的时候有点问题.
不用ajax的话,你就用隐藏的div,然后通过js获取div中的php传下来的$ch[0]
参考技术B首先要明白,javascript和php是2门不同的程序语言,他们运行的环境截然不同
javascript的环境是浏览器,php的环境是服务器
二者是不能直接进行数据交换的,但是我们可以架设一个桥梁来实现,这里先给几个方法,希望能达到抛砖引玉的效果
最常用的大概要属ajax了,这里js向php发送的,和php向js回应的都是字符串类型的数据,这些字符串可以根据需要被转换成不同类型(对象,数字,bool值)。
把php输入到html中,js通过dom节点来访问和修改这些值,至于php如何接收这些值,不是直接丢到form里,get或post过去就结束了么?
极端情况的话,也可以直接把php的值输出到js代码里。
例如 var a = '<?php echo $v;?>';
php照样通过一个表单提交来获取他们。
php模板技术php是怎么向模板中传值的呢?
接了一个模板的网站可是首页和html是分开写的,查了之后发现实用模板引擎。于是我自己加了东西可是在模板中却调不到值,请问原理是什么有没一个简单的范例
模板引擎的原理就是先在模板上需要写上变量地方先写几个自己设置的占位符等php文件调用的时候,根据实际变量把他替换掉
给你一个简单的比方:
<body>
$names
</body>
这是一个简单的模板,比如这个文件名叫:index.htm
然后:
<?php
$Names = '小明'
$Contents = file_get_contents('index.htm');
$Html = preg_replace('/\$(.*)/i', '<?php echo $1;?>', $Contents);
file_put_contents('index.tpl.php', $Html);
echo include_once 'index.tpl.php';
?>
这样,你运行后,页面上就会显示 小明 2 个字
查看源代码就会看到
<body>
小明
</body>
当然,模板引擎技术,远远不是上面所说的那么简单,但原理是产不多的追问
恩,谢谢你的解答,但是上面的那些我很多都不明白,方便解释下吗
追答哎!
就一句话
你在模板引擎中
或者说在模板上单单写模板代码没有用啊
比如:
你在模板上写一个$names
这是没有用的啊,因为你的整个程序,压根就没有names这个变量,你就是写了,也没有用
可以不可以直接在模板中写PHP代码,然后index.php调用该模板后可以直接运行PHP代码?我在模板中看到的都是 首页有个叫什么wind的
参考技术A最简单的:
a.html<div><?php echo $b;?></div>
a.php
function view($html,$data=array())
extract($data);
include($html.'.html');
view('a',array('b'=>$b));
类似这样的,实际会复杂一点,也可能会有点不同。 参考技术B 就是利用正在则表达式替换模板中的东西
以上是关于js和php在同一个文件中相互获取值的问题的主要内容,如果未能解决你的问题,请参考以下文章