Neo*_*ile 80 javascript jquery form-submit persistent-storage
我正在尝试捕获我的表单的提交按钮按下,如果表单已提交,页面刷新,我会显示一些隐藏的字段.我想捕获表单是否已经提交之前,如果它是在重新加载时提交的,我想取消隐藏隐藏的字段.我试图使用全局变量来实现这一点,但是我无法使其正常工作.
这是我尝试过的:
var clicked = false;
$(document).ready(function() {
$("input[type='submit'][value='Search']").attr("onclick", "form.act.value='detailSearch'; clicked = true; return true;");
if (clicked == true) {
// show hidden fields
} else {
// don't show hidden fields
}
});
Run Code Online (Sandbox Code Playgroud)
有关此代码有什么问题的任何建议吗?
Ste*_*ler 176
由于HTTP是无状态的,因此每次加载页面时,它都将使用您在JavaScript中设置的任何值的初始值.您无法在JS中设置全局变量,只需在再次加载页面后保持该值.
有几种方法可以将值存储在另一个位置,以便您可以使用JavaScript在加载时初始化它
请求参数
使用该GET方法提交表单时,将使用查询字符串(?parameter=value&something=42)更新URL .您可以通过将表单中的输入字段设置为特定值来利用此功能.这将是最简单的例子:
<form method="GET">
<input type="hidden" name="clicked" value="true" />
<input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)
在页面的初始加载时,不设置查询字符串.提交此表单时,输入的组合name和value组合将作为查询字符串传递clicked=true.因此,当页面再次使用该查询字符串加载时,您可以检查是否单击了该按钮.
要读取此数据,可以在页面加载时使用以下脚本:
function getParameterByName(name) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
var clicked = getParameterByName('clicked');
Run Code Online (Sandbox Code Playgroud)
(来源)
使用此功能的能力取决于您的表单当前的工作方式,如果您已经使用POST,那么这可能会有问题.
此外,对于较大的数据集,这不是最佳的.传递字符串并不是什么大问题,但对于数组和数据对象,您应该使用Web存储或cookie.虽然浏览器的细节略有不同,但URI长度的实际限制大约为2000个字符
网络存储
随着HTML5的推出,我们还获得了Web Storage,它允许您跨页面加载在浏览器中保存信息.有localStorage哪些可以保存较长时间的数据(只要用户没有手动清除它),sessionStorage其中只有当前浏览会话过程中保存数据.后者在这里对你有用,因为当用户稍后回来时你不想将"clicked"设置为true.
在这里,我在按钮单击事件上设置存储,但您也可以将其绑定到表单提交或其他任何内容.
$('input[type="submit"][value="Search"]').click(function() {
sessionStorage.setItem('clicked', 'true');
});
Run Code Online (Sandbox Code Playgroud)
然后,当您加载页面时,您可以使用以下方法检查是否已设置:
var clicked = sessionStorage.getItem('clicked');
Run Code Online (Sandbox Code Playgroud)
尽管此值仅在此浏览会话期间保存,但您可能希望稍早重置它.为此,请使用:
sessionStorage.removeItem('clicked');
Run Code Online (Sandbox Code Playgroud)
如果您想要保存JS对象或数组,则应将其转换为字符串.根据规范,应该可以保存其他数据类型,但这还没有在浏览器中正确实现.
//set
localStorage.setItem('myObject', JSON.stringify(myObject));
//get
var myObject = JSON.parse(localStorage.getItem('myObject'));
Run Code Online (Sandbox Code Playgroud)
浏览器支持非常好,因此除非您需要支持非常古老/模糊的浏览器,否则您应该安全使用它.Web存储是未来.
饼干
Web Storage的替代方法是将数据保存在cookie中.Cookie主要用于读取数据服务器端,但也可用于纯客户端数据.
您已经使用了jQuery,这使得设置cookie非常容易.我再次使用此click事件,但可以在任何地方使用.
$('input[type="submit"][value="Search"]').click(function() {
$.cookie('clicked', 'true', {expires: 1}); // expires in 1 day
});
Run Code Online (Sandbox Code Playgroud)
然后在页面加载时,您可以像这样读取cookie:
var clicked = $.cookie('clicked');
Run Code Online (Sandbox Code Playgroud)
由于cookie会在您的案例中持续存在,因此您需要在完成所需的任何操作后立即取消它们.您不希望用户在一天后返回并仍clicked设置为true.
if(clicked === "true") {
//doYourStuff();
$.cookie('clicked', null);
}
Run Code Online (Sandbox Code Playgroud)
(可以在这里找到非jQuery的设置/读取cookie的方法)
我个人不会使用cookie来记住单击状态,但如果查询字符串不是一个选项,并且您需要支持不支持sessionStorage的旧浏览器,这将起作用.您应首先检查sessionStorage,并且只有在失败时才使用cookie方法.
window.name
虽然这对我来说似乎是一个黑客,可能源于localStorage/sessionStorage之前,你可以在window.name属性中存储信息:
window.name = "my value"
Run Code Online (Sandbox Code Playgroud)
它只能存储字符串,所以如果你想保存一个对象,就必须像上面的localStorage例子一样对它进行字符串化:
window.name = JSON.stringify({ clicked: true });
Run Code Online (Sandbox Code Playgroud)
主要区别在于,此信息不仅保留在页面刷新,还保留在不同的域中.但是,它仅限于您当前的标签.
这意味着您可以在页面上保存一些信息,只要用户留在该选项卡中,即使他浏览到另一个网站并返回,您也可以访问相同的信息.一般情况下,除非您需要在单个浏览会话期间实际存储跨域信息,否则我建议不要使用此功能.
尝试利用$.holdReady(),history
function show() {
return $("form input[type=hidden]")
.replaceWith(function(i, el) {
return "<input type=text>"
});
}
$.holdReady(true);
if (history.state !== null && history.state.clicked === true) {
// show hidden fields
// if `history.state.clicked === true` ,
// replace `input type=hidden` with `input type=text`
show();
console.log(history);
} else {
// don't show hidden fields
console.log(history);
}
$.holdReady(false);
$(document).ready(function() {
$("input[type=submit][value=Search]")
.on("click", function(e) {
e.preventDefault();
if (history.state === null) {
// do stuff
history.pushState({"clicked":true});
// replace `input type=hidden` with `input type=text`
show();
console.log(history);
} else {
// do other stuff
};
});
});Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
61135 次 |
| 最近记录: |