{"id":2523,"date":"2020-03-31T11:41:09","date_gmt":"2020-03-31T03:41:09","guid":{"rendered":"http:\/\/www.yuguoxy.com\/geekhome\/?p=2523"},"modified":"2020-03-31T11:41:09","modified_gmt":"2020-03-31T03:41:09","slug":"jsonp%e7%9a%84%e5%8e%9f%e7%90%86%e4%b8%8e%e5%ae%9e%e7%8e%b0","status":"publish","type":"post","link":"https:\/\/ai.zhousir.top\/?p=2523","title":{"rendered":"jsonp\u7684\u539f\u7406\u4e0e\u5b9e\u73b0"},"content":{"rendered":"<h4>1\u3001\u6982\u8ff0<\/h4>\n<p>jsonp\u662f\u4e00\u79cd\u8de8\u57df\u901a\u4fe1\u7684\u624b\u6bb5\uff0c\u5b83\u7684\u539f\u7406\u5176\u5b9e\u5f88\u7b80\u5355\uff1a<\/p>\n<ol>\n<li>\u9996\u5148\u662f\u5229\u7528script\u6807\u7b7e\u7684src\u5c5e\u6027\u6765\u5b9e\u73b0\u8de8\u57df\u3002<\/li>\n<li>\u901a\u8fc7\u5c06\u524d\u7aef\u65b9\u6cd5\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u5230\u670d\u52a1\u5668\u7aef\uff0c\u7136\u540e\u7531\u670d\u52a1\u5668\u7aef\u6ce8\u5165\u53c2\u6570\u4e4b\u540e\u518d\u8fd4\u56de\uff0c\u5b9e\u73b0\u670d\u52a1\u5668\u7aef\u5411\u5ba2\u6237\u7aef\u901a\u4fe1\u3002<\/li>\n<li>\u7531\u4e8e\u4f7f\u7528script\u6807\u7b7e\u7684src\u5c5e\u6027\uff0c\u56e0\u6b64\u53ea\u652f\u6301get\u65b9\u6cd5<\/li>\n<\/ol>\n<h4>2\u3001\u5b9e\u73b0\u6d41\u7a0b<\/h4>\n<ol>\n<li>\u8bbe\u5b9a\u4e00\u4e2ascript\u6807\u7b7e<\/li>\n<\/ol>\n<pre><code class=\"language-js\" lang=\"js\">&lt;script src=\"http:\/\/jsonp.js?callback=xxx\"&gt;&lt;\/script&gt;\r\n<\/code><\/pre>\n<p>&nbsp;<\/p>\n<ol>\n<li>callback\u5b9a\u4e49\u4e86\u4e00\u4e2a\u51fd\u6570\u540d\uff0c\u800c\u8fdc\u7a0b\u670d\u52a1\u7aef\u901a\u8fc7\u8c03\u7528\u6307\u5b9a\u7684\u51fd\u6570\u5e76\u4f20\u5165\u53c2\u6570\u6765\u5b9e\u73b0\u4f20\u9012\u53c2\u6570\uff0c\u5c06fn(response)\u4f20\u9012\u56de\u5ba2\u6237\u7aef<\/li>\n<\/ol>\n<pre><code class=\"language-js\" lang=\"js\">$callback = !empty($_GET['callback']) ? $_GET['callback'] : 'callback';\r\necho $callback.'(.json_encode($data).)';\r\n<\/code><\/pre>\n<p>&nbsp;<\/p>\n<ol>\n<li>\u5ba2\u6237\u7aef\u63a5\u6536\u5230\u8fd4\u56de\u7684js\u811a\u672c\uff0c\u5f00\u59cb\u89e3\u6790\u548c\u6267\u884cfn(response)<\/li>\n<\/ol>\n<h4>3\u3001jsonp\u7b80\u5355\u5b9e\u73b0<\/h4>\n<p>\u4e00\u4e2a\u7b80\u5355\u7684jsonp\u5b9e\u73b0\uff0c\u5176\u5b9e\u5c31\u662f\u62fc\u63a5url\uff0c\u7136\u540e\u5c06\u52a8\u6001\u6dfb\u52a0\u4e00\u4e2ascript\u5143\u7d20\u5230\u5934\u90e8\u3002<\/p>\n<pre><code class=\"language-js\" lang=\"js\">function jsonp(req){\r\n    var script = document.createElement('script');\r\n    var url = req.url + '?callback=' + req.callback.name;\r\n    script.src = url;\r\n    document.getElementsByTagName('head')[0].appendChild(script); \r\n}\r\n<\/code><\/pre>\n<p>\u524d\u7aefjs\u793a\u4f8b<\/p>\n<pre><code class=\"language-js\" lang=\"js\">function hello(res){\r\n    alert('hello ' + res.data);\r\n}\r\njsonp({\r\n    url : '',\r\n    callback : hello \r\n});\r\n<\/code><\/pre>\n<p>\u670d\u52a1\u5668\u7aef\u4ee3\u7801<\/p>\n<pre><code class=\"language-js\" lang=\"js\">var http = require('http');\r\nvar urllib = require('url');\r\n\r\nvar port = 8080;\r\nvar data = {'data':'world'};\r\n\r\nhttp.createServer(function(req,res){\r\n    var params = urllib.parse(req.url,true);\r\n    if(params.query.callback){\r\n        console.log(params.query.callback);\r\n        \/\/jsonp\r\n        var str = params.query.callback + '(' + JSON.stringify(data) + ')';\r\n        res.end(str);\r\n    } else {\r\n        res.end();\r\n    }\r\n    \r\n}).listen(port,function(){\r\n    console.log('jsonp server is on');\r\n});\r\n<\/code><\/pre>\n<p>\u7136\u800c\uff0c\u8fd9\u4e2a\u5b9e\u73b0\u867d\u7136\u7b80\u5355\uff0c\u4f46\u6709\u4e00\u4e9b\u4e0d\u8db3\u7684\u5730\u65b9\uff1a<br \/>\n\u6211\u4eec\u4f20\u9012\u7684\u56de\u8c03\u5fc5\u987b\u662f\u4e00\u4e2a\u5168\u5c40\u65b9\u6cd5\uff0c\u6211\u4eec\u90fd\u77e5\u9053\u8981\u5c3d\u91cf\u51cf\u5c11\u5168\u5c40\u7684\u65b9\u6cd5\u3002<br \/>\n\u9700\u8981\u52a0\u5165\u4e00\u4e9b\u53c2\u6570\u6821\u9a8c\uff0c\u786e\u4fdd\u63a5\u53e3\u53ef\u4ee5\u6b63\u5e38\u6267\u884c\u3002<\/p>\n<h4>4\u3001 \u53ef\u9760\u7684jsonp\u5b9e\u73b0<\/h4>\n<pre><code class=\"language-js\" lang=\"js\">(function (global) {\r\n   var id = 0,\r\n    container = document.getElementsByTagName(\"head\")[0];\r\n\r\n    function jsonp(options) {\r\n      if(!options || !options.url) return;\r\n    \r\n        var scriptNode = document.createElement(\"script\"),\r\n            data = options.data || {},\r\n            url = options.url,\r\n            callback = options.callback,\r\n            fnName = \"jsonp\" + id++;\r\n    \r\n        \/\/ \u6dfb\u52a0\u56de\u8c03\u51fd\u6570\r\n        data[\"callback\"] = fnName;\r\n    \r\n        \/\/ \u62fc\u63a5url\r\n        var params = [];\r\n        for (var key in data) {\r\n            params.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(data[key]));\r\n        }\r\n        url = url.indexOf(\"?\") &gt; 0 ? (url + \"&amp;\") : (url + \"?\");\r\n        url += params.join(\"&amp;\");\r\n        scriptNode.src = url;\r\n    \r\n        \/\/ \u4f20\u9012\u7684\u662f\u4e00\u4e2a\u533f\u540d\u7684\u56de\u8c03\u51fd\u6570\uff0c\u8981\u6267\u884c\u7684\u8bdd\uff0c\u66b4\u9732\u4e3a\u4e00\u4e2a\u5168\u5c40\u65b9\u6cd5\r\n        global[fnName] = function (ret) {\r\n            callback &amp;&amp; callback(ret);\r\n            container.removeChild(scriptNode);\r\n            delete global[fnName];\r\n        }\r\n    \r\n        \/\/ \u51fa\u9519\u5904\u7406\r\n        scriptNode.onerror = function () {\r\n            callback &amp;&amp; callback({error:\"error\"});\r\n            container.removeChild(scriptNode);\r\n            global[fnName] &amp;&amp; delete global[fnName];\r\n        }\r\n    \r\n        scriptNode.type = \"text\/javascript\";\r\n        container.appendChild(scriptNode)\r\n    }\r\n    \r\n    global.jsonp = jsonp;\r\n\r\n})(this);\r\n<\/code><\/pre>\n<p>\u4f7f\u7528\u793a\u4f8b<\/p>\n<pre><code class=\"language-js\" lang=\"js\">jsonp({    \r\n    url : \"www.example.com\",   \r\n    data : {id : 1},    \r\n    callback : function (ret){    \r\n     console.log(ret);    }\r\n    }\r\n);\r\n<\/code><\/pre>\n<p>\u672c\u6587\u5b8c~<\/p>\n<p>\u6765\u6e90 | <a class=\"url\" href=\"https:\/\/segmentfault.com\/a\/1190000007665361#articleHeader1\" target=\"_blank\">https:\/\/segmentfault.com\/a\/1190000007665361#articleHeader1<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1\u3001\u6982\u8ff0 jsonp\u662f\u4e00\u79cd\u8de8\u57df\u901a\u4fe1\u7684\u624b\u6bb5\uff0c\u5b83\u7684\u539f\u7406\u5176\u5b9e\u5f88\u7b80\u5355\uff1a \u9996\u5148\u662f\u5229\u7528script\u6807\u7b7e\u7684src\u5c5e\u6027\u6765\u5b9e\u73b0\u8de8 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[105,118],"tags":[119],"_links":{"self":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts\/2523"}],"collection":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2523"}],"version-history":[{"count":1,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts\/2523\/revisions"}],"predecessor-version":[{"id":2524,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts\/2523\/revisions\/2524"}],"wp:attachment":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2523"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2523"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}