Javascript 获得$request->;isXmlHttpRequest()始终为false
我想用ajax(不使用Jquery)持久化一个实体并捕获一条消息,但在布尔$request->isXmlHttpRequest()中遇到了问题 此处的脚本:Javascript 获得$request->;isXmlHttpRequest()始终为false,javascript,php,ajax,symfony,Javascript,Php,Ajax,Symfony,我想用ajax(不使用Jquery)持久化一个实体并捕获一条消息,但在布尔$request->isXmlHttpRequest()中遇到了问题 此处的脚本: var xhr = getXMLHttpRequest(); xhr.open("POST", "{{ path('deplacement') }}", true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.send("
var xhr = getXMLHttpRequest();
xhr.open("POST", "{{ path('deplacement') }}", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send("coordonnee="+abs+"-"+ord+"&name="+personnage[0].getAttribute('id'));
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
var classPersonnage = personnage[0].getAttribute('class');
var arrayClassPersonnage = classPersonnage.split(' ');
var id = personnage[0].getAttribute('id');
personnage[0].removeAttribute('class');
var newClass= '';
for (i=0; i < arrayClassPersonnage.length-1; i++){
newClass= newClass+' '+arrayClassPersonnage[i];
}
document.getElementById(id).setAttribute('class', newClass);
var resultat = JSON.parse(xhr.responseText);
alert(resultat['message']);
}
我总是说“假”。我试着这样做:
$response = new JsonResponse();
return $response->setData(array('message' => 'Ok.'));
因此,在没有$request->isXmlHttpRequest()的情况下,我发现服务器500出现了一个内部错误。请帮帮我,我疯了 查看一个方法的代码时,检查该方法的功能总是有助于找到代码问题的解决方案。如果选中
isXmlHttpRequest
方法,您可以在其dockblock中看到如下内容:
如果您的JavaScript库设置了一个X-Requested-With HTTP头,它就可以工作
方法主体为:
return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
然后,您需要添加正确的标题(大多数JS框架/库默认情况下都会添加该标题,例如,请参见滚动到headers
部分):
我尝试了一个更简单的例子,却犯了同样的错误。我点击按钮,我想要的消息 下面是按钮和脚本:
<button onclick="affichage()">Appuyer</button>
<script>
function affichage(){
if (window.XMLHttpRequest)
{
xhr = new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.onreadystatechange = function()
{
if(xhr.readyState == 4)
{
if(xhr.status == 200)
{
var resultat = JSON.parse(xhr.responseText);
alert(resultat['message']);
}
else
{
alert('Erreur');
}
}
};
xhr.open("POST", "{{ path('deplacement') }}", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(null);
}
</script>
Appuyer
函数affichage(){
if(window.XMLHttpRequest)
{
xhr=newXMLHttpRequest();
}
else if(window.ActiveXObject)
{
xhr=新的ActiveXObject(“Microsoft.XMLHTTP”);
}
xhr.onreadystatechange=函数()
{
if(xhr.readyState==4)
{
如果(xhr.status==200)
{
var resultat=JSON.parse(xhr.responseText);
警报(resultat['message']);
}
其他的
{
警惕(“错误”);
}
}
};
open(“POST”,“{path('deplacement')}}”,true);
setRequestHeader(“内容类型”,“应用程序/x-www-form-urlencoded”);
xhr.send(空);
}
这里是路径为('deplacement')的文件:
setData(数组('message'=>'Ok');
}
否则{
$response=新的JsonResponse();
返回$response->setData(数组('message'=>$request->isXmlHttpRequest());
}
}
}
我在xhr.send(null)中遇到了错误:无法加载资源服务器响应,状态为500
我只是想用这个来纠正真正的代码。也许可以检查一下你是否已经关闭了所有的
}
如果你不给我们看真正运行的代码,我们最终会发现一些愚蠢的错误,错过大图。}所有的代码都关闭了。我在另一篇文章中发布了一个更简单的示例,但也犯了同样的错误;对于后méthod。有什么问题吗?没关系(无需触摸),您还必须添加X-request-with
标题。我的印象是,这个标题实际上是由低级XMLHttpRequest
添加的,而不是在使用它的高级库/框架中添加的,不是吗?@jcaron nopeX-request-With
只是一个标题约定,它不是XHR规范的一部分。请编辑原始帖子,更新原始问题,不要将其作为答案发布。您应该将其作为另一个问题发布。人们不会在答案中寻找问题
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
<button onclick="affichage()">Appuyer</button>
<script>
function affichage(){
if (window.XMLHttpRequest)
{
xhr = new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.onreadystatechange = function()
{
if(xhr.readyState == 4)
{
if(xhr.status == 200)
{
var resultat = JSON.parse(xhr.responseText);
alert(resultat['message']);
}
else
{
alert('Erreur');
}
}
};
xhr.open("POST", "{{ path('deplacement') }}", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(null);
}
</script>
<?php
namespace GameBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
class ResolutionController extends Controller
{
/**
* @Route("/game/combat/test", name="deplacement")
*/
public function deplacementAction(Request $request){
$request = $this->get('request');
if($request->isXmlHttpRequest())
{
$response = new JsonResponse();
return $response->setData(array('message' => 'Ok.'));
}
else{
$response = new JsonResponse();
return $response->setData(array('message' => $request->isXmlHttpRequest()));
}
}
}