如果调用了 preventDefault(),则无法以编程方式 select 单选按钮
Cannot programmatically select radio button if preventDefault() called
我在 Chrome 中有一个 'catch 22'。如果绑定到同一事件的任何其他函数调用 preventDefault()
.
,我无法以编程方式 select click
事件中的单选按钮
例如,我有一个单选按钮,其父元素绑定到调用 preventDefault()
的 click
事件。如果直接单击单选按钮,则不会选中它。这是意料之中的。但是,我实际上需要单选按钮 selected 所以在代码中我尝试在绑定到 click
事件的另一个函数中检查它:$(this).prop('checked', true);
.
奇怪的是,这不起作用,我无法删除对 preventDefault()
的调用或禁用传播,因为它在我需要 运行.
的第三方代码中
这是一个错误吗?任何建议的解决方法?
这是一个例子:
http://jsfiddle.net/LnLuk4st/
更新:
我已经尝试了@RGraham 的建议。 他的示例显然有效,但奇怪的是它在我的代码上下文中不起作用。 @RGraham 的代码有一个语法错误,这使得它看起来可以正常工作。
这是一些背景信息:
// Remember kendo tab
$(".k-tabstrip").each(function () {
var $tabStrip = $(this);
var $tabs = $tabStrip.find(".k-tabstrip-items .k-item");
var tabCookie = "Current_Tab_" + $tabStrip.attr("id");
// On tab change, set cookie
$tabs.click(function () {
createCookie(tabCookie, $(this).attr("aria-controls"), 1);
$tabStrip.parent().css({ 'min-height': $tabStrip.parent().height() });
if ($(this).is('input')) { // Doesn't eval to true, 'this' is always a '.k-item'.
$(this).prop("checked", true);
} else {
// Never works if the input is clicked directly
$(this).find('input').prop("checked", true);
}
});
// @RGraham's suggestion...
$tabs.on('click', 'input', function() {
$(this).prop("checked", true); // Line reached but doesn't work either :(
});
// If cookie set, select tab
var tab = readCookie(tabCookie);
if (tab) {
$tabs.each(function () {
if ($(this).attr("aria-controls") == tab) {
$(this).click();
}
});
}
});
我仍然认为此行为是一个错误,但我找到了解决方法。
直接捕获单选按钮的点击,防止传播,然后以编程方式点击单选按钮的父级。这允许第三方代码 运行 而无需将 preventDefault
应用于单选按钮。
// preventDefault bug fix.
$tabs.find("input").click(function (e) {
e.stopPropagation();
$(this).parent().click();
});
我在 Chrome 中有一个 'catch 22'。如果绑定到同一事件的任何其他函数调用 preventDefault()
.
click
事件中的单选按钮
例如,我有一个单选按钮,其父元素绑定到调用 preventDefault()
的 click
事件。如果直接单击单选按钮,则不会选中它。这是意料之中的。但是,我实际上需要单选按钮 selected 所以在代码中我尝试在绑定到 click
事件的另一个函数中检查它:$(this).prop('checked', true);
.
奇怪的是,这不起作用,我无法删除对 preventDefault()
的调用或禁用传播,因为它在我需要 运行.
这是一个错误吗?任何建议的解决方法?
这是一个例子: http://jsfiddle.net/LnLuk4st/
更新:
我已经尝试了@RGraham 的建议。 他的示例显然有效,但奇怪的是它在我的代码上下文中不起作用。 @RGraham 的代码有一个语法错误,这使得它看起来可以正常工作。
这是一些背景信息:
// Remember kendo tab
$(".k-tabstrip").each(function () {
var $tabStrip = $(this);
var $tabs = $tabStrip.find(".k-tabstrip-items .k-item");
var tabCookie = "Current_Tab_" + $tabStrip.attr("id");
// On tab change, set cookie
$tabs.click(function () {
createCookie(tabCookie, $(this).attr("aria-controls"), 1);
$tabStrip.parent().css({ 'min-height': $tabStrip.parent().height() });
if ($(this).is('input')) { // Doesn't eval to true, 'this' is always a '.k-item'.
$(this).prop("checked", true);
} else {
// Never works if the input is clicked directly
$(this).find('input').prop("checked", true);
}
});
// @RGraham's suggestion...
$tabs.on('click', 'input', function() {
$(this).prop("checked", true); // Line reached but doesn't work either :(
});
// If cookie set, select tab
var tab = readCookie(tabCookie);
if (tab) {
$tabs.each(function () {
if ($(this).attr("aria-controls") == tab) {
$(this).click();
}
});
}
});
我仍然认为此行为是一个错误,但我找到了解决方法。
直接捕获单选按钮的点击,防止传播,然后以编程方式点击单选按钮的父级。这允许第三方代码 运行 而无需将 preventDefault
应用于单选按钮。
// preventDefault bug fix.
$tabs.find("input").click(function (e) {
e.stopPropagation();
$(this).parent().click();
});