我一直在向控制台添加日志,以检查不同变量的状态,而不使用Firefox调试器。
然而,在我在main.js文件中添加console.log的许多地方,我收到了以下错误,而不是我给自己的可爱的手写消息:
主线程上的同步XMLHttpRequest已弃用,因为它会对最终用户的体验产生不利影响。更多帮助http://xhr.spec.whatwg.org/
我可以在我的代码使用中添加哪些不会导致此错误的console.log替代品或包装器?
我“做错了”吗?
我一直在向控制台添加日志,以检查不同变量的状态,而不使用Firefox调试器。
然而,在我在main.js文件中添加console.log的许多地方,我收到了以下错误,而不是我给自己的可爱的手写消息:
主线程上的同步XMLHttpRequest已弃用,因为它会对最终用户的体验产生不利影响。更多帮助http://xhr.spec.whatwg.org/
我可以在我的代码使用中添加哪些不会导致此错误的console.log替代品或包装器?
我“做错了”吗?
当前回答
在我的特殊情况下,我呈现了一个没有渲染布局的Rails部分:false,这是重新渲染整个布局,包括<head>标记中的所有脚本。添加渲染布局:false控制器动作修复了这个问题。
其他回答
这个问题是2014年提出的,现在是2019年,所以我想寻找更好的选择是件好事。
你可以简单地在Javascript中使用fetch api,它为你提供了更多的灵活性。
例如,请参阅此代码
fetch('./api/some.json')
.then((response) => {
response.json().then((data) => {
...
});
})
.catch((err) => { ... });
有时候ajax加载一个脚本是必要的,但是延迟文档准备直到脚本加载之后。
jQuery通过holdReady()函数支持这一点。
使用示例:
$.holdReady(true); //set hold
function releaseHold() { $.holdReady(false); } //callback to release hold
$.getScript('script.js', releaseHold); //load script then release hold
实际的脚本加载是异步的(没有错误),但是如果JavaScript的其余部分在文档就绪后运行,那么效果是同步的。
动态脚本通常会使用这个高级特性 加载器,想要加载额外的JavaScript,如jQuery插件 在允许就绪事件发生之前,即使DOM可能发生 准备好了。
文档: https://api.jquery.com/jquery.holdready
2019年1月7日更新
从JQMIGRATE:
jQuery.holdReady() is deprecated Cause: The jQuery.holdReady() method has been deprecated due to its detrimental effect on the global performance of the page. This method can prevent all the code on the page from initializing for extended lengths of time. Solution: Rewrite the page so that it does not require all jQuery ready handlers to be delayed. This might be accomplished, for example, by late-loading only the code that requires the delay when it is safe to run. Due to the complexity of this method, jQuery Migrate does not attempt to fill the functionality. If the underlying version of jQuery used with jQuery Migrate no longer contains jQuery.holdReady() the code will fail shortly after this warning appears.
警告消息可能是由于主线程中的XMLHttpRequest请求将async标志设置为false。
https://xhr.spec.whatwg.org/ synchronous:
Synchronous XMLHttpRequest outside of workers is in the process of being removed from the web platform as it has detrimental effects to the end user's experience. (This is a long process that takes many years.) Developers must not pass false for the async argument when the JavaScript global environment is a document environment. User agents are strongly encouraged to warn about such usage in developer tools and may experiment with throwing an InvalidAccessError exception when it occurs.
未来的方向是只允许工作线程中的xmlhttprequest。这条消息意在发出这方面的警告。
在Chrome浏览器中,按“F12” 开发工具->按F1。 参见设置->通用->外观:“不显示chrome数据保护警告”-设置此复选框。 参见设置->general->Console:“Log XMLHTTPRequest”-设置此复选框。
享受
这种情况发生在我很懒的时候,我将脚本标记作为返回内容的一部分。是这样的:
部分HTML内容:
<div>
SOME CONTENT HERE
</div>
<script src="/scripts/script.js"></script>
至少在我的例子中,如果通过xhr返回这样的HTML内容,就会导致jQuery调用该脚本。该调用带有一个async标志false,因为它假定您需要继续加载脚本。
在这种情况下,最好查看某种类型的绑定框架并返回一个JSON对象,或者根据后端和模板更改加载脚本的方式。
你也可以使用jQuery的getScript()来获取相关的脚本。这是一个小提琴,这只是一个直接复制的jQuery示例,但我没有看到任何警告抛出时,脚本加载的方式。
例子
<script>
var url = "/scripts/script.js";
$.getScript(url);
</script>
http://jsfiddle.net/49tkL0qd/