已经实现了一个基本的页面,加上了保存localStorage的代码:
function storeInput(inputStr){
console.log("storeInput: inputStr=%s", inputStr)
localStorage.setItem(LastSearchInputStoreKey, inputStr)
}
function restoreInput(){
console.log("restoreInput")
var savedSearchInput = localStorage.getItem(LastSearchInputStoreKey)
console.log("savedSearchInput=", savedSearchInput)
return savedSearchInput
}在Chrome中正常。
但是去Safari中,结果报错:

jQuery.readyException = function( error ) {
window.setTimeout( function() {
throw error;
} );
};
看起来好像是:
var savedSearchInput = localStorage.getItem(LastSearchInputStoreKey)
报错的。
ios safari localStorage.getItem SecurityError
结论就是:
iOS 11中Safari默认开启了:禁用Cookie
所以还是尽量少用localStorage
把localStorage改为url中传递参数的写法吧
期间遇到:
【已解决】Bootstrap的js中如何在click事件中传递额外参数
【总结】
此处最后用:
每次传入其他url时,把之前输入参数传递到url中:
book_detail.html?book_id=5bd7bf4cbfaa44fe2c74034e&cur_input=apple
中的&cur_input=apple
然后返回来时,解析后拿到cur_input的值,再传回给:
index.html?cur_input=apple
即可实现。
而详情页进入详情页,则也是:
获取当前的cur_input
继续传入下一层的详情页即可。
从而规避使用,会导致iOS触发安全问题而无法正常使用的,localStorage。
代码:
js/main.js
$(document).ready(function(){
console.log("main document ready !")
// console.log($);
function restoreInputAndSearch(){
console.log("restoreInputAndSearch")
var curInputValue = $("#inputQuery").val()
console.log("curInputValue=%s", curInputValue)
if (curInputValue){
ajaxSubmitQuery()
} else {
var preSavedInput = restoreInput()
console.log("preSavedInput=%s", preSavedInput)
if (preSavedInput) {
$("#inputQuery").val(preSavedInput)
console.log("Have restored previous saved search input value: %s", preSavedInput)
ajaxSubmitQuery()
}
}
}
restoreInputAndSearch()
// $(document).on("click", ".single_storybook_item", redirectToDetailPage)
// $(document).on("click", ".single_storybook_item", {curInput: $("#inputQuery").val()}, redirectToDetailPage)
function saveInputAndRedirect(event){
console.log("saveInputAndRedirect: event=%o", event)
console.log("this=%o", this)
var curInput = $("#inputQuery").val()
console.log("curInput=%s", curInput)
event.data = {
"curInput": curInput,
"curElement": this,
}
console.log("event.data=%o", event.data)
// redirectToDetailPage.bind(this)
redirectToDetailPage(event)
}
$(document).on("click", ".single_storybook_item", saveInputAndRedirect)js/book_common.js
// Query String Key for Current Input (Search) String
const CurrentInputQsKey = "cur_input"
function getQueryVariable(variable) {
console.log("getQueryVariable: variable=%s", variable)
var query = window.location.search.substring(1)
console.log("query=%s", query)
var vars = query.split('&')
console.log("vars=%o", vars)
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
console.log("pair=%o", pair)
var decodedPair0 = decodeURIComponent(pair[0])
console.log("decodedPair0=%s", decodedPair0)
if (decodedPair0 == variable) {
var decodedPair1 = decodeURIComponent(pair[1])
console.log("decodedPair1=%s", decodedPair1)
return decodedPair1
}
}
console.log('Query variable %s not found', variable);
}
function redirectToDetailPage(event){
console.log("redirectToDetailPage: event=%o", event)
console.log("event.data=", event.data)
// window.location = $(this).data("href")
var curElement = $(this)
var curInput = undefined
if (event.data){
curElement = $(event.data.curElement)
curInput = event.data.curInput
}
console.log("curElement=", curElement)
console.log("curInput=", curInput)
var bookUrl = curElement.find("#book_url").text()
console.log("bookUrl=", bookUrl)
var bookId = curElement.find("#book_id").text()
console.log("bookId=", bookId)
// window.location = bookUrl
var bookDetailUrl = "book_detail.html"
console.log("bookDetailUrl=", bookDetailUrl)
// localStorage.setItem("cur_book_id", bookId)
// // for debug
// var savedBookId = localStorage.getItem("cur_book_id")
// console.log("savedBookId=", savedBookId)
// window.location = bookDetailUrl
var bookDetailUrlWithPara = bookDetailUrl + "?book_id=" + bookId
if (curInput) {
var encodedCurInput = encodeURIComponent(curInput)
console.log("encodedCurInput=%s", encodedCurInput)
bookDetailUrlWithPara += `&${CurrentInputQsKey}=${encodedCurInput}`
}
console.log("bookDetailUrlWithPara=", bookDetailUrlWithPara)
window.location = bookDetailUrlWithPara
}
// restore previous search input from url
function restoreInput(){
console.log("restoreInput")
// var location = window.location
// console.log("location=%o", location)
// var search = location.search
// console.log("search=%s", search)
var restoredCurInput = getQueryVariable(CurrentInputQsKey)
console.log("restoredCurInput=", restoredCurInput)
return restoredCurInput
}js/book_detail.js
$(document).ready(function(){
console.log("boot detail document ready !")
function backToHome(event){
console.log("backToHome: event=%o", event)
var homeUrl = "index.html"
// console.log("homeUrl=", homeUrl)
// window.location = homeUrl
var restoredInput = restoreInput()
console.log("restoredInput=", restoredInput)
if (restoredInput) {
homeUrl += `?${CurrentInputQsKey}=${restoredInput}`
}
console.log("homeUrl=", homeUrl)
window.location = homeUrl
}
$(document).on("click", "#back_home", backToHome)
// $(document).on("click", ".single_storybook_item", redirectToDetailPage)
function tryGetPassedInputAndRedirect(event){
console.log("tryGetPassedInputAndRedirect: event=%o", event)
console.log("this=%o", this)
var curInput = restoreInput()
console.log("curInput=%s", curInput)
event.data = {
"curInput": curInput,
"curElement": this,
}
console.log("event.data=%o", event.data)
redirectToDetailPage(event)
}
$(document).on("click", ".single_storybook_item", tryGetPassedInputAndRedirect)
实现了效果:
首页中搜索结果后:

点击某个书籍进入详情页:
url是:
book_detail.html?book_id=5bd7bdbabfaa44fe2c739dfa&cur_input=apple
包括我希望传入的cur_input=apple

然后点击详情的推荐列表后:
还是进入详情,然后url中仍然能拿到cur_input=apple

然后点击 详情页内部的左上角按钮返回时:
可以把之前输入的参数传递回去:

然后再去进入详情页,点击 浏览器 向左按钮:

-》用于模拟 手机端 返回 cancel按钮:
(如果之前是第一次进入详情页,就 cancel返回的话)
则url中是没有参数的
但是由于输入框中有之前输入的值,则也是可以获取到并触发搜索的:

转载请注明:在路上 » 【已解决】iOS的Safari中html页面报错:SecurityError: The operation is insecure