var script = document.createElement('script'); script.setAttribute('src',url);
window['funcname'] = function(data){ console.log(data); }
这种形式的函数ajax
script.onload = function(){ delete window['funcname']; script.parentNode.removeChild(script); }
var data = {} res.end( `funcname({ data : ${JSON.stringfy(data)} })` );
如上述所示,jsonp 在使用过程当中须要建立标签,声明全局回调函数等繁琐步骤。本文将 jsonp 的细节封装在内部,对外暴露回调的接口。使用者无需考虑 dom 操做,更多考虑在业务层上。express
var uuid = function() { var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''), uuid = new Array(36), rnd=0, r; for (var i = 0; i < 36; i++) { if (i==8 || i==13 || i==18 || i==23) { uuid[i] = '-'; } else if (i==14) { uuid[i] = '4'; } else { if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0; r = rnd & 0xf; rnd = rnd >> 4; uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]; } } return uuid.join(''); };
var script = document.createElement('script') var callbackFunctionKey = (opts && opts.callback) || 'callback' // 避免污染全局变量 var callbackFunctionName = 'jsonp-' + uuid(); script.setAttribute('src', url + '?' + callbackFunctionKey + '=' + callbackFunctionName) window[callbackFunctionName] = function(data){ callback(data); // clean delete window[callbackFunctionName]; script.parentNode.removeChild(script); }
function Jsonp(url,callback,opts){ var uuid = function() { var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''), uuid = new Array(36), rnd=0, r; for (var i = 0; i < 36; i++) { if (i==8 || i==13 || i==18 || i==23) { uuid[i] = '-'; } else if (i==14) { uuid[i] = '4'; } else { if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0; r = rnd & 0xf; rnd = rnd >> 4; uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]; } } return uuid.join(''); }; var script = document.createElement('script') var callbackFunctionKey = (opts && opts.callback) || 'callback' // 避免污染全局变量 var callbackFunctionName = 'jsonp-' + uuid(); script.setAttribute('src', url + '?' + callbackFunctionKey + '=' + callbackFunctionName) window[callbackFunctionName] = function(data){ callback(data); // clean delete window[callbackFunctionName]; script.parentNode.removeChild(script); } document.body.appendChild(script) }
const express = require('express'); const app = express(); app.get('/', function(req, res){ var funcname = req.query['callback']; res.end( ` window['${funcname}']({ data : 'data' }) `); console.log('get'); }) app.listen(3000);