在Shiny Server中,我可以通过获取有关客户端的一些信息session$clientData
.在我目前正在使用的项目中
parseQueryString(session$clientData$url_search)
Run Code Online (Sandbox Code Playgroud)
获取URL中的参数.我希望能够获取网络浏览器信息(Google收集的用于分析的信息类型).虽然我可能想知道如何在ASP.NET或PHP可能的JS中做到这一点,但我并不清楚如何在我自己的JS中编织一个Shiny应用程序并将结果信息传递给变量.
如何获取随网页请求一起发送的浏览器信息?
是否有一种简单而自动的方式来检查我的网站(用asp.net编写)的访问者是否正在使用他的浏览器的最新版本?这将允许我显示一条消息,通知他们他们正在运行旧版本,并且他们可能想要升级.
我的网站在大多数broswers上测试,但我不测试旧版本(如Internet Explorer 6等).当我的一个访问者使用这样一个旧版本时,基本上,我想鼓励(而不是强迫)他们升级.
当然,我可以通过获取浏览器的版本并在我的数据库中查找它来自己做,但我不想自己维护一个"浏览器版本"数据库.有任何想法吗?
我使用CognitoIdentityServiceProvider.adminListUserAuthEvents来获取用户身份验证事件,但收到了无效的结果。我从 Opera 登录,但 Cognito 显示我使用的是 Chrome 8(这是一个错误)。
如果我得到原始数据navigator.userAgent
(例如:),我可以解决这个问题Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 OPR/72.0.3815.400
,但我只收到这样的数据:
{
"EventId": ${EVENT_ID},
"EventType": "SignIn",
"CreationDate": ${CREATION_DATE},
"EventResponse": "Pass",
"EventRisk": {
"RiskDecision": "AccountTakeover",
"RiskLevel": "Low",
"CompromisedCredentialsDetected": false
},
"ChallengeResponses": [
{
"ChallengeName": "Password",
"ChallengeResponse": "Success"
}
],
"EventContextData": {
"IpAddress": ${MY_IP_ADDR},
"DeviceName": "Chrome 8, Linux",
"City": ${MY_CITY},
"Country": ${MY_COUNTRY}
}
}
Run Code Online (Sandbox Code Playgroud)
我不想做拐杖来澄清这些信息,例如创建preauth
Cognito 触发器,它将将此信息记录在另一个表中并自己处理此流程
UPD:我在这里找到的检测浏览器的拐杖
UPD 2:官方 AWS Github 存储库 …
我使用a Page.scala
来启动Scala.js应用程序的客户端.因此Page.scala
取代了index.html.Scalatags raw
函数允许包含实际的JavaScript.在Scalatags文档中,示例是alert('Hello!').我实际上有一些JavaScript可以解决浏览器的问题,但是说"你好!" 一开始就好.JavaScript本身就是这里的get_browser_info()
功能.
所以我的问题是,我可以在Scala代码中调用这一点JavaScript吗?这是一种明智的方式来发现用户正在使用的浏览器吗?我想将此信息发送回服务器.
当然我可以将函数转换为Scala,但是检查浏览器的JavaScript并不容易让我阅读 - 我从来都不是一个JavaScript程序员.
翻译会很棒,即使它几乎只能回答核心问题.
编辑@sjrd给出了启动Scala代码的答案.为了给出完整的图片,这就是Page.scala的样子:
object Page{
val boot =
"simple.MyScalaClient().main(document.getElementById('contents'))"
val browserVersionFn = "<script>function get_browser_info(){var ua=navigator.userAgent ... version: M[1]};}</script>"
val skeleton =
html(
head(
meta(charset:="utf-8"),
script(src:= "/myappname/myappname-fastopt.js"),
link(
rel:="stylesheet",
href:="http://yui.yahooapis.com/pure/0.5.0/pure-min.css"
)
),
body(
style := "margin:30",
onload := boot,
div(id:="contents"),
raw(browserVersionFn)
)
)
}
Run Code Online (Sandbox Code Playgroud) 我遇到了一个困扰整个谷歌的问题,但提供的解决方案都没有正常工作。我假设这些解决方案中的大多数都没有考虑跨域。
我有一个网站,我想指导用户将(整页)IFrame 嵌入到他们的网站中。问题仅出现在某些版本的 Safari 上。IFrame 中的元素无法将自身滚动到视图中。
我注意到,如果我进行相同的域测试,IFrame 可以使用window.parent.scrollTo(0,element.top)
. 这有效,但不能跨域。另一个奇怪的事情是没有其他浏览器需要 window.parent 方法来滚动 IFrame,只有 Safari。所有其他浏览器都可以element.scrollIntoView()
在 IFrame 中使用。请注意,我已经使用JavaScript 解决方法来取悦带有跨协议 IFrame 的 Safari。
我只在 IFrame 中的 Safari Mobile 上看到的另一个问题是,当向下滚动时,Bootstrap Modals 出现在 IFrame 的顶部。尽管如此,我确信如果我们可以正确设置滚动位置,我们也应该能够设置模态位置。
这是我尝试过的;
1. window.frames['IFrameName'].document.
getElementById("elmId").scrollIntoView();
Run Code Online (Sandbox Code Playgroud)
我最后的手段(我认为)是在我的 IFrame 中使用 postMessage 来通知父域设置框架的滚动位置。
在我看来,这个问题已经存在了很长时间。还有比这更好的方法吗?
可能重复:
使用javascript检测浏览器类型
检测浏览器版本
如何检测用户使用的浏览器类型和版本?
我尝试了以下代码,但它无法正常工作.
var browserType = navigator.appName;
Alert(browserType);
Run Code Online (Sandbox Code Playgroud) javascript ×3
jquery ×2
iframe ×1
json ×1
r ×1
safari ×1
scala.js ×1
shiny ×1
shiny-server ×1
version ×1