URL散列是向瀏覽器頁面提供數據的唯一方式嗎?Javascript:將任何數據導入瀏覽器頁面?
例如,我想保存一些用戶設置而不需要服務器端,並從另一臺電腦上的用戶那裏檢索它們。
使用散列可以生成一個URL並要求用戶保存在USB閃存上的URL或快捷方式。
如果還有其他方法可以做到這一點?
URL散列是向瀏覽器頁面提供數據的唯一方式嗎?Javascript:將任何數據導入瀏覽器頁面?
例如,我想保存一些用戶設置而不需要服務器端,並從另一臺電腦上的用戶那裏檢索它們。
使用散列可以生成一個URL並要求用戶保存在USB閃存上的URL或快捷方式。
如果還有其他方法可以做到這一點?
你說: 與散列生成一個網址是可能的。因此,url必須是獨一無二的,才能向瀏覽器頁面提供數據。客戶端確實沒有其他方式。
可以使用哈希保存鏈接。稍後的用戶只需按照該鏈接,JavaScript從中讀取哈希值。 – Somebody 2011-03-22 10:56:03
由於您的網址是使資源唯一(或保存設置)的唯一方式,因此您可以使用它來存儲數據。請注意,只有散列部分不會發送到服務器。對於URL http://www.iana.org/domains/example/page?data=xyz#hash
location
性質:
{
"hash": "#hash",
"host": "www.iana.org",
"hostname": "www.iana.org",
"href": "http://www.iana.org/domains/example/page?data=xyz#hash",
"pathname": "/domains/example/page",
"port": "",
"protocol": "http:",
"search": "?data=xyz"
}
它不建議用這種方式傳輸敏感數據(密碼,個人信息)。即使它在服務器上不可見,它也會在瀏覽器歷史記錄中顯示。
您可以使用encodeURIComponent
函數來轉義特殊字符,如#
或&
。
例哈希的URL像#field:data;field2:data2
(其它分離器可作爲良好):
// default settings
var settings = {
"lang": "en",
"style": "green"
};
// this should be called before the settings are used
function loadSettings() {
// get the part after # and split it by `;`
var hashSettingsArray = location.hash.substr(1).split(";");
for (var i=0; i<hashSettingsArray.length; i++) {
var hashSettingArray = hashSettingsArray[i].split(':');
var key = decodeURIComponent(hashSettingArray[0]);
// if the key exists in the settings object, accept it
if (key in settings) {
// accept #field without value, defaulting to an empty string
var value = hashSettingsArray.length > 1 ? decodeURIComponent(hashSettingArray[1]) : "";
settings[key] = value;
}
}
}
function getSettingsHash() {
var settingsArray = [];
for (var setting in settings) {
var key = encodeURIComponent(setting);
var value = encodeURIComponent(settings[setting]);
settingsArray.push(key + ":" + value);
}
// example return value: #lang:en;style:green
return "#" + settingsArray.join(";");
}
Btw有多少數據可以存儲在一個散列?是否有可能讓一連串的哈希以某種方式在網址中打開?以便它們可以連接並存儲在localStorage或cookie中。 – Somebody 2011-03-22 11:29:53
有關URL的最大長度,請參閱[URL哈希參數的最大長度](http://stackoverflow.com/q/1571753/427545)上的答案。使用多個URL不是一個好主意,爲什麼不創建一個存儲了所有設置的文本字段,以便用戶可以複製它? – Lekensteyn 2011-03-22 11:34:02
是的,但用戶應該打開記事本,將它們複製到記事本,然後將它們保存到USB設備。但使用網址快捷方式一切都更容易。只需拖動url到usb文件夾,然後在另一臺PC上雙擊它。 :)是不是更容易? – Somebody 2011-03-22 11:37:05
也許你應該解釋爲什麼要做出這樣的事情。它是沒有意義的:\如果您希望瀏覽器可移植性,應將設置保存在服務器中。 – tiagoboldt 2011-03-22 10:43:35
我想避免用戶註冊。 – Somebody 2011-03-22 10:50:56
那麼,有查詢字符串'?user = foo&hobby = bar' ...否則您需要服務器端用戶註冊(便攜式)或cookie(不便攜) – BGerrissen 2011-03-22 11:00:03