我知道如何打败弹出窗口拦截器有很多线索。在这种情况下,我并不是真的想要这样做。默认情况下,浏览器不会阻止弹出窗口。允许使用合法的用户,例如用户点击它时。这是一个很好的测试:http://www.popuptest.com/goodpopups.html(适用于IE,Firefox,Chrome,Opera)
上述测试网站如何允许合法的弹出窗口是将onclick事件直接耦合到新窗口的启动。
在我的情况下,我不能只启动弹出窗口。我需要检查用户的输入(字母数字密码)是否有效。我是如何做的是通过ajax检查输入,如果它有效,将调用window.open()
来启动窗口。唉,所有弹出窗口拦截器阻止了这一点。
我还有其他办法吗?如果输入无效,我不想启动窗口。如果输入无效,则错误消息将显示在直接页面上,而不会显示在新的弹出窗口中。启动一个窗口只是为了告诉用户它是无效的。
我可以检查输入的任何想法或建议,还允许显示合法的弹出窗口?
感谢。
已修改为包含我的(简化)代码
HTML表单:
<form id="form-passcode">
<input id="input-passcode" type="text" name="input-passcode" /><a class="submit" onclick="javascript:passcode_check(); return false;" href="javascript:">Go</a>
</form>
Javascript(使用jQuery):
function passcode_check() {
var refPasscode = $('#input-passcode');
var data = $('#form-passcode').serialize();
$.ajax({
url: check_passcode.php',
data: data,
dataType: 'json',
type: 'post',
success: function (j) {
if (j.status == 1) {
newwindow = window.open('http://google.com','Google','menubar=no,height=500,width=300,resizable=no,toolbar=no,location=no,status=no');
if (window.focus) {newwindow.focus()}
}
else {
// show error to end-user
}
}
});
}
}
我还尝试了一种不太理想的替代方案,在通过ajax检查输入是否有效时,我会插入一个链接,例如<a href="http://google.com" onclick="newwin(this.href);return false" onfocus="this.blur()">Launch</a>
通过$('#form-passcode').html();
,用户随后会点击此按钮启动弹出窗口。这适用于所有浏览器,但我仍然希望让用户更加无缝..
再次感谢:)
答案 0 :(得分:4)
为什么不将验证码移动到onclick事件中?
实施例: 的onclick = “JavaScript的:validateInput();”
然后,在validateInput()中,如果密码有效,则打开新窗口。
另外,请确保您没有使用jQuery动态分配onclick处理程序。它应该静态指定为HTML属性。
答案 1 :(得分:4)
同意dacris。调用window.open的代码需要更接近按钮单击处理程序。如果您正在使用异步响应处理程序对服务器进行AJAX调用,那么您已从按钮单击处理程序中解除window.open调用。浏览器只能跟踪几个级别的堆栈深度(一些只有一个调用深度,其他几个调用深度),以查看是否从用户事件的执行上下文中调用window.open。异步AJAX处理程序在按钮单击处理程序执行并返回其调用程序后执行很长时间。
解决问题的一种方法可能是解决问题:首先在按钮单击处理程序中打开弹出窗口,然后进行异步AJAX调用以验证输入,然后根据弹出窗口的URL更新async处理程序中AJAX调用的结果。