网络浏览器如何处理网页的 JavaScript 内容? JavaScript 内容是否被解析为 DOM 然后呈现?
我不需要规范,但我需要知道它是如何完成的。请告诉我在网页上处理 JavaScript 内容的整个过程。
最佳答案
script网页的各个部分由浏览器的 JavaScript 解释器处理,它可能是浏览器的固有部分,但通常是一个不同的模块,有时甚至是一个完全不同的项目(Chrome 使用 V8;IE 使用 JScript;Firefox 使用 SpiderMonkey 等)。 ).
当 HTML 解析器到达 script 时元素,解析器所做的全部 是读取并存储直到结尾</script> 的文本。标记(或检索通过 src 属性引用的文件)。然后,除非作者使用了 defer or async attributes ,所有 HTML 解析和呈现都戛然而止,HTML 解析器将脚本文本交给 JavaScript 解释器。 JavaScript 解释器在 window 的上下文中解释 JavaScript 代码。对象,完成后返回给 HTML 解析器,然后 HTML 解析器可以继续解析和显示页面。这种停止一切并运行 JavaScript 就是为什么一些知名人士 recommend putting scripts at the bottom页面以改善感知加载时间。这也意味着 script标记按顺序处理,如果一个脚本依赖另一个脚本,这一点很重要。如果defer或 async使用属性,脚本执行可以推迟到以后在支持它的浏览器上。页面上的所有脚本都在相同的全局执行上下文中执行,共享相同的全局命名空间和内存区域(因此可以相互交互)。
一旦页面被解析和呈现,就会发生各种事件——用户可以点击某些东西,浏览器窗口可以调整大小,鼠标可以移动到元素上。由于位于 script 中而运行的 JavaScript 代码标记可以“ Hook ”这些事件,请求浏览器在事件发生时调用 JavaScript 中的函数。这允许 JavaScript 具有交互性——例如,用户单击页面上的一个元素,浏览器告诉 JavaScript 解释器它应该运行函数 X。在 JavaScript 代码中。
正如您在上面看到的,有两种不同的情况可以运行 JavaScript 代码:正在初始处理),在解析/呈现过程(延迟脚本和响应事件运行的代码)之后。在解析/渲染过程中运行的 JavaScript 可以通过 script 直接将内容输出到 HTML 解析器。功能。在解析/渲染完成后运行的 JavaScript 不能这样做,当然,但是可以使用非常强大的 DOM HTML API与 DOM 交互。
可能值得注意的是 defer 元素:在启用了 JavaScript 的浏览器中,async元素被完全跳过。在没有 JavaScript 或禁用 JavaScript 的浏览器中,document.write元素被完全跳过并且 noscript改为读取元素。这使得包含仅当呈现页面时在浏览器上启用或未启用 JavaScript 时才会显示的内容变得容易。
推荐阅读:
关于javascript - 浏览器如何处理 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4243055/
我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
使用ruby的watir测试网络应用程序时,浏览器最后会保持打开状态。网上的一些建议是,要进行真正的单元测试,您应该在每次测试时(在拆卸调用中)打开和关闭浏览器,但这很慢而且毫无意义。或者他们做这样的事情:defself.suites=superdefs.afterClass#Closebrowserenddefs.run(*args)superafterClassendsend但这会导致摘要输出不再显示(诸如“100次测试、100次断言、0次失败、0次错误”之类的内容仍应显示)。我怎样才能让ruby或watir在我的测试结束时关闭浏览器? 最佳答案
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan