【问题标题】:jqxhr to local server can't find php filejqxhr到本地服务器找不到php文件
【发布时间】:2015-02-10 07:51:50
【问题描述】:

我根据 Cimbali 的建议更新了这个问题。这是现在指定请求的js代码:

......  
function editFiltName($thisFiltCell)    {
  var cellText=$thisFiltCell.text();
  var idx=$thisFiltCell.index(); //alert("idx: idx");
  var newFN=prompt("Enter new filter name below - up to 12 characters.", cellText); 
    switch (newFN)  {
        case    null        : return;   // cancel key hit
        case    cellText    : return;  // no change
        case    ""          : ; //$thisFCell.text('Filter' + (idx+1));
        default             : $thisFiltCell.text(newFN);    
    }   
    var action='updateFiltName';
    var request = MrAjax(action,newFN,idx);
} // end main function
//*******************************************
function MrAjax(action,P1,P2)  { 
    console.log("Ajax-> action: "+action+" P1: "+P1+" P2: "+P2);
    var jqxhr=$.ajax({  
        type: "POST",
        url: "../phpMain/editTblField.php",
        data: {action:action, P1:P1, P2:P2}
    });
    jqxhr.always(function() { console.log("jqxhr.status: " + jqxhr.status ); });
} // end MrAjax

这是我输入一些数据时的控制台输出:

有什么建议吗?请注意,控制台错误之后会立即出现同一文件的“成功”响应。但是php文件仍然没有运行。我没有收到来自服务器的 php 错误响应 - 我也没有看到我放置在 php 文件echo("Got here!); 第一行的嵌入回显。即使我注释掉除该行之外的所有内容也是如此。

我不认为它在 php 代码中,但以防万一,这里是:

<?php
echo "Got here!";
?>  

再次感谢您的观看。

【问题讨论】:

  • 你确定“加载完成”意味着成功吗?收到 404 回复后,不仅加载停止了吗?
  • 我认为你是对的。很好的发现。当我故意将虚假文件路径放入 req 时,我得到相同的控制台输出。 OTOH“完成加载”POST数据到文件对我来说意味着它找到了该文件并“完成”了将数据加载到它。他们为什么还要在消息中包含文件/路径?我已经学习 ajax 几年了,并且非常成功地使用它。但看来我还有办法去掌握它。我想我可以停止寻找隐藏的第二个请求了 :)
  • 如果您在浏览器中复制/粘贴该消息的确切 URL,您可以加载页面?
  • @Cimbali 我离开了我的开发系统,不知何故我当前的文件没有进入我的保管箱,所以我无法测试这个。我应该明天回来。

标签: php ajax target jqxhr


【解决方案1】:

您的错误来自控制台日志中的拼写错误,您混淆了不同语言的连接。

你想要console.log("jqxhr.status: " + jqxhr.status );而不是console.log("jqxhr.status: " . jqxhr.status );

第二个错误似乎是 status 字段不存在(来自您的评论)。但是,来自 jquery 文档,http://api.jquery.com/jQuery.ajax/#jqXHR

从 jQuery 1.5 开始,$.ajax() 返回的 jQuery XMLHttpRequest (jqXHR) 对象是浏览器原生 XMLHttpRequest 对象的超集。例如,它包含 responseText 和 responseXML 属性,以及 getResponseHeader() 方法。当传输机制不是 XMLHttpRequest(例如,JSONP 请求的脚本标记)时,jqXHR 对象会尽可能模拟本机 XHR 功能。

[...]

为了向后兼容 XMLHttpRequest,jqXHR 对象将公开以下属性和方法:

readyState
status
statusText
responseXML and/or responseText when the underlying request responded with xml and/or text, respectively
setRequestHeader(name, value) which departs from the standard by replacing the old value with the new one rather than concatenating the new value to the old one
getAllResponseHeaders()
getResponseHeader()
statusCode()
abort()

我也准备好它是一个 Deferred 对象,所以这个奇怪的行为可能来自试图在状态字段存在之前访问它。尝试等待请求完成。

所以不要使用console.log("jqxhr.status: " + jqxhr.status );,而是使用以下内容:

jqxhr.always(function() { console.log("jqxhr.status: " + jqxhr.status ); });

jqxhr.always(function(data, textStatus, errorThrown) { console.log("jqxhr.status=" + jqxhr.status + " : " + textStatus ); });

【讨论】:

  • 您发现了 console.log 错误。谢谢。更正后,控制台日志现在已经输出消息:'jqxhr.status: undefined'。我已经检查了很多次php文件的位置,没有发现任何问题。我在使用完全相同的文件规范的其他项目中有工作代码:url:“../phpMain/editTblField.php”,该文件显示在 Win 资源管理器和我的 filezilla 中,如图所示。此外,控制台输出的最后一行似乎表明文件已成功加载。
  • 你用的是什么版本的jquery?
  • 所以,我想我这里有 2 个谜题。 1)为什么jqxhr在将第一个记录为定位文件失败后会发出另一个请求? 2)如果第二个请求有效,为什么 php 文件不运行?我只是在注释掉 php 文件中的所有内容后再次尝试,除了回显“到了!”线。仍然没有快乐。
  • 您的建议似乎有道理。我尝试了这两个例子。 1)之后控制台的日志输出为:“jqxhr status:404”。 2)之后它输出“jqxhr status:404:error”。其他控制台行与问题中显示的相同。不过很好的建议。我正在尝试查看是否以某种方式在我的代码中嵌入了 2 个略有不同的请求。
  • 至少你不再得到“未定义”,这是一个好的开始。您可能应该更新您的问题,以便我们能够解决真正的问题,并查看错别字等。
猜你喜欢
  • 2018-07-23
  • 1970-01-01
  • 2014-03-22
  • 2016-06-15
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
相关资源
最近更新 更多