您需要在绑定处理程序中捕获点击事件。
HTML:
<a href="link" data-bind="disableClick: !enabled()">test</a>
<br/><br/><br/>
<input type="checkbox" data-bind="checked: enabled"> enabled
JavaScript:
ko.bindingHandlers.disableClick = {
init: function (element, valueAccessor) {
$(element).click(function(evt) {
if(valueAccessor())
evt.preventDefault();
});
},
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
ko.bindingHandlers.css.update(element, function() {return { disabled_anchor: value }; });
}
};
ko.applyBindings({ enabled: ko.observable(false)});
这里是一个工作示例:
http://jsfiddle.net/kp74u/54/
更新1: 如果您需要防止在绑定knockout处理程序之后绑定的其他事件处理程序,则需要将stopImmediatePropagation
添加到事件处理程序中,以及preventDefault
。
示例:http://jsfiddle.net/kp74u/55/
更新2: 如果您想禁用所有事件处理程序(包括在您的绑定处理程序之前附加的单击事件处理程序),则需要“黑客”jquery事件数组。 请注意,这可能无法在其他版本的jquery中运行(示例使用1.7):
ko.bindingHandlers.disableClick = {
init: function(element, valueAccessor) {
$(element).click(function(evt) {
alert('test before');
});
$(element).click(function(evt) {
if (valueAccessor()) {
evt.preventDefault();
evt.stopImmediatePropagation();
}
});
var events = $.data(element, "events");
console.log(events);
var handlers = events['click'];
if (handlers.length == 1) {
return;
}
handlers.splice(0, 0, handlers.pop());
$(element).click(function(evt) {
alert('test after');
});
},
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
ko.bindingHandlers.css.update(element, function() {
return {
disabled_anchor: value
};
});
}
};
例子: http://jsfiddle.net/nickolsky/kp74u/40/
更新3: 如FIR55TORM所建议的编辑所提到的,如果你正在使用jQuery 1.10.x版本,你需要在访问"data"对象时添加下划线,像这样:
var events = $._data(element, "events");
为jQuery 1.10.x修订的fiddle: http://jsfiddle.net/nickolsky/kp74u/41/