模拟实现jsonp

Posted by CodingWithAlice on December 7, 2024

模拟实现jsonp

核心功能:组装 url+callback + 浏览器在 script 打开执行

常见错误:

  • 1、遗忘在 window 上定义回调函数 - 功能:①使用 data值+②清理script标签

    image-20241209213826937

    移除实在 document.body 上移除的,直接在 document 调用会提示错误

    image-20241221155159923

  • 2、判断是否有 ? 时,一定要注意 indexOf 和 includes

    image-20241209213700272

    +(加法运算符)的优先级要高于? :(三元条件运算符)

    image-20241221160221608

function jsonp({ url, params, callback }) {
    // 组装 url + callback
    let paramsStr = Object.entries(params).map(([key, value]) => key + '=' + value).join('&');
    // let paramsStr = Object.keys(params).reduce((pre, cur) => pre + `${cur}=${params[cur]}` , '');
    let suffix = `${paramsStr}&callback=${callback}`;

    // 浏览器在 script 打开执行
    let script = document.createElement('script');
    script.src = url + (url.includes('?') ? `&` : `?`) + suffix;

    // 挂载回调函数 - 服务器返回后需要执行的回调函数
    window[callback] = data => {
        callback[data];
        document.body.removeChild(scriptEle);
    }

    // 添加
    document.body.appendChild(script);
}
// 测试
jsonp({
    url: 'http://localhost:3000/say',
    params: { wd: 'Iloveyou' },
    callback: 'show'
})