window.open('url', '_self')失效:替换当前页面打开新页面失败
问题分析与解决方案
你的问题核心在于submit类型按钮的默认表单提交行为干扰了页面跳转操作,让我们一步步拆解:
为什么window.open('url', '_self')没效果?
你用的按钮是type="submit",点击后浏览器会自动触发表单的默认提交流程——页面会刷新(如果没有阻止的话)。这时候window.open('_self')的跳转请求还没来得及执行,就被页面刷新给覆盖了;而_blank是打开新窗口,不受当前页面刷新的影响,所以能正常工作。
另外,其实替换当前页面根本不需要用window.open,window.location.href才是标准、可靠的方式,专门用来在当前页面跳转目标URL。
几种可行的修复方案
方案1:把按钮类型改成button(最简单)
直接避免触发表单提交行为:
<button id="rgstr_btn" type="button" class="btn btn-info" onClick="store()">Register</button> <script> function store() { localStorage.setItem('nome', nome.value); localStorage.setItem('pw', pw.value); // 用标准的页面跳转替代window.open window.location.href = 'url'; } </script>
方案2:阻止表单的默认提交行为
如果必须保留type="submit"(比如需要利用表单的其他特性),可以在函数里阻止默认行为:
<button id="rgstr_btn" type="submit" class="btn btn-info" onClick="store(event)">Register</button> <script> function store(event) { // 阻止表单默认提交 event.preventDefault(); localStorage.setItem('nome', nome.value); localStorage.setItem('pw', pw.value); window.location.href = 'url'; } </script>
或者通过返回false来阻止:
<button id="rgstr_btn" type="submit" class="btn btn-info" onClick="return store()">Register</button> <script> function store() { localStorage.setItem('nome', nome.value); localStorage.setItem('pw', pw.value); window.location.href = 'url'; // 返回false阻止默认提交 return false; } </script>
方案3:直接修改表单的提交事件(更规范)
如果你的按钮在<form>标签里,也可以直接给表单绑定onsubmit事件,阻止默认提交并执行逻辑:
<form onsubmit="return store()"> <!-- 你的表单输入框 --> <input type="text" id="nome"> <input type="password" id="pw"> <button id="rgstr_btn" type="submit" class="btn btn-info">Register</button> </form> <script> function store() { localStorage.setItem('nome', document.getElementById('nome').value); localStorage.setItem('pw', document.getElementById('pw').value); window.location.href = 'url'; return false; } </script>
额外提示
- 尽量避免直接用
nome.value这种方式获取输入值,最好通过document.getElementById('nome').value来获取,避免变量作用域问题。 - 存储密码到
localStorage是非常不安全的行为,建议不要在实际项目中这么做,敏感数据应该通过安全的后端接口处理。
内容的提问来源于stack exchange,提问作者Poli
相关产品推荐
相关产品推荐

