百度地图引用时,报错A parser-blocking, cross site (i.e. different eTLD+1) script

本文介绍了在使用百度地图API时遇到的一个加载错误,并详细解释了可能的原因及解决方法。通过将URL从api更改为getscript,成功解决了由document.write()引起的跨域问题。
问题:

百度地图引用时,报错api?v=2.0&ak=MqgPRehwsDncQGZrRLg6OojcU8oSOYR2:1 A parser-blocking, cross site (i.e. different eTLD+1) script, https://api.map.baidu.com/getscript?v=2.0&ak=MqgPRehwsDncQGZrRLg6OojcU8oSOYR2&services=&t=20210113094335, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message. See https://www.chromestatus.com/feature/5718547946799104 for more details.

原因:

暂不明,大概是因为某个地方用了document.write()吧。

解决方法:

修改api引用url,api改成getscript就行

//修改前
<script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=####################"></script>
//修改后
<script type="text/javascript" src="https://api.map.baidu.com/getscript?v=2.0&ak=##########################"></script>
在引入百度地图 API ,若使用 `document.write` 动态加载脚本,浏览器可能会出现警告:“A parser-blocking, cross site (i.e. different eTLD+1) script...”,该警告表明当前加载的脚本可能会阻塞 HTML 解析器,并且由于跨域原因,未来版本的浏览器可能会阻止该请求。这通常发生在 React 或 Vue 等现代前端框架中,因为这些框架倾向于在 DOM 加载后动态插入脚本。 ### 原因分析 该警告的核心问题在于: - **跨域脚本加载**:脚本来自与当前页面不同的域(如 `api.map.baidu.com`)。 - **使用 `document.write`**:在页面加载完成后调用 `document.write` 会重新打开文档流并阻塞页面解析,影响性能与安全性。 ### 解决方案 #### 1. 使用 `async` 或 `defer` 属性 在 `<script>` 标签中添加 `async` 或 `defer` 属性,可以让浏览器异步加载脚本,避免阻塞 HTML 解析器: ```html <script type="text/javascript" src="https://api.map.baidu.com/api?type=webgl&v=1.0&ak=您的密钥" async ></script> ``` - `async`:脚本一旦下载完成就立即执行,适用于独立脚本。 - `defer`:脚本会在整个页面解析完成后按顺序执行,适用于依赖页面 DOM 的脚本。 #### 2. 动态创建 `<script>` 标签 在 React 或 Vue 中,可以通过 JavaScript 动态创建 `<script>` 标签并插入到 DOM 中,这样可以避免使用 `document.write`: ```javascript useEffect(() => { const script = document.createElement(&#39;script&#39;); script.src = &#39;https://api.map.baidu.com/api?type=webgl&v=1.0&ak=您的密钥&#39;; script.async = true; document.head.appendChild(script); return () => { document.head.removeChild(script); }; }, []); ``` 这种方式不会触发 `document.write` 的警告,并且脚本加载不会阻塞页面渲染。 #### 3. 避免使用 `document.write` 如果第三方库或 API 加载方式依赖 `document.write`,应优先查找其官方文档中推荐的现代加载方式。例如百度地图 API 提供了通过 `<script>` 标签直接引入的方式,应优先使用静态引入而非动态生成。 #### 4. 使用模块化加载器(如 Webpack) 如果项目使用 Webpack 等打包工具,可以尝试使用模块化方式引入地图 API,而不是直接通过 `<script>` 标签加载。例如: ```bash npm install baidu-map ``` 然后在组件中按需引入: ```javascript import BMap from &#39;baidu-map&#39;; ``` 这种方式更符合现代前端开发规范,也避免了跨域脚本加载的问题。 #### 5. 使用服务端代理加载脚本(适用于生产环境) 在跨域问题严重且无法修改第三方脚本加载方式,可以通过服务端代理加载脚本资源。例如在 `vue.config.js` 中配置代理: ```javascript devServer: { proxy: { &#39;/baidu-map&#39;: { target: &#39;https://api.map.baidu.com&#39;, changeOrigin: true, pathRewrite: { &#39;^/baidu-map&#39;: &#39;&#39; } } } } ``` 前端请求 `/baidu-map/api` ,将由本地服务器代理请求百度地图 API,从而绕过跨域限制。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值