Jsonp 回调问题:输入文本未定义

Posted

技术标签:

【中文标题】Jsonp 回调问题:输入文本未定义【英文标题】:Jsonp callback issue: input text is undefined 【发布时间】:2013-07-14 10:13:30 【问题描述】:

根据同源策略,我不能使用常规 json 进行 ajax 调用,所以我改用 jsonp。 我有一个简单的输入字段,类名是“newCaller”。 在我的 js 文件中

$(document).on("blur", ".newCaller", function()
  var name = $(this).val();
  var tel = $(this).siblings(".tel").text();
  //console.log(name+tel);
  $.ajax(
    type: 'GET',
    url: 'xxx.xxx.com/phpFunc.php',
    data: ( 'name' : name, 'tel' : tel ),
    dataType: 'jsonp',
    //I tried success instead of jsonpCallback as well
    jsonpCallback: function(data)
      console.log(data);
    
  );
);

这里是php:

<?php
 $name = $_GET['name'];
 $tel = $_GET['tel'];
 echo $name.$tel;
?>

当 ajax 函数被触发时,该字段的值是未定义的。例如,我在文本字段中输入“测试”并触发该功能,请参见下图(对不起,黑线,隐私政策)

我用success回调,返回几乎一样的东西,“xxx is not defined”。 有人可以告诉我如何修复它吗?谢谢!

【问题讨论】:

检查 JSON 语法。您从 PHP 文件返回的不是 JSON。 你没有在php页面中将值转换为json。你需要给$arr=array($name=>$tel);json_encode($arr); 【参考方案1】:

问题主要在服务器端,因为该脚本不足以支持JSONP。

    必须output valid JSON:

    json_encode($name . $tel);
    

    并包括填充(callback):

    echo $_GET['callback'] . '(' . json_encode($name . $tel) . ');';
    

而且,您需要将 jsonCallback 改回 success

【讨论】:

太棒了!这行得通!你是我的英雄!我得到“资源解释为脚本,但使用 MIME 类型文本/html 传输:”。这是什么意思? @nich 啊。您必须指定Content-Typeheader('Content-type: application/javascript');。在echo 之前添加。 再次感谢,我可以再问你一个问题。如何将 $tel 和 $name 提取回我的 js。在我的 php 结束时,我会回显 $name 和 $tel。我试过 $name=$_GET['callback'] 。 '(' . json_encode($name) . ');';和 $tel=$_GET['callback'] 。 '(' . json_encode($name) . ');';.但它不会工作。你能帮我一把吗? @nich 您必须将它们组合在一起输出为一个 JSON 值:json_encode(array($name, $tel))data[0]data[1]。关联数组也可以,但在 JSON 中编码为 Objects:array("name" =&gt; $name, "tel" =&gt; $tel)data.namedata.tel【参考方案2】:

你没有在php页面phpFunc.php.u中将值转换为json需要给

$arr=array($name=>$tel);
json_encode($arr);

因为你是以 json 格式做的..所以你只需要以 json 格式获取数据。但是你以普通文本格式发送所以显示 mime/type 错误

要检查确切的错误试试这个

$(document).on("blur", ".newCaller", function()
 var name = $(this).val();
 var tel = $(this).siblings(".tel").text();
  //console.log(name+tel);
   $.ajax(
  type: 'GET',
   url: 'xxx.xxx.com/phpFunc.php',
   data: ( 'name' : name, 'tel' : tel ),
    error: function(xhr, textStatus, errorThrown) 
    alert(errorThrown);
    //alert(xhr.responseText);
      return false;
         ,
  dataType: 'jsonp',
  //I tried success instead of jsonpCallback as well
  success: function(data)
   console.log(data);
 
 );

);

【讨论】:

感谢您的帮助。我将这两行添加到我的代码中。然后我执行“echo $arr;”。我重新运行我的代码,但仍然得到“资源解释为脚本,但使用 MIME 类型文本/html 传输:”。我做错了什么? ru 在 phpFunc.php 页面中进行 json 编码,并让 jsonpCallback 成功

以上是关于Jsonp 回调问题:输入文本未定义的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的引用错误:未定义回调

JSONP 注入脚本未调用回调

Angular 4:JSONP 注入脚本未调用回调

如何从 angularjs 中的 JSONP 错误回调中获取数据?

JSONP/Ajax 脚本的问题 - 返回“未定义”

内部嵌套回调函数中调用未定义的对象