我有一个产品在 Flash 中播放视频(如果可用),如果 Flash 不可用则回退到 HTML5。
我无法找到一种方法来确定 JavaScript 是否在具有“沙盒”属性的 iframe 中执行,这对我的解决方案来说是必需的,因为沙盒 iframe 会禁用所有插件。沙盒 iframe 可以像这样简单:
<iframe src="http://www.cross-domain.com/" sandbox="allow-scripts">
为了确定是否启用了 Flash,我使用了 swfobject 的检查 navigator.plugins["Shockwave Flash"].description 的方法,即使在沙盒 iframe 中也会设置该方法。我可以加载 swf 对象,但它不播放。
要重现此问题,请访问 http://jsfiddle.net/max_winderbaum/9cqkjo45/ ,打开你的 chrome inspector 并点击“运行”。跨域站点上的脚本将在沙盒 iframe 的上下文中暂停。
根据 W3 规范 http://dev.w3.org/html5/spec-preview/browsers.html#sandboxing-flag-set ,在 JavaScript 可以访问的文档上应该有一个“事件沙盒标志集”(至少我是这样阅读规范的)。 iframe 的文档上似乎没有设置任何标志。
对于如何检测 JavaScript 是否在沙盒 iframe 中执行,有没有人有任何想法/解决方案?
最佳答案
我会考虑不同类型的 iframe(选择第一种适用的情况):
带有 sandboxed scripts browsing context flag 的 iframe
也就是说,带有 sandbox 的 iframe不包含 allow-scripts 的属性关键字。
这面旗帜 blocks script execution .特别是,您不能使用脚本来检查 iframe 是否已沙盒化。
没有 sandboxed origin browsing context flag 的同源 iframe
也就是说,没有 sandbox 的同源 iframe属性,或带有 sandbox 的同源 iframe包含 allow-same-origin 的属性和 allow-scripts关键字。
在这种情况下,您可以使用 frameElement用于访问框架元素的全局属性(如果未在 iframe 中使用,则返回 null)。
一旦您有了对 iframe 的引用,您就可以使用 hasAttribute或 getAttribute检查它的sandboxed属性。还有 sandboxed属性,它应该返回一个 DOMSettableTokenList(旧浏览器可能会根据旧规范返回一个字符串)。
没有 sandboxed origin browsing context flag 的跨源 iframe
即没有sandbox的跨源iframe属性,或带有 sandbox 的跨源 iframe包含 allow-same-origin 的属性和 allow-scripts关键字。
在这种情况下,使用 frameElement被阻止:
SecurityError异常(exception)。这是由 Chrome 实现的。null。这是由 Firefox 实现的。那么,我认为在这种情况下您无法区分 iframe 是否被沙盒化。但是,由于在跨源 iframe 中使用 allow-same-origin 没有多大用处,请考虑假设 iframe 未被沙盒化。
带有 sandboxed origin browsing context flag 的 iframe
也就是说,带有 sandbox 的 iframe不包含 allow-same-origin 的属性关键字但包含 allow-scripts关键字。
与前面的情况一样,使用 frameElement被屏蔽了。
但是,您可以检测到这种情况,因为 document.domain 将是空字符串。
注意:Firefox 将数据 URI 视为同源,所以没关系。但是,Chrome 将它们视为跨源。然后 frameElement 不起作用并且 document.domain 是空字符串,无论 iframe 是否被沙盒化。您可以检查 location.protocol 是否为 'data:' 字符串以检测数据 URI。
一般,您可以尝试类似的方法
function isSandboxedIframe() {
if (window.parent === window) return 'no-iframe';
try { var f = window.frameElement; } catch(err) { f = null; }
if(f === null) {
if(document.domain !== '') return 'unkown'; // Probably 'non-sandboxed'
if(location.protocol !== 'data:') return 'sandboxed';
return 'unkown'; // Can be 'sandboxed' on Firefox
}
return f.hasAttribute('sandbox') ? 'sandboxed' : 'non-sandboxed';
}
关于javascript - 检测 JavaScript 是否在沙盒 Iframe 中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29435076/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试