Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jqueryajaxjsonp错误;意外标记“;_Javascript_Jquery_Ajax_Xmlhttprequest_Jsonp - Fatal编程技术网

Javascript jqueryajaxjsonp错误;意外标记“;

Javascript jqueryajaxjsonp错误;意外标记“;,javascript,jquery,ajax,xmlhttprequest,jsonp,Javascript,Jquery,Ajax,Xmlhttprequest,Jsonp,我试图在Chrome中调用跨域的JSONP,但是我不断地返回“未捕获的SyntaxError:意外标记:” 我尝试过:更改响应内容类型,设置xhr标题,JSON.stringify,这里提供的大部分解决方案都是这样,但到目前为止都没有效果:-( 在调试器中,我可以看到响应 {"permalink": "https://www.virustotal.com/url/b5b546fdbb49a2258e951c5e568a52655c65ac56112e39d15af0954a53b36772/an

我试图在Chrome中调用跨域的JSONP,但是我不断地返回“未捕获的SyntaxError:意外标记:” 我尝试过:更改响应内容类型,设置xhr标题,JSON.stringify,这里提供的大部分解决方案都是这样,但到目前为止都没有效果:-(

在调试器中,我可以看到响应

{"permalink": "https://www.virustotal.com/url/b5b546fdbb49a2258e951c5e568a52655c65ac56112e39d15af0954a53b36772/analysis/1360339512/", "url": "http://www.1001freefonts.com/font/BaroqueScript.zip", "response_code": 1, "scan_date": "2013-02-08 16:05:12", "scan_id": "b5b546fdbb49a2258e951c5e568a52655c65ac56112e39d15af0954a53b36772-1360339512", "verbose_msg": "Scan finished, scan information embedded in this object", "filescan_id": "b7e13c0242e9690aba1f3da4b73d9c2e99a9b7fd03f542b55e694a34aaf9eca8-1360339519", "positives": 0, "total": 35, "scans": {"CLEAN MX": {"detected": false, "result": "clean site"}, "MalwarePatrol": {"detected": false, "result": "clean site"}, "ZDB Zeus": {"detected": false, "result": "clean site"}, "K7AntiVirus": {"detected": false, "result": "clean site"}, "Quttera": {"detected": false, "result": "clean site"}, "Yandex Safebrowsing": {"detected": false, "result": "clean site"}, "MalwareDomainList": {"detected": false, "result": "clean site"}, "ZeusTracker": {"detected": false, "result": "clean site"}, "zvelo": {"detected": false, "result": "clean site"}, "Google Safebrowsing": {"detected": false, "result": "clean site"}, "BitDefender": {"detected": false, "result": "clean site"}, "Opera": {"detected": false, "result": "clean site"}, "G-Data": {"detected": false, "result": "clean site"}, "C-SIRT": {"detected": false, "result": "clean site"}, "Sucuri SiteCheck": {"detected": false, "result": "clean site"}, "VX Vault": {"detected": false, "result": "clean site"}, "ADMINUSLabs": {"detected": false, "result": "clean site"}, "SCUMWARE.org": {"detected": false, "result": "clean site"}, "Dr.Web": {"detected": false, "result": "clean site"}, "AlienVault": {"detected": false, "result": "clean site"}, "Malc0de Database": {"detected": false, "result": "clean site"}, "SpyEyeTracker": {"detected": false, "result": "clean site"}, "Phishtank": {"detected": false, "result": "clean site"}, "Avira": {"detected": false, "result": "clean site"}, "Antiy-AVL": {"detected": false, "result": "clean site"}, "Comodo Site Inspector": {"detected": false, "result": "clean site"}, "Malekal": {"detected": false, "result": "clean site"}, "ESET": {"detected": false, "result": "clean site"}, "SecureBrain": {"detected": false, "result": "unrated site"}, "Netcraft": {"detected": false, "result": "clean site"}, "ParetoLogic": {"detected": false, "result": "clean site"}, "URLQuery": {"detected": false, "result": "unrated site"}, "Wepawet": {"detected": false, "result": "unrated site"}, "Minotaur": {"detected": false, "result": "clean site"}}}
我已经在上验证了它,它表明它是一个有效的JSON

以下是响应标题

cache-control:no-cache
content-encoding:gzip
content-length:695
content-type:application/json
date:Wed, 13 Feb 2013 12:00:33 GMT
server:Google Frontend
status:200 OK
vary:Accept-Encoding
version:HTTP/1.1

有人有什么想法/建议吗?

JSONP不是现成的

JSONP通过将结果加载到脚本标记中绕过跨域限制

基本上,服务器必须启用JSONP

在发送响应之前,在服务器端执行任何需要执行的操作:

  • 检查请求是否设置了“\u回调”
  • 如果已设置,请使用_callback的值包装内容
  • 发送您的数据
  • PHP中的代码示例:

    $responseString = '{"smthing":"val","smthingelse":"val2"}';
    if (isset($_REQUEST['_callback'])) {
        $responseString = $_REQUEST['_callback'] . '(' . $responseString . ');';
    }
    

    它将使用正确的参数执行“done”匿名函数。(JQuery处理所有其他事情)

    Christoph是正确的。您需要将答案封装在回调函数中,在PHP文件的末尾:

    echo $_GET['receive'] . '(' . json_encode($yourResultObject) . ');';
    
    或者如果需要更复杂的对象

    echo $_GET['receive'] . '(' . json_encode(array(name1 => object1, name2 => object2, name3 => object3)) . ');';
    

    您可能需要稍作调整,但基本上每当我获得意外标记时,几乎总是一个语法错误,使得jQuery无法获得回调函数。

    经过彻底测试后,很明显,当ajax需要JSONP作为回报时,不可能捕获JSON对象结果(由于跨域限制)。即使响应状态为200

    我一直在使用jQuery AJAX调用进行测试,试图看看结果是否仍然可以被捕获——尽管浏览器抛出了解析错误——但这似乎不可能。看起来,响应文本在JS工作完成后到达标题中


    正如@Florian F.@Likwid_T@Christoph在上文中所建议的那样,服务器端脚本是确保其正常工作所必需的。其他开发人员似乎热衷于使用C#编写的代理作为解决方案。

    对于JSONP,您需要一个functionwrapper。简单的JSON对象不是有效的JSONP响应。服务器实际上能够为JSONP服务吗-响应?同样
    dataType:'jsonp',jsonp:false
    看起来不正确。@Christoph Re
    dataType:'jsonp',jsonp:false
    它们是正确的,在进一步检查之后,查看@Christoph上的文档,服务器似乎只能发回JSON,而不能发回jsonp。我需要找出转换响应的方法。进一步解释对于读者来说,JSON头是
    content-type:application/JSON
    JSONP头应该是这样的
    content-type:application/javascript
    ,我认为他对服务器端没有控制权。否则在大多数情况下,你不必做跨域请求。@Likwid\u不幸的是,没有服务器端脚本可以参与。它必须重新启动main JS。是否可以在JS中应用相同的操作?我的回调函数没有接收到数据,即使我可以在响应头中看到返回的JSON对象结果。等等,我只是重新读取:您在响应中从服务器获取数据?{“permalink”:“…等等?是否正确?如果您控制台.log(数据[”)永久链接“]);你怎么想,他可以修改服务器?如果他在做跨域请求,很可能他没有控制。因为这是目前唯一的解决方案。只有当你控制服务器或服务器本身接受它时,跨域才有用。下一个解决方案是在你自己的域上构建一个代理,将请求转发到Web服务。@Florian.Christoph是对的,我对服务器没有控制权。我的项目仅限于JS。@Eric那么在你自己的服务器上设置代理怎么样?@Florian。这会让生活更轻松,不幸的是,代码必须作为扩展运行。都是JS。
    echo $_GET['receive'] . '(' . json_encode(array(name1 => object1, name2 => object2, name3 => object3)) . ');';