dom-changes.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. /*jshint browser: true */
  2. module('DOM integration');
  3. test('adding a new unselected option changes nothing', function (assert) {
  4. // Any browsers which support mutation observers will not trigger the event
  5. var expected = 4;
  6. if (window.MutationObserver) {
  7. expected = 2;
  8. } else if (!window.addEventListener) {
  9. expected = 2;
  10. }
  11. assert.expect(expected);
  12. var asyncDone = null;
  13. var syncDone = assert.async();
  14. if (expected != 2) {
  15. asyncDone = assert.async();
  16. }
  17. var $ = require('jquery');
  18. var Options = require('select2/options');
  19. var Select2 = require('select2/core');
  20. var $select = $(
  21. '<select>' +
  22. '<option>One</option>' +
  23. '<option>Two</option>' +
  24. '</select>'
  25. );
  26. $('#qunit-fixture').append($select);
  27. var select = new Select2($select);
  28. select.on('selection:update', function (args) {
  29. assert.equal(
  30. args.data.length,
  31. 1,
  32. 'There was more than one selection'
  33. );
  34. assert.equal(
  35. args.data[0].id,
  36. 'One',
  37. 'The selection changed to something other than One'
  38. );
  39. if (expected != 2) {
  40. asyncDone();
  41. }
  42. });
  43. assert.equal(
  44. $select.val(),
  45. 'One'
  46. );
  47. var $option = $('<option>Three</option>');
  48. $select.append($option);
  49. assert.equal(
  50. $select.val(),
  51. 'One'
  52. );
  53. syncDone();
  54. });
  55. test('adding a new selected option changes the value', function (assert) {
  56. // handle IE 8 not being supported
  57. var expected = 4;
  58. if (!window.MutationObserver && !window.addEventListener) {
  59. expected = 2;
  60. }
  61. assert.expect(expected);
  62. var asyncDone = null;
  63. var syncDone = assert.async();
  64. if (expected != 2) {
  65. asyncDone = assert.async();
  66. }
  67. var $ = require('jquery');
  68. var Options = require('select2/options');
  69. var Select2 = require('select2/core');
  70. var $select = $(
  71. '<select>' +
  72. '<option>One</option>' +
  73. '<option>Two</option>' +
  74. '</select>'
  75. );
  76. $('#qunit-fixture').append($select);
  77. var select = new Select2($select);
  78. select.on('selection:update', function (args) {
  79. assert.equal(
  80. args.data.length,
  81. 1,
  82. 'There was more than one selection'
  83. );
  84. assert.equal(
  85. args.data[0].id,
  86. 'Three',
  87. 'The selection did not change to Three'
  88. );
  89. if (expected != 2) {
  90. asyncDone();
  91. }
  92. });
  93. assert.equal(
  94. $select.val(),
  95. 'One'
  96. );
  97. var $option = $('<option selected>Three</option>');
  98. $select.append($option);
  99. assert.equal(
  100. $select.val(),
  101. 'Three'
  102. );
  103. syncDone();
  104. });
  105. test('removing an unselected option changes nothing', function (assert) {
  106. // Any browsers which support mutation observers will not trigger the event
  107. var expected = 4;
  108. if (!window.MutationObserver && !window.addEventListener) {
  109. expected = 2;
  110. }
  111. assert.expect(expected);
  112. var asyncDone = null;
  113. var syncDone = assert.async();
  114. if (expected != 2) {
  115. asyncDone = assert.async();
  116. }
  117. var $ = require('jquery');
  118. var Options = require('select2/options');
  119. var Select2 = require('select2/core');
  120. var $select = $(
  121. '<select>' +
  122. '<option>One</option>' +
  123. '<option>Two</option>' +
  124. '</select>'
  125. );
  126. $('#qunit-fixture').append($select);
  127. var select = new Select2($select);
  128. select.on('selection:update', function (args) {
  129. assert.equal(
  130. args.data.length,
  131. 1,
  132. 'There was more than one selection'
  133. );
  134. assert.equal(
  135. args.data[0].id,
  136. 'One',
  137. 'The selection changed to something other than One'
  138. );
  139. if (expected != 2) {
  140. asyncDone();
  141. }
  142. });
  143. assert.equal(
  144. $select.val(),
  145. 'One'
  146. );
  147. $select.children().eq(1).remove();
  148. assert.equal(
  149. $select.val(),
  150. 'One'
  151. );
  152. syncDone();
  153. });
  154. test('removing a selected option changes the value', function (assert) {
  155. // handle IE 8 not being supported
  156. var expected = 3;
  157. if (!window.MutationObserver && !window.addEventListener) {
  158. expected = 2;
  159. }
  160. assert.expect(expected);
  161. var asyncDone = null;
  162. var syncDone = assert.async();
  163. if (expected != 2) {
  164. asyncDone = assert.async();
  165. }
  166. var $ = require('jquery');
  167. var Options = require('select2/options');
  168. var Select2 = require('select2/core');
  169. var $select = $(
  170. '<select>' +
  171. '<option>One</option>' +
  172. '<option>Two</option>' +
  173. '</select>'
  174. );
  175. $('#qunit-fixture').append($select);
  176. var select = new Select2($select);
  177. select.on('selection:update', function (args) {
  178. assert.equal(
  179. args.data.length,
  180. 1,
  181. 'There was more than one selection'
  182. );
  183. if (expected != 2) {
  184. asyncDone();
  185. }
  186. });
  187. assert.equal(
  188. $select.val(),
  189. 'One'
  190. );
  191. $select.children().eq(0).remove();
  192. assert.equal(
  193. $select.val(),
  194. 'Two'
  195. );
  196. syncDone();
  197. });
  198. test('searching tags does not loose focus', function (assert) {
  199. assert.expect(1);
  200. var asyncDone = assert.async();
  201. var $ = require('jquery');
  202. var Options = require('select2/options');
  203. var Select2 = require('select2/core');
  204. var $select = $(
  205. '<select multiple="multiple">' +
  206. ' <option value="1">Text1</option>' +
  207. ' <option value="2">Text2</option>' +
  208. '</select>'
  209. );
  210. $('#qunit-fixture').append($select);
  211. var select = new Select2($select, {tags: true});
  212. var inputEl = select.selection.$search[0];
  213. inputEl.focus();
  214. select.on('selection:update', function() {
  215. assert.equal(document.activeElement, inputEl);
  216. asyncDone();
  217. });
  218. select.selection.trigger('query', {term: 'f'});
  219. select.selection.trigger('query', {term: 'ff'});
  220. });
  221. test('adding multiple options calls selection:update once', function (assert) {
  222. assert.expect(1);
  223. var asyncDone = assert.async();
  224. var $ = require('jquery');
  225. var Select2 = require('select2/core');
  226. var content = '<select>';
  227. var options = '';
  228. for (var i = 0; i < 4000; i++) {
  229. options += '<option>' + i + '</option>';
  230. }
  231. content += options;
  232. content += '</select>';
  233. var $select = $(content);
  234. $('#qunit-fixture').append($select);
  235. var select = new Select2($select);
  236. var eventCalls = 0;
  237. select.on('selection:update', function () {
  238. eventCalls++;
  239. });
  240. $select.html(options);
  241. setTimeout(function () {
  242. assert.equal(
  243. eventCalls,
  244. 1,
  245. 'selection:update was called more than once'
  246. );
  247. asyncDone();
  248. }, 0);
  249. });