| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- var _ = require('src/util')
- var Vue = require('src')
- function trigger (target, event, process) {
- var e = document.createEvent('HTMLEvents')
- e.initEvent(event, true, true)
- if (process) process(e)
- target.dispatchEvent(e)
- return e
- }
- describe('v-on', function () {
- var el
- beforeEach(function () {
- el = document.createElement('div')
- })
- it('methods', function () {
- var spy = jasmine.createSpy()
- var vm = new Vue({
- el: el,
- template: '<a v-on:click="test"></a>',
- data: {a: 1},
- methods: {
- test: spy
- }
- })
- var a = el.firstChild
- trigger(a, 'click')
- expect(spy.calls.count()).toBe(1)
- vm.$destroy()
- trigger(a, 'click')
- expect(spy.calls.count()).toBe(1)
- })
- it('shorthand', function () {
- var spy = jasmine.createSpy()
- var vm = new Vue({
- el: el,
- template: '<a @click="test"></a>',
- data: {a: 1},
- methods: {
- test: spy
- }
- })
- var a = el.firstChild
- trigger(a, 'click')
- expect(spy.calls.count()).toBe(1)
- vm.$destroy()
- trigger(a, 'click')
- expect(spy.calls.count()).toBe(1)
- })
- it('inline expression', function (done) {
- new Vue({
- el: el,
- template: '<a v-on:click="a++">{{a}}</a>',
- data: {a: 1}
- })
- var a = el.firstChild
- trigger(a, 'click')
- _.nextTick(function () {
- expect(a.textContent).toBe('2')
- done()
- })
- })
- it('with key modifier', function (done) {
- new Vue({
- el: el,
- template: '<a v-on:keyup.enter="test">{{a}}</a>',
- data: {a: 1},
- methods: {
- test: function () {
- this.a++
- }
- }
- })
- var a = el.firstChild
- trigger(a, 'keyup', function (e) {
- e.keyCode = 13
- })
- _.nextTick(function () {
- expect(a.textContent).toBe('2')
- done()
- })
- })
- it('with delete modifier capturing DEL', function (done) {
- new Vue({
- el: el,
- template: '<a v-on:keyup.delete="test">{{a}}</a>',
- data: {a: 1},
- methods: {
- test: function () {
- this.a++
- }
- }
- })
- var a = el.firstChild
- trigger(a, 'keyup', function (e) {
- e.keyCode = 46
- })
- _.nextTick(function () {
- expect(a.textContent).toBe('2')
- done()
- })
- })
- it('with delete modifier capturing backspace', function (done) {
- new Vue({
- el: el,
- template: '<a v-on:keyup.delete="test">{{a}}</a>',
- data: {a: 1},
- methods: {
- test: function () {
- this.a++
- }
- }
- })
- var a = el.firstChild
- trigger(a, 'keyup', function (e) {
- e.keyCode = 8
- })
- _.nextTick(function () {
- expect(a.textContent).toBe('2')
- done()
- })
- })
- it('with key modifier (keycode)', function (done) {
- new Vue({
- el: el,
- template: '<a v-on:keyup.13="test">{{a}}</a>',
- data: {a: 1},
- methods: {
- test: function () {
- this.a++
- }
- }
- })
- var a = el.firstChild
- trigger(a, 'keyup', function (e) {
- e.keyCode = 13
- })
- _.nextTick(function () {
- expect(a.textContent).toBe('2')
- done()
- })
- })
- it('with key modifier (letter)', function (done) {
- new Vue({
- el: el,
- template: '<a v-on:keyup.a="test">{{a}}</a>',
- data: {a: 1},
- methods: {
- test: function () {
- this.a++
- }
- }
- })
- var a = el.firstChild
- trigger(a, 'keyup', function (e) {
- e.keyCode = 65
- })
- _.nextTick(function () {
- expect(a.textContent).toBe('2')
- done()
- })
- })
- it('stop modifier', function () {
- var outer = jasmine.createSpy('outer')
- var inner = jasmine.createSpy('inner')
- new Vue({
- el: el,
- template: '<div @click="outer"><div class="inner" @click.stop="inner"></div></div>',
- methods: {
- outer: outer,
- inner: inner
- }
- })
- trigger(el.querySelector('.inner'), 'click')
- expect(inner).toHaveBeenCalled()
- expect(outer).not.toHaveBeenCalled()
- })
- it('prevent modifier', function () {
- var prevented
- new Vue({
- el: el,
- template: '<a href="#" @click.prevent="onClick">',
- methods: {
- onClick: function (e) {
- // store the prevented state now:
- // IE will reset the `defaultPrevented` flag
- // once the event handler call stack is done!
- prevented = e.defaultPrevented
- }
- }
- })
- trigger(el.firstChild, 'click')
- expect(prevented).toBe(true)
- })
- it('prevent modifier with no value', function () {
- new Vue({
- el: el,
- template: '<a href="#123" @click.prevent>'
- })
- var hash = window.location.hash
- trigger(el.firstChild, 'click')
- expect(window.location.hash).toBe(hash)
- })
- it('capture modifier', function () {
- document.body.appendChild(el)
- var outer = jasmine.createSpy('outer')
- var inner = jasmine.createSpy('inner')
- new Vue({
- el: el,
- template: '<div @click.capture.stop="outer"><div class="inner" @click="inner"></div></div>',
- methods: {
- outer: outer,
- inner: inner
- }
- })
- trigger(el.querySelector('.inner'), 'click')
- expect(outer).toHaveBeenCalled()
- expect(inner).not.toHaveBeenCalled()
- document.body.removeChild(el)
- })
- it('self modifier', function () {
- var outer = jasmine.createSpy('outer')
- new Vue({
- el: el,
- template: '<div class="outer" @click.self="outer"><div class="inner"></div></div>',
- methods: {
- outer: outer
- }
- })
- trigger(el.querySelector('.inner'), 'click')
- expect(outer).not.toHaveBeenCalled()
- trigger(el.querySelector('.outer'), 'click')
- expect(outer).toHaveBeenCalled()
- })
- it('multiple modifiers working together', function () {
- var outer = jasmine.createSpy('outer')
- var prevented
- new Vue({
- el: el,
- template: '<div @keyup="outer"><input class="inner" @keyup.enter.stop.prevent="inner"></div></div>',
- methods: {
- outer: outer,
- inner: function (e) {
- prevented = e.defaultPrevented
- }
- }
- })
- trigger(el.querySelector('.inner'), 'keyup', function (e) {
- e.keyCode = 13
- })
- expect(outer).not.toHaveBeenCalled()
- expect(prevented).toBe(true)
- })
- it('warn non-function values', function () {
- new Vue({
- el: el,
- data: { test: 123 },
- template: '<a v-on:keyup="test"></a>'
- })
- expect('expects a function value').toHaveBeenWarned()
- })
- it('iframe', function () {
- // iframes only gets contentWindow when inserted
- // into the document
- document.body.appendChild(el)
- var spy = jasmine.createSpy()
- var vm = new Vue({
- el: el,
- template: '<iframe v-on:click="test"></iframe>',
- methods: {
- test: spy
- }
- })
- var iframeDoc = el.firstChild.contentDocument
- trigger(iframeDoc, 'click')
- expect(spy.calls.count()).toBe(1)
- vm.$destroy()
- trigger(iframeDoc, 'click')
- expect(spy.calls.count()).toBe(1)
- document.body.removeChild(el)
- })
- it('passing $event', function () {
- var test = jasmine.createSpy()
- new Vue({
- el: el,
- template: '<a v-on:click="test($event)"></a>',
- methods: {
- test: test
- }
- })
- var e = trigger(el.firstChild, 'click')
- expect(test).toHaveBeenCalledWith(e)
- })
- it('passing $event on a nested instance', function () {
- var test = jasmine.createSpy()
- var parent = new Vue({
- methods: {
- test: test
- }
- })
- var child = new Vue({
- el: el,
- template: '<a v-on:click="$parent.test($event)"></a>',
- parent: parent
- })
- var e = trigger(child.$el.firstChild, 'click')
- expect(test).toHaveBeenCalledWith(e)
- })
- })
|