我有jQuery代码,它生成一个可聚焦元素数组,并绑定.keydown左右箭头以标记它们.在Chrome,IE和Safari开头preventDefault()或返回错误(这在技术上我不想用,因为我也没有必要结束stopPropagation())防止箭头的默认事件,但在Firefox它没有.
如何防止Firefox中的默认操作?
下面是代码,它按预期工作,除了在Firefox中,除了我的回调之外还会触发默认事件.
$(function () {
var focusables = $(":focusable");
focusables.eq(0).focus();
focusables.eq(0).select();
focusables.each(function () {
$(this).keydown(function (e) {
if (e.which == '37') { // left-arrow
e.preventDefault();
var current = focusables.index(this),
next = focusables.eq(current - 1).length ? focusables.eq(current - 1) : focusables.eq(0);
next.focus();
next.select();
}
if (e.which == '39') { // right-arrow
e.preventDefault();
var current = focusables.index(this),
next = focusables.eq(current + 1).length ? focusables.eq(current + 1) : focusables.eq(0);
next.focus();
next.select();
}
});
});
});
Run Code Online (Sandbox Code Playgroud) 绑定到复选框输入的单击事件时,复选框已经在我的事件处理程序运行时切换,更奇怪的是,如果我指定了event.preventDefault(),则在我的事件处理程序运行后,切换会反转.
<input id="foo" type="checkbox"/>
function clicked(evt) {
alert(document.getElementById('foo').checked);
evt.preventDefault();
}
document.getElementById('foo').addEventListener('click',clicked);
Run Code Online (Sandbox Code Playgroud)
[在chrome和firefox中测试]
警报将响应"true"(或复选框预先单击的相反状态).关闭警报后,复选框会切换回来.
所以,我猜问题是,
什么是实际的默认事件被阻止?假设我的事件处理程序应该在状态更改之前运行,我错了吗?有没有办法合法拦截复选框点击?
为什么世界上的preventDefault导致重新切换复选框?
我有一个基于Web的应用程序,其中包含一个用户可以用手指向上和向下滚动的组件.我使用事件的preventDefault方法来防止触摸移动在iOS设备上移动整个屏幕的默认行为.
不幸的是,这似乎不再适用于iOS 5,我刚刚升级到今天早上.我不得不假设这在iOS 5中完全不同,但我还没有能够找到提供指令的资源.
谢谢!
更新#1:我无法找到我的具体问题的答案,但我能够调整我的代码以使用-webkit-overflow-scrolling样式(设置为"touch"的值)并实现时髦的惯性滚动功能(内容滚动得更快,取决于你的滑动速度,如果碰到边界,"橡皮筋反弹"会回来.看起来很酷......
更新#2:我现在有另一个奇怪的问题.由于某些奇怪的原因,溢出滚动行为有时会混淆,因此您必须在包含元素上左右拖动手指才能使其内容上下移动.我还没弄清楚为什么会发生这种情况 - 有没有人有任何想法?
嘿我有一个jquery函数,在一个锚的onclick事件上触发,该函数如下:
function dropDown(subid, e) {
e.preventDefault();
var sub = '#' + subid;
// hide all submenus first
$('.subnav').css({'display' : 'none'});
//Show the Current Subnav
$(sub).css({'display' : 'block'});
}
Run Code Online (Sandbox Code Playgroud)
这就是我要触发它的方式:
<a href="#!" onclick="dropDown('sn_cities')" >Cities</a>
Run Code Online (Sandbox Code Playgroud)
但是我收到此错误: e is undefined
我想取消锚链接的默认onclick事件,任何帮助将不胜感激.
有一个<label>与<a href="#">内部元素.我想阻止<a>元素的默认行为(即导航),但它应该执行<label>元素的默认行为(即检查其中的复选框).
测试用例:http://jsfiddle.net/3M6WE/.单击foo切换复选框.单击bar不导航但不切换复选框.
我怎么能有<a>元素没有导航,但有它切换复选框?我想避免像手动切换复选框一样的黑客攻击.preventDefault如果可以的话,我正在寻找"部分" .
根据某人的建议,我$('body').on('touchstart', function(event){ event.preventDefault() })在移动网络应用程序中添加了这一行,以禁用iOS中的本机应用程序弹跳.它非常适合禁用反弹但在DOM的其他地方给我一些奇怪的行为.
点击不起作用的事件等.我希望能更好地理解它的作用以及如何解决它在DOM中其他地方的影响.
谢谢!
编辑:
我有这两行:
$('body').on('touchstart', function(e){ e.preventDefault() };
$('#home').on('click', function(){ alert('home') };
Run Code Online (Sandbox Code Playgroud)
如果我注释掉该preventDefault行,则该#home行有效.如果我把它留在#home行没有回应.#home只是一个div嵌套在body.
知道什么可能导致这种行为?它是更大代码库的一部分所以它很难给你所有细节,但我甚至不知道从哪里开始.
再次感谢!
我有这个代码,如果为空,则验证输入的值,并使用twitter bootstrap popover显示消息错误:
$(document).on("ready", login_events());
function login_events(){
$("#userId, #password").on("change", validateEmpty);
$("#loginButton").on("click", validateAll);
}
function validateEmpty(){
input = $(this);
input.popover({animation: true, placement: 'right', trigger: 'manual', title: 'Field is Empty', content: input.attr("data-empty-message")});
isValid = true;
if(input.val() === ""){
input.popover('show');
isValid = false;
}
else{
input.popover('hide');
}
return isValid;
}
Run Code Online (Sandbox Code Playgroud)
这在改变事件完成时非常有效,但我想做另一个函数,它将在表单中的每个输入之间进行迭代,验证它是否为空(validateEmpty())和preventDefault(如果有的话)为空.
正如您所看到的,我为#loginButton设置了click事件,以运行validateAll函数,我有类似的东西,但无法找到正确的方法:
function validateAll(event){
$("#loginForm input").each(validateEmpty);
}
Run Code Online (Sandbox Code Playgroud) 在输入框中,我想停止光标的传播,就像我在向上键"↑"上键入一样:
之前:
tes|t//光标在t之前
之后:
|test //光标开始了
我想阻止光标移动,所以它必须在t之前停留.
到目前为止,我正在尝试这个,但它不起作用:
$('input').keyup(function(e) {
if (e.which == 40) { // up key
e.stopPropagation();
e.stopImmediatePropagation();
e.preventDefault();
// actions
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
这还有可能吗?
所以,当用户输入电子邮件以查看电子邮件是否存在时,我正在检查.
$('form.recover-form#check-form').on('submit', function(e){
var form = $(this),
input = $('.check-recover-email'),
span = $('.recover-error'),
email = input.val();
span.text('');
e.preventDefault();
$.ajax({
url: 'ajax/check-email',
async: 'false',
cache: 'false',
type: 'POST',
data: {email: email},
success: function(response) {
if ( response == 'no' ) {
span.text('email does not exist');
} else if ( response == 'ok' ) {
form.submit();
}
}
});
});
Run Code Online (Sandbox Code Playgroud)
PHP代码
if ( Input::isPost('email') ) {
$email = Input::post('email');
$check = $dbh->prepare(" SELECT * FROM users WHERE email = :email ");
$check->execute(array( …Run Code Online (Sandbox Code Playgroud) 我正在建立一个需要在PC,Mac和移动浏览器上进行触摸和鼠标交互的页面。
在用于touchStart,touchMove,touchEnd和touchCancel的事件处理程序方法中,我正在调用event.preventDefault以防止移动浏览器同时触发触摸和鼠标事件。
这对于mouseDown和mouseUp效果很好,当我触摸屏幕时它们不会被触发,但是由于某种原因,每次touchStart被触发后一小会儿(夫妇100ms),Android浏览器仍然会触发mouseMove事件(在第一个touchStart上) ,此mouseMove之前带有mouseOver)。如果我足够快地触摸,那么touchEnd之后会触发mouseMove(相对于touchStart而言具有相同的延迟)。
我真的很想防止触摸产生任何鼠标事件,并且我也想详细了解这里发生的事情,所以我有以下问题: