on_spec.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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('inline expression', function (done) {
  35. var vm = new Vue({
  36. el: el,
  37. template: '<a v-on="click:a++">{{a}}</a>',
  38. data: {a:1}
  39. })
  40. var a = el.firstChild
  41. trigger(a, 'click')
  42. _.nextTick(function () {
  43. expect(a.textContent).toBe('2')
  44. done()
  45. })
  46. })
  47. it('with key filter', function (done) {
  48. var vm = new Vue({
  49. el: el,
  50. template: '<a v-on="keyup:test | key \'enter\'">{{a}}</a>',
  51. data: {a:1},
  52. methods: {
  53. test: function () {
  54. this.a++
  55. }
  56. }
  57. })
  58. var a = el.firstChild
  59. trigger(a, 'keyup', function (e) {
  60. e.keyCode = 13
  61. })
  62. _.nextTick(function () {
  63. expect(a.textContent).toBe('2')
  64. done()
  65. })
  66. })
  67. it('warn non-function values', function () {
  68. var vm = new Vue({
  69. el: el,
  70. data: { test: 123 },
  71. template: '<a v-on="keyup:test"></a>'
  72. })
  73. expect(hasWarned(_, 'expects a function value')).toBe(true)
  74. })
  75. it('iframe', function () {
  76. // iframes only gets contentWindow when inserted
  77. // into the document
  78. document.body.appendChild(el)
  79. var spy = jasmine.createSpy()
  80. var vm = new Vue({
  81. el: el,
  82. template: '<iframe v-on="click:test"></iframe>',
  83. methods: {
  84. test: spy
  85. }
  86. })
  87. var iframeDoc = el.firstChild.contentDocument
  88. trigger(iframeDoc, 'click')
  89. expect(spy.calls.count()).toBe(1)
  90. vm.$destroy()
  91. trigger(iframeDoc, 'click')
  92. expect(spy.calls.count()).toBe(1)
  93. document.body.removeChild(el)
  94. })
  95. it('passing $event', function () {
  96. var test = jasmine.createSpy()
  97. var vm = new Vue({
  98. el: el,
  99. template: '<a v-on="click:test($event)"></a>',
  100. methods: {
  101. test: test
  102. }
  103. })
  104. var e = trigger(el.firstChild, 'click')
  105. expect(test).toHaveBeenCalledWith(e)
  106. })
  107. it('passing $event on a nested instance', function () {
  108. var test = jasmine.createSpy()
  109. var parent = new Vue({
  110. methods: {
  111. test: test
  112. }
  113. })
  114. var child = parent.$addChild({
  115. el: el,
  116. inherit: true,
  117. template: '<a v-on="click:test($event)"></a>'
  118. })
  119. var e = trigger(el.firstChild, 'click')
  120. expect(test).toHaveBeenCalledWith(e)
  121. })
  122. })
  123. }