"event" 绑定
"event
绑定"在DOM元素上添加指定的事件以便元素被触发的时候执行定义的JavaScript 函数。大部分情况下是用在 keypress
, mouseover
和 mouseout
上。
基本用法
Html代码
<div> <div data-bind="event: { mouseover: enableDetails, mouseout: disableDetails }"> Mouse over me </div> <div data-bind="visible: detailsEnabled"> Details </div> </div>Js代码
var viewModel = { detailsEnabled: ko.observable(false), enableDetails: function() { this.detailsEnabled(true); }, disableDetails: function() { this.detailsEnabled(false); } }; ko.applyBindings(viewModel);演示了鼠标的移入(mouseover)、移出(mouseout)事件。
以下用法同click绑定用法相同,所以就不在描述,只给出例子。
Demo1:演示传递"当前项目"作为处理函数的一个参数
Html代码
<ul data-bind="foreach: places"> <li data-bind="text: $data, event: { mouseover: $parent.logMouseOver }"> </li> </ul> <p>You seem to be interested in: <span data-bind="text: lastInterest"> </span></p>Js代码
function MyViewModel() { var self = this; self.lastInterest = ko.observable(); self.places = ko.observableArray(['London', 'Paris', 'Tokyo']); self.logMouseOver = function(place) { self.lastInterest(place); } } ko.applyBindings(new MyViewModel());
Demo2:演示获取当前DOM的event对象
Html代码
<div data-bind="event: { mouseover: myFunction }">Mouse over me</div>Js代码
var viewModel = { myFunction: function(data, event) { if (event.shiftKey) { alert("您按了shift键"); } else { alert("您没有按shift键"); } } }; ko.applyBindings(viewModel);
Demo3:演示添加自定义参数
Html代码
<div data-bind="event: { mouseover: function(data, event) { myFunction(data, event, '我的参数1', '我的参数2') } }"> Mouse over me </div>Js代码
var viewModel = { myFunction: function(data, event,para1,para2) { alert('data=' + data); alert('event=' + event); alert('para1='+para1); alert('para2='+para2); } }; ko.applyBindings(viewModel);
Demo4:演示允许执行默认事件
默认情况下,Knockout会阻止冒泡,防止默认的事件继续执行。例如,使用 event
语法在 input
标签上绑定一个 keypress
事件,当你输入内容的时候,浏览器只会调用你的函数而不是 添加 input
的值。 另外一个例子 "click" 绑定,在执行完自定义事件时它不会连接到 href
地址。因为你的click 绑定主要就是操作你的view model,而不是连接到另外一个页面。当然,如果你想让默认的事件继续执行,你可以在你 event
的自定义函数里返回 true
。
Html代码
<input data-bind="event: { keypress : myFunction }"/>Js代码
var viewModel = { myFunction: function() { return true;//添加return true语句,否则默认无法在文本框输入内容 } }; ko.applyBindings(viewModel);
Demo5:演示防止事件冒泡
默认情况下,Knockout允许event事件继续在更高一层的事件句柄上冒泡执行。例如,如果你的元素和父元素都绑定了 mouseover
事件,那么如果你的鼠标在该元素移动的时候两个事件都会触发的。如果需要,你可以通过额外的绑定 youreventBubble
来禁止冒泡。例如:
Html代码
<div data-bind="event: { mouseover: myDivHandler }"> <button data-bind="event: { mouseover: myButtonHandler }, mouseoverBubble: false"> Mouse over me </button> </div>Js代码
var MyViewModel = { myDivHandler: function() { alert("myDivHandler"); }, myButtonHandler: function() { alert("myButtonHandler"); } }; ko.applyBindings(MyViewModel);