XMLHttpRequest() send NS_ERROR_FAILURE for localhost with absolute OR relative path

XMLHttpRequest() send NS_ERROR_FAILURE for localhost with absolute OR relative path

我在 Firefox 31 ESR 中收到以下错误:

Error: NS_ERROR_FAILURE:

Source file:

http://localhost/Example/scripts/index.js Line: 18

这是来自 Internet Explorer 11 的相同内容:

SCRIPT5022: InvalidStateError

这是我的脚本,它调用 AJAX 函数:

ajax('post','standard/','part='+p+'&price='+q,'sequel_sub_object_key');

这是我的 AJAX 函数:

function ajax(method,url,param_id_container_pos,id_container,id_focus,sequel)
{
 var methods = Array('get','head','post');

 if (window.XMLHttpRequest && in_array(method,methods))
 {
  xhr = new XMLHttpRequest();
  xhr.open(method,url,true);//Error triggers here for localhost.

  if (method=='post')
  {
   xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
   xhr.send(param_id_container_pos);
  }

  xhr.send(null);

  xhr.onreadystatechange = function()
  {console.log('xhr.readyState = '+xhr.readyState);
   if (xhr.readyState=='4')
   {
    alert('xhr.responseText = '+xhr.responseText);
   }
  }
 }

显然 Firefox 和 IE 非常模糊 认为我正在执行跨站点脚本...在 localhost?

对于 URL 我已经尝试传递绝对和相对路径:

  1. document.getElementsByTagName('base')[0].href+'standard/'

  2. window.location.href

  3. 'standard'

我查了几十页,其中大部分都在 Stack 上,问题都没有了。

  1. 我对跨站点脚本的意图为零。

  2. 改变method

  3. 我没有使用不同的协议(都是 HTTP,不是 HTTPS)。

  4. 我没有使用 任何 子域。

  5. 从不依赖或削弱我的框架代码。

  6. 关心URL必须是绝对的还是相对的,我只是需要它工作。

  7. 这是一个 Intranet 网站。

  8. 服务器和客户端都是同一台电脑。

  9. 原始 URL 格式为:http://localhost/Client/standard/?http-query

  10. 目标URL是http://localhost/Client/standard/

  11. Apache 访问日志显示请求通过并且 returns HTTP 200。

  12. open

  13. 后紧接着的alert()
  14. None 的 onreadystatechange 状态记录在控制台中。

  15. 调用ajax函数时,并非所有参数都需要设置。

我错过了什么?

您正在为同一个 XHR 对象调用 send() 两次,这可能是错误的来源,因为这会触发 InvalidStateError,因为对象不再打开,它已经在发送.

function ajax(method, url, param_id_container_pos, id_container, id_focus, sequel) {
    ....

        if (method == 'post') {
            xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
            xhr.send(param_id_container_pos); // you're sending here
        }

        xhr.send(null); // and then again here, which triggers an error

        ..........

此外,您通常应该 url 对要发送的数据进行编码

var data = 'part=' + encodeURIComponent(p) +'&price=' + encodeURIComponent(q);
ajax('post', 'standard/', data, 'sequel_sub_object_key');

一起

var data = 'part=' + encodeURIComponent(p) +'&price=' + encodeURIComponent(q);

ajax('post', 'standard/', data, 'sequel_sub_object_key');

function ajax(method, url, param_id_container_pos, id_container, id_focus, sequel) {
    var methods = ['get', 'head', 'post'];

    if (window.XMLHttpRequest && methods.indexOf(method) != -1) {
        var xhr = new XMLHttpRequest();

        xhr.open(method, url, true);

        if (method == 'post') {
            xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
            xhr.send(param_id_container_pos);
        } else {
            xhr.send(null);
        }

        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4 && xhr.status == 200) {
                alert('xhr.responseText = ' + xhr.responseText);
            }
        }
    }
}