Skip to content

Commit 1b1d72e

Browse files
committed
enable $event in v-on expressions + enable e.preventDefault()
1 parent b084957 commit 1b1d72e

File tree

6 files changed

+78
-7
lines changed

6 files changed

+78
-7
lines changed

src/compiler.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ function Compiler (vm, options) {
7676
def(vm, '$el', el)
7777
def(vm, '$options', options)
7878
def(vm, '$compiler', compiler)
79+
def(vm, '$event', null, false, true)
7980

8081
// set parent
8182
var parentVM = options.parent
@@ -783,7 +784,8 @@ CompilerProto.addDelegator = function (event) {
783784
}
784785
}
785786
}
786-
this.el.addEventListener(event, delegator.handler)
787+
// useCapture:true so e.preventDefault() works
788+
this.el.addEventListener(event, delegator.handler, true)
787789
return delegator
788790
}
789791

src/directives/on.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,15 @@ module.exports = {
2121
}
2222
var el = this.el,
2323
targetVM = this.vm,
24-
ownerVM = this.binding.compiler.vm,
25-
isExp = this.binding.isExp,
24+
context = this.binding.isExp
25+
? targetVM
26+
: this.binding.compiler.vm,
2627
newHandler = function (e) {
2728
e.targetEl = el
2829
e.targetVM = targetVM
29-
handler.call(isExp ? targetVM : ownerVM, e)
30+
context.$event = e
31+
handler.call(context, e)
32+
context.$event = null
3033
}
3134
if (!this.bubbles) {
3235
this.reset()

src/utils.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,12 @@ var utils = module.exports = {
7979
* This avoids it being included in JSON.stringify
8080
* or for...in loops.
8181
*/
82-
defProtected: function (obj, key, val, enumerable) {
82+
defProtected: function (obj, key, val, enumerable, writable) {
8383
if (obj.hasOwnProperty(key)) return
8484
Object.defineProperty(obj, key, {
8585
value : val,
8686
enumerable : !!enumerable,
87+
writable : !!writable,
8788
configurable : true
8889
})
8990
},

test/functional/fixtures/animation.html

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,54 +4,66 @@
44
display: inline-block;
55
}
66
.v-enter {
7-
-webkit-animation: fadein .2s;
87
animation: fadein .2s;
8+
-webkit-animation: fadein .2s;
99
}
1010
.v-leave {
11-
-webkit-animation: fadeout .2s;
1211
animation: fadeout .2s;
12+
-webkit-animation: fadeout .2s;
1313
}
1414
@keyframes fadein {
1515
0% {
16+
-webkit-transform: scale(0);
1617
transform: scale(0);
1718
}
1819
50% {
20+
-webkit-transform: scale(1.5);
1921
transform: scale(1.5);
2022
}
2123
100% {
24+
-webkit-transform: scale(1);
2225
transform: scale(1);
2326
}
2427
}
2528
@keyframes fadeout {
2629
0% {
2730
transform: scale(1);
31+
-webkit-transform: scale(1);
2832
}
2933
50% {
3034
transform: scale(1.5);
35+
-webkit-transform: scale(1.5);
3136
}
3237
100% {
3338
transform: scale(0);
39+
-webkit-transform: scale(0);
3440
}
3541
}
3642
@-webkit-keyframes fadein {
3743
0% {
3844
-webkit-transform: scale(0);
45+
transform: scale(0);
3946
}
4047
50% {
4148
-webkit-transform: scale(1.5);
49+
transform: scale(1.5);
4250
}
4351
100% {
4452
-webkit-transform: scale(1);
53+
transform: scale(1);
4554
}
4655
}
4756
@-webkit-keyframes fadeout {
4857
0% {
58+
transform: scale(1);
4959
-webkit-transform: scale(1);
5060
}
5161
50% {
62+
transform: scale(1.5);
5263
-webkit-transform: scale(1.5);
5364
}
5465
100% {
66+
transform: scale(0);
5567
-webkit-transform: scale(0);
5668
}
5769
}

test/functional/fixtures/events.html

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<script src="../../../dist/vue.js"></script>
2+
3+
<div v-on="click:outer">
4+
<p class="outer" v-show="outerTriggered">Outer triggered</p>
5+
<p class="msg">{{msg}}</p>
6+
<a class="normal" v-on="click:normal">normal</a>
7+
<a class="exp" href="#triggered" v-on="click:exp('hello', $event)">exp</a>
8+
</div>
9+
10+
<script>
11+
var test = new Vue({
12+
el: 'div',
13+
methods: {
14+
outer: function () {
15+
this.outerTriggered = true
16+
},
17+
normal: function (e) {
18+
e.stopPropagation()
19+
},
20+
exp: function (msg, e) {
21+
this.msg = msg
22+
e.stopPropagation()
23+
e.preventDefault()
24+
}
25+
}
26+
})
27+
</script>

test/functional/specs/events.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
casper.test.begin('Events', 5, function (test) {
2+
3+
// testing event delegation
4+
// mostly inline events
5+
// and e.stopPropagation(), e.preventDefault()
6+
7+
casper
8+
.start('./fixtures/events.html')
9+
.thenClick('.normal', function () {
10+
test.assertNotVisible('.outer')
11+
})
12+
.thenClick('.exp', function () {
13+
test.assertNotVisible('.outer')
14+
test.assertSelectorHasText('.msg', 'hello')
15+
test.assertEval(function () {
16+
return !window.location.hash
17+
})
18+
})
19+
.thenClick('div', function () {
20+
test.assertVisible('.outer')
21+
})
22+
.run(function () {
23+
test.done()
24+
})
25+
26+
})

0 commit comments

Comments
 (0)