问题是 document.referrer 不工作
Posted
技术标签:
【中文标题】问题是 document.referrer 不工作【英文标题】:Problems is document.referrer not working 【发布时间】:2019-11-08 09:51:16 【问题描述】:我目前正在使用 html
文件加载 Web 视图。网络功能在js
文件中处理。这不是问题。
但我的问题是返回按钮。我检查是否有要返回的页面。所以我们使用document.referrer
来显示使用现有服务器的网络视图。
但它不起作用,因为它在创建 ios hybridApp
时在 iOS 内部使用。
所以我检查了history.back()
是否有效。有用。有一个页面可以返回。
有页面需要退回,但是document.referrer
不行。
在html包含js文件中从主页移动到详细页面
location.href = './Detail.html'
Common.js
文件头中的后退按钮功能
alert(document.referrer) // return empty
if (document.referrer)
history.back();
else
location.href = "./Main.html"; // only can do
两个 html 文件(Main,Detail) 使用一个共同的标题。该函数位于Common.js
文件中。我正在使用 Swift5
Main.html
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0,minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover, shrink-to-fit=no">
<meta name="referrer" content="always">
Detail.html
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0,minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover, shrink-to-fit=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="referrer" content="always">
我们如何解决这个问题?
提前致谢。
【问题讨论】:
这能回答你的问题吗? document.referrer exists but is always empty @MosèRaguzzini 这似乎是一个 object-C 解决方案,我正在使用 Swift5。所以很难理解一个解决方案。 这是与 IOS webview 交互的 javascript,伙计。不管包装器是什么。 @MosèRaguzzini 你链接到我的答案有一个链接到它手动设置的标题方法。但答案是对象-C 代码。 @MosèRaguzzini 我从您的链接答案中知道为什么它不起作用,但我不知道根本的解决方案。 【参考方案1】:我找到了另一个解决方案。这是来自Navigating
中的WKWebView
。这使您可以像document.referrer
一样工作。
但是,由于这是WKWebView
的函数,因此需要js
和ios
之间的通信。
-
修改已有js的功能。
Common.js
文件头中的后退按钮功能
var data =
type : "backCheck",
callback : "backCheckCallback"
webkit.messageHandlers.sendMessageToIos.postMessage(data);
-
在 Ios 中接收消息
@available(iOS 8.0, *)
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
if message.name == "sendMessageToIos"
let getMessage = message.body as! NSDictionary
guard getMessage["type"] != nil else
return
let type : String = getMessage["type"] as! String
let callbackName : String = getMessage["callback"] as! String
if type == "backCheck"
let backCheck = WKWebView.canGoBack
self.WKWebView.evaluateJavaScript("\(callbackName)(\(backCheck))", completionHandler: (any, err) -> Void in
print(any ?? "no any")
print(err ?? "no Error")
)
-
在js文件中配置回调函数
function backCheckCallback(backCheck)
if(backCheck)
history.back();
else
location.href = "./Main.html";
【讨论】:
【参考方案2】:现在我的问题已经解决了,但不是根本的解决方案。就我而言,我通过在收到推送消息并移动页面时附加推送参数来解决问题。
斯威夫特
webUrl = "Web/Detail?pram=pram" // current Url
webUrl = "\(webUrl!)&push=Y"
let splitData = webUrl.split(separator: "?")
var myReq : URLRequest!
let mainUrl : String = String(splitData[0])
let mainParameter : String = String(splitData[1])
let url1 = Bundle.main.url(forResource: mainUrl, withExtension: "html")!
let url2 = URL(string: "?" + mainParameter, relativeTo: url1)!
myReq = URLRequest(url: url2)
WKWebView.load(myReq)
JS
if (getParameter("push") != "Y"))
history.back();
else
location.href = "./Main.html"; // only can do
这解决了问题,但我认为会有更好的。请在答案中给我写一个更好的解决方案。
【讨论】:
以上是关于问题是 document.referrer 不工作的主要内容,如果未能解决你的问题,请参考以下文章
带有完整查询字符串的 Javascript document.referrer
如何确定 document.referrer 是不是来自我自己的站点?
JS获取上一访问页面URL地址document.referrer实践2