Javascript 让php正确格式化jsonp响应以填充div

Javascript 让php正确格式化jsonp响应以填充div,javascript,php,jquery,ajax,jsonp,Javascript,Php,Jquery,Ajax,Jsonp,我已经花了好几天的时间寻找这个问题的答案,我已经接近了,但我似乎无法让它真正起作用 我希望example1.com向example2.com提交一个请求,example2.com处理该请求,example1.com在div中显示输出,而不重新加载页面 以下是我所拥有的: example1.com(html) 注意:为了进行测试,我在ajax调用中添加了一些设置,试图从URL中删除回调和时间戳。当我直接导航到页面时,没有它们也可以正常工作,但是当我尝试使用修改后的URL(带有回调和时间戳)直接导航

我已经花了好几天的时间寻找这个问题的答案,我已经接近了,但我似乎无法让它真正起作用

我希望example1.com向example2.com提交一个请求,example2.com处理该请求,example1.com在div中显示输出,而不重新加载页面

以下是我所拥有的:

example1.com(html)

注意:为了进行测试,我在ajax调用中添加了一些设置,试图从URL中删除回调和时间戳。当我直接导航到页面时,没有它们也可以正常工作,但是当我尝试使用修改后的URL(带有回调和时间戳)直接导航时失败

理想情况下,我不希望使用添加的设置删除回调,但我不知道如何使用php处理它以获得响应

以下是apache访问日志:

[09/May/2015:14:32:20 -0700] "GET /process.php?cmd=online HTTP/1.1" 200 1110  // Without callback and timestamp

[09/May/2015:14:31:16 -0700] "GET /process.php?callback=jQuery172026217079092748463_1431207074531&cmd=online&_=1431207076762 HTTP/1.1" 200 4765  // With callback and timestamp
下面是我在php中处理请求的内容。(同样,当我直接导航到文件时,这会在浏览器中产生一些预期的输出)

example2.com/process.php

header('Content-Type: text/javascript; charset=utf8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Max-Age: 3628800');
header('Access-Control-Allow-Methods: GET, POST');

if ($_GET[cmd] == "online") {
$output = shell_exec('some server side commands');
$oparray = preg_split('/[\s,]+/', $output);
$odd = preg_split('/[\s,]+/', $output);
$even = preg_split('/[\s,]+/', $output);
foreach ($oparray as $key => $value) {
  if (0 == $key % 2) {
    $even[] = $value;
    //echo $_GET['callback'] . '('.json_encode($value).')';  //this didn't work
    $json = json_encode($value);
    $jsonp_callback = isset($_GET['callback']) ? $_GET['callback'] : null;
    print $jsonp_callback ? "$jsonp_callback($json)" : $json;
  }
  else {
    $odd[] = $value;
    // echo $_GET['callback'] . '('.json_encode($value).')';  //this didn't work
    $json = json_encode($value);
    $jsonp_callback = isset($_GET['callback']) ? $_GET['callback'] : null;
    print $jsonp_callback ? "$jsonp_callback($json)" : $json;
  }
 }
}
if (isset($_GET[jsonp]) && $_GET[cmd] == "online") {
  header('Content-Type: text/javascript; charset=utf8');
  header('Access-Control-Allow-Origin: *');
  header('Access-Control-Max-Age: 3628800');
  header('Access-Control-Allow-Methods: GET, POST, OPTION');
  $output = shell_exec('some server side commands');
  $callback = $_GET[jsonp];
  $array = array($output);
  $json = json_encode($array);
  echo $callback.'('.$json.');';
}
现在我相当自信,就jsonp而言,我没有正确地处理这个问题,但我似乎没有得到任何有用的错误。我尝试添加
console.log(错误)到错误设置,在firebug的控制台中仅显示202成功

error: function(error){
        console.log(error);
    }
我还尝试了
警报(错误)在弹出窗口中显示了
对象对象


我们非常感谢您对我们的帮助

以下是对我有用的东西

example1.com(HTML)(保持不变)

由于jsonp使用回调修改url,我在example2.com/process.php中添加了一个检查,并使用回调正确格式化字符串

这是它的样子

example2.com/process.php

header('Content-Type: text/javascript; charset=utf8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Max-Age: 3628800');
header('Access-Control-Allow-Methods: GET, POST');

if ($_GET[cmd] == "online") {
$output = shell_exec('some server side commands');
$oparray = preg_split('/[\s,]+/', $output);
$odd = preg_split('/[\s,]+/', $output);
$even = preg_split('/[\s,]+/', $output);
foreach ($oparray as $key => $value) {
  if (0 == $key % 2) {
    $even[] = $value;
    //echo $_GET['callback'] . '('.json_encode($value).')';  //this didn't work
    $json = json_encode($value);
    $jsonp_callback = isset($_GET['callback']) ? $_GET['callback'] : null;
    print $jsonp_callback ? "$jsonp_callback($json)" : $json;
  }
  else {
    $odd[] = $value;
    // echo $_GET['callback'] . '('.json_encode($value).')';  //this didn't work
    $json = json_encode($value);
    $jsonp_callback = isset($_GET['callback']) ? $_GET['callback'] : null;
    print $jsonp_callback ? "$jsonp_callback($json)" : $json;
  }
 }
}
if (isset($_GET[jsonp]) && $_GET[cmd] == "online") {
  header('Content-Type: text/javascript; charset=utf8');
  header('Access-Control-Allow-Origin: *');
  header('Access-Control-Max-Age: 3628800');
  header('Access-Control-Allow-Methods: GET, POST, OPTION');
  $output = shell_exec('some server side commands');
  $callback = $_GET[jsonp];
  $array = array($output);
  $json = json_encode($array);
  echo $callback.'('.$json.');';
}

工作起来很有魅力。

内容类型
标题也需要以输出类型为条件。还将type
选项
添加到允许的方法中。应该有足够多的头,甚至不需要jsonp。如果未指定jsonp,浏览器将发送一个prefilight请求(选项),并仅发送json,以查看远程域是否启用了CORS…如果选项返回正确的标题作为jsonp在ajax中的错误,则发送完整请求…jQuery API文档将告诉您jsonp不提供错误回调。但是,您可以在浏览器开发工具(f12)的网络选项卡中检查实际的响应主体…以准确查看您得到的反馈OK,因此我尝试不使用jsonp,以便查看错误是什么。我收到了状态文本“错误”。我还试着简单地回显$value,看看是否能得到一个响应。。。没有什么。我确实注意到,我的任何标记都没有得到任何ResponseHeader或RequestHeader。我将检查实际响应,并将结果发回。
$('#peers').submit(function() { // catch the form's submit event
  $.ajax({ // create an AJAX call...
    cache: true, // remove jsonp callback from url
    dataType: "jsonp", // use jsonp for cross domain requests
    jsonp: "jsonp", // set callback option in url
    jsonpCallback: "peers",  /set callback for response string
    data: $(this).serialize(), // get the form data
    type: $(this).attr('method'), // GET or POST
    url: $(this).attr('action'), // the file to call
    success: function(result) { // on success..
        $('#response').text(result); // update the DIV
    }
  });
return false; // cancel original event to prevent form submitting
});
if (isset($_GET[jsonp]) && $_GET[cmd] == "online") {
  header('Content-Type: text/javascript; charset=utf8');
  header('Access-Control-Allow-Origin: *');
  header('Access-Control-Max-Age: 3628800');
  header('Access-Control-Allow-Methods: GET, POST, OPTION');
  $output = shell_exec('some server side commands');
  $callback = $_GET[jsonp];
  $array = array($output);
  $json = json_encode($array);
  echo $callback.'('.$json.');';
}