2
0

on_spec.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. var _ = require('../../../../../src/util')
  2. var Vue = require('../../../../../src/vue')
  3. function trigger (target, event, process) {
  4. var e = document.createEvent('HTMLEvents')
  5. e.initEvent(event, true, true)
  6. if (process) process(e)
  7. target.dispatchEvent(e)
  8. return e
  9. }
  10. if (_.inBrowser) {
  11. describe('v-on', function () {
  12. var el
  13. beforeEach(function () {
  14. el = document.createElement('div')
  15. spyOn(_, 'warn')
  16. })
  17. it('methods', function () {
  18. var spy = jasmine.createSpy()
  19. var vm = new Vue({
  20. el: el,
  21. template: '<a v-on:click="test"></a>',
  22. data: {a: 1},
  23. methods: {
  24. test: spy
  25. }
  26. })
  27. var a = el.firstChild
  28. trigger(a, 'click')
  29. expect(spy.calls.count()).toBe(1)
  30. vm.$destroy()
  31. trigger(a, 'click')
  32. expect(spy.calls.count()).toBe(1)
  33. })
  34. it('shorthand', function () {
  35. var spy = jasmine.createSpy()
  36. var vm = new Vue({
  37. el: el,
  38. template: '<a @click="test"></a>',
  39. data: {a: 1},
  40. methods: {
  41. test: spy
  42. }
  43. })
  44. var a = el.firstChild
  45. trigger(a, 'click')
  46. expect(spy.calls.count()).toBe(1)
  47. vm.$destroy()
  48. trigger(a, 'click')
  49. expect(spy.calls.count()).toBe(1)
  50. })
  51. it('inline expression', function (done) {
  52. new Vue({
  53. el: el,
  54. template: '<a v-on:click="a++">{{a}}</a>',
  55. data: {a: 1}
  56. })
  57. var a = el.firstChild
  58. trigger(a, 'click')
  59. _.nextTick(function () {
  60. expect(a.textContent).toBe('2')
  61. done()
  62. })
  63. })
  64. it('with key modifier', function (done) {
  65. new Vue({
  66. el: el,
  67. template: '<a v-on:keyup.enter="test">{{a}}</a>',
  68. data: {a: 1},
  69. methods: {
  70. test: function () {
  71. this.a++
  72. }
  73. }
  74. })
  75. var a = el.firstChild
  76. trigger(a, 'keyup', function (e) {
  77. e.keyCode = 13
  78. })
  79. _.nextTick(function () {
  80. expect(a.textContent).toBe('2')
  81. done()
  82. })
  83. })
  84. it('with key modifier (keycode)', function (done) {
  85. new Vue({
  86. el: el,
  87. template: '<a v-on:keyup.13="test">{{a}}</a>',
  88. data: {a: 1},
  89. methods: {
  90. test: function () {
  91. this.a++
  92. }
  93. }
  94. })
  95. var a = el.firstChild
  96. trigger(a, 'keyup', function (e) {
  97. e.keyCode = 13
  98. })
  99. _.nextTick(function () {
  100. expect(a.textContent).toBe('2')
  101. done()
  102. })
  103. })
  104. it('stop modifier', function () {
  105. var outer = jasmine.createSpy('outer')
  106. var inner = jasmine.createSpy('inner')
  107. new Vue({
  108. el: el,
  109. template: '<div @click="outer"><div class="inner" @click.stop="inner"></div></div>',
  110. methods: {
  111. outer: outer,
  112. inner: inner
  113. }
  114. })
  115. trigger(el.querySelector('.inner'), 'click')
  116. expect(inner).toHaveBeenCalled()
  117. expect(outer).not.toHaveBeenCalled()
  118. })
  119. it('prevent modifier', function () {
  120. var event
  121. new Vue({
  122. el: el,
  123. template: '<a href="#" @click.prevent="onClick">',
  124. methods: {
  125. onClick: function (e) {
  126. event = e
  127. }
  128. }
  129. })
  130. trigger(el.firstChild, 'click')
  131. expect(event.defaultPrevented).toBe(true)
  132. })
  133. it('multiple modifiers working together', function () {
  134. var outer = jasmine.createSpy('outer')
  135. var event
  136. new Vue({
  137. el: el,
  138. template: '<div @keyup="outer"><input class="inner" @keyup.enter.stop.prevent="inner"></div></div>',
  139. methods: {
  140. outer: outer,
  141. inner: function (e) {
  142. event = e
  143. }
  144. }
  145. })
  146. trigger(el.querySelector('.inner'), 'keyup', function (e) {
  147. e.keyCode = 13
  148. })
  149. expect(outer).not.toHaveBeenCalled()
  150. expect(event).toBeTruthy()
  151. expect(event.defaultPrevented).toBe(true)
  152. })
  153. it('warn non-function values', function () {
  154. new Vue({
  155. el: el,
  156. data: { test: 123 },
  157. template: '<a v-on:keyup="test"></a>'
  158. })
  159. expect(hasWarned(_, 'expects a function value')).toBe(true)
  160. })
  161. it('iframe', function () {
  162. // iframes only gets contentWindow when inserted
  163. // into the document
  164. document.body.appendChild(el)
  165. var spy = jasmine.createSpy()
  166. var vm = new Vue({
  167. el: el,
  168. template: '<iframe v-on:click="test"></iframe>',
  169. methods: {
  170. test: spy
  171. }
  172. })
  173. var iframeDoc = el.firstChild.contentDocument
  174. trigger(iframeDoc, 'click')
  175. expect(spy.calls.count()).toBe(1)
  176. vm.$destroy()
  177. trigger(iframeDoc, 'click')
  178. expect(spy.calls.count()).toBe(1)
  179. document.body.removeChild(el)
  180. })
  181. it('passing $event', function () {
  182. var test = jasmine.createSpy()
  183. new Vue({
  184. el: el,
  185. template: '<a v-on:click="test($event)"></a>',
  186. methods: {
  187. test: test
  188. }
  189. })
  190. var e = trigger(el.firstChild, 'click')
  191. expect(test).toHaveBeenCalledWith(e)
  192. })
  193. it('passing $event on a nested instance', function () {
  194. var test = jasmine.createSpy()
  195. var parent = new Vue({
  196. methods: {
  197. test: test
  198. }
  199. })
  200. parent.$addChild({
  201. el: el,
  202. template: '<a v-on:click="$parent.test($event)"></a>'
  203. })
  204. var e = trigger(el.firstChild, 'click')
  205. expect(test).toHaveBeenCalledWith(e)
  206. })
  207. })
  208. }