我正在开发一个应用程序,该应用程序比较不同浏览器中呈现的 DOM 以找出差异。我将其视为进行屏幕截图比较的替代方法。此外,这可以通过编程方式完成,误报更少(至少我是这么想的)。
我按照此处的建议通过 element.getBoundingClientRect() 计算元素的实际位置:retrieve the position x y of an html element .
我在 Firefox 和 Chrome 上尝试过,并从中生成了一个 JSON DOM 结构。现在我真的很困惑我得到了什么。我知道浏览器在子像素级别上处理像素值的方式不同,但它并不像 Chrome 总是有四舍五入的数字而 Firefox 总是有分数。它几乎总是这样:
火狐
{
"name": "SPAN",
"style": {
"display": "block",
"top": "1390.5",
"left": "824.61669921875",
"width": "123.38333129882812",
"height": "27"
}
}
Chrome
{
"name": "SPAN",
"style": {
"display": "block",
"top": "1390",
"left": "824.640625",
"width": "123.359375",
"height": "27"
}
}
chrome 中的 top 值始终是一个整数,而在 firefox 中它始终 是相同的值,但高出 .5 或 .25。
高度 比 chrome 高 1 或 0.5。
在这两种浏览器中,所有其他值有时都是分数。如果它们是分数,则它们永远不会相等(firefox 总是具有更高的值)。如果它们是整数,则它们是相同的。
我从来没想过会有这样的事情发生。特别是关于 top 和 height 值的奇怪之处。我会认为渲染只是不同,这会导致(不规则!!)不同的像素值。
所以我的问题是:如果我进行这种比较,是否可以从中得出任何规则?有谁知道firefox的舍入规则?或者我是否必须进行容忍 比较,检查值之间的距离是否超过 1 个单位?
更新:
如果您想自己快速检查一下,只需转至 http://example.com/ (因为它有一个非常小的 DOM)并在 firefox 和 chrome 的 javascript 控制台中输入 document.getElementsByTagName("body")[0].getBoundingClientRect()。 Y、height 和 top 值在 firefox 中是非常长的浮点值,而在 chrome 中它们更短且奇怪地四舍五入。
最佳答案
ClientRect()的返回值是TextRectangle,看这里:https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIDOMClientRect
所有坐标都是相对于视口(viewport)的,它的大小在不同的浏览器中是不同的。浏览器实际屏幕空间(视口(viewport)减去选项卡、工具栏、用户界面等)、子像素渲染的不同算法、字体渲染、内联 block 元素周围的空白大小(取决于默认字体大小)——这些都是影响视口(viewport)的因素尺寸,可能还有更多。更重要的是,这些因素经常随着每个新浏览器版本的不同而变化(加上用户可以更改设置),因此任何通过比较计算值得出的规则可能值(value)有限(如果有的话)。
至于处理子像素值,我建议始终使用 Math.floor 来防止任何不必要的布局破坏或调整设计以针对浏览器变化更加灵活。
关于html - DOM 元素在像素级别(宽度、高度...)的浏览器渲染差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27111584/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我有一个rubyonrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用
我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'