Remove remaining jQuery
This avoids every page on the site parsing 250KB of JavaScript. supporter-page.js isn't the most elegant code, but at least it's a little more modular now and no longer user jQuery.
This commit is contained in:
		
							parent
							
								
									10dfdb617b
								
							
						
					
					
						commit
						44c0a9db32
					
				
					 4 changed files with 50 additions and 9455 deletions
				
			
		
							
								
								
									
										6
									
								
								TODO.md
									
										
									
									
									
								
							
							
						
						
									
										6
									
								
								TODO.md
									
										
									
									
									
								
							|  | @ -1,12 +1,9 @@ | ||||||
| # To-do | # To-do | ||||||
| 
 | 
 | ||||||
| * ensure appropriate caching headers are used | * ensure appropriate caching headers are used | ||||||
| * remove jQuery |  | ||||||
| * consider removing `events` and `worldmap` modules | * consider removing `events` and `worldmap` modules | ||||||
| * ask Denver about why so many license files | * ask Denver about why so many license files | ||||||
| * serve a 400 in Apache for a hostname we don't explicitly support | * serve a 400 in Apache for a hostname we don't explicitly support | ||||||
| * use `<detail>` elements for supporter page hidden sections, rather than |  | ||||||
|   complex jQuery - or consider Alpine.js |  | ||||||
| * replace `internalNavigate` with inline flexbox layout | * replace `internalNavigate` with inline flexbox layout | ||||||
| * add tests for main pages returning 200 | * add tests for main pages returning 200 | ||||||
| * move `sponsors.py` and `sponsors.html` into `supporters` app | * move `sponsors.py` and `sponsors.html` into `supporters` app | ||||||
|  | @ -14,6 +11,9 @@ | ||||||
| 
 | 
 | ||||||
| # Done | # Done | ||||||
| 
 | 
 | ||||||
|  | * use `<detail>` elements for supporter page hidden sections, rather than | ||||||
|  |   complex jQuery | ||||||
|  | * remove jQuery | ||||||
| * split the template/content files out from `conservancy/static` into their own | * split the template/content files out from `conservancy/static` into their own | ||||||
|   `content` directory (avoid mixing static and non-static content) |   `content` directory (avoid mixing static and non-static content) | ||||||
| * remove `ForceCanonicalHostnameMiddleware` by ensuring canonical redirect and | * remove `ForceCanonicalHostnameMiddleware` by ensuring canonical redirect and | ||||||
|  |  | ||||||
							
								
								
									
										9404
									
								
								conservancy/static/js/jquery-1.7.2.js
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										9404
									
								
								conservancy/static/js/jquery-1.7.2.js
									
										
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -7,8 +7,6 @@ | ||||||
| 
 | 
 | ||||||
| "use strict"; | "use strict"; | ||||||
| 
 | 
 | ||||||
| var NEW_AMOUNT_EVENT = 'conservancy:newamount'; |  | ||||||
| 
 |  | ||||||
| var flipClass = function(elem, byeClass, hiClass) { | var flipClass = function(elem, byeClass, hiClass) { | ||||||
|     var classList = elem.classList; |     var classList = elem.classList; | ||||||
|     classList.remove(byeClass); |     classList.remove(byeClass); | ||||||
|  | @ -26,10 +24,6 @@ var buildAmountData = function(amountInput) { | ||||||
|     return amountData; |     return amountData; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var supportTypeSelector = function(supportTypeHash) { |  | ||||||
|     return $(supportTypeHash + "Selector"); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| /* We've sometimes published links that say #renew instead of #renewal. | /* We've sometimes published links that say #renew instead of #renewal. | ||||||
| Rewrite that to work as intended. */ | Rewrite that to work as intended. */ | ||||||
| if (window.location.hash === "#renew") { | if (window.location.hash === "#renew") { | ||||||
|  | @ -38,6 +32,24 @@ if (window.location.hash === "#renew") { | ||||||
| 
 | 
 | ||||||
| var formCorrectionNeeded = qs('#form-correction-needed'); | var formCorrectionNeeded = qs('#form-correction-needed'); | ||||||
| 
 | 
 | ||||||
|  | function new_amount(amountData, amountInput, amountError) { | ||||||
|  |     var isValid = amountData.newAmount >= amountData.minAmount; | ||||||
|  |     if (amountData.oldAmount === undefined) { | ||||||
|  |         if (isValid) { | ||||||
|  |             hide(amountError); | ||||||
|  |         } else { | ||||||
|  |             flipClass(amountInput, 'valid', 'invalid'); | ||||||
|  |             show(amountError); | ||||||
|  |         } | ||||||
|  |     } else if (isValid) { | ||||||
|  |         flipClass(amountInput, 'invalid', 'valid'); | ||||||
|  |         hide(amountError); | ||||||
|  |     } else if (amountData.oldAmount >= amountData.minAmount) { | ||||||
|  |         flipClass(amountInput, 'valid', 'invalid'); | ||||||
|  |         show(amountError); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| function init_sustainer_form_validation () { | function init_sustainer_form_validation () { | ||||||
|     // Forms start in "invalid" form, with the errors shown, so that
 |     // Forms start in "invalid" form, with the errors shown, so that
 | ||||||
|     // non-Javascript users see the errors by default and know what they must
 |     // non-Javascript users see the errors by default and know what they must
 | ||||||
|  | @ -45,39 +57,23 @@ function init_sustainer_form_validation () { | ||||||
|     formCorrectionNeeded.classList.add('hidden'); |     formCorrectionNeeded.classList.add('hidden'); | ||||||
| 
 | 
 | ||||||
|     qsa('form.supporter-form').forEach(function(form) { |     qsa('form.supporter-form').forEach(function(form) { | ||||||
|         var $amountInput = $('input[type=number]', form).first(); |         var amountInput = qs('input[type=number]', form); | ||||||
|         var amountError = qs('.supporter-form-input .form-error', form); |         var amountError = qs('.supporter-form-input .form-error', form); | ||||||
|         var $amountError = $('.form-error', $amountInput.parents('.supporter-form-input')); |  | ||||||
| 
 | 
 | ||||||
|         $amountError.on(NEW_AMOUNT_EVENT, function(event, amountData) { |         function amount_change_handler () { | ||||||
|             var isValid = amountData.newAmount >= amountData.minAmount; |  | ||||||
|             if (amountData.oldAmount === undefined) { |  | ||||||
|                 if (isValid) { |  | ||||||
|                     amountError.classList.add('hidden'); |  | ||||||
|                 } else { |  | ||||||
|                     flipClass($amountInput[0], 'valid', 'invalid'); |  | ||||||
|                     amountError.classList.remove('hidden'); |  | ||||||
|                 } |  | ||||||
|             } else if (isValid) { |  | ||||||
|                 flipClass($amountInput[0], 'invalid', 'valid'); |  | ||||||
|                 hide(amountError); |  | ||||||
|             } else if (amountData.oldAmount >= amountData.minAmount) { |  | ||||||
|                 flipClass($amountInput[0], 'valid', 'invalid'); |  | ||||||
|                 show(amountError); |  | ||||||
|             } |  | ||||||
|         }); |  | ||||||
| 
 |  | ||||||
|         $amountInput.on('input', function(event) { |  | ||||||
|             event.target.classList.remove('invalid'); |  | ||||||
|         }).on('focusout', function(event) { |  | ||||||
|             var amountInput = event.target; |  | ||||||
|             var amountData = buildAmountData(amountInput); |             var amountData = buildAmountData(amountInput); | ||||||
|             $amountError.trigger(NEW_AMOUNT_EVENT, amountData); |             new_amount(amountData, amountInput, amountError); | ||||||
|             amountInput.dataset.oldAmount = amountData.newAmount; |             amountInput.dataset.oldAmount = amountData.newAmount; | ||||||
|         }).trigger('focusout'); |         } | ||||||
|  | 
 | ||||||
|  |         amountInput.addEventListener('input', function() { | ||||||
|  |             amountInput.classList.remove('invalid'); | ||||||
|  |         }) | ||||||
|  |         amountInput.addEventListener('focusout', amount_change_handler); | ||||||
|  |         amount_change_handler(); | ||||||
| 
 | 
 | ||||||
|         form.addEventListener('submit', function(event) { |         form.addEventListener('submit', function(event) { | ||||||
|             var amountData = buildAmountData($amountInput[0]); |             var amountData = buildAmountData(amountInput); | ||||||
|             if (amountData.newAmount >= amountData.minAmount) { |             if (amountData.newAmount >= amountData.minAmount) { | ||||||
|                 formCorrectionNeeded.classList.add('hidden'); |                 formCorrectionNeeded.classList.add('hidden'); | ||||||
|             } else { |             } else { | ||||||
|  | @ -90,24 +86,28 @@ function init_sustainer_form_validation () { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| function init_sustainer_type_switching () { | function init_sustainer_type_switching () { | ||||||
|     var selectSupportType = function(event) { |     function selectSupportType(selectedLink) { | ||||||
|         var $selectedLink = $(event.target); |         qsa(".supporter-type-selector a").forEach(function(el) { | ||||||
|         $(".supporter-type-selector a").removeClass("supporter-type-selector-selected"); |             el.classList.remove("supporter-type-selector-selected"); | ||||||
|         $selectedLink.addClass("supporter-type-selector-selected"); |         }); | ||||||
|         $(".supporter-type-selection").hide(); |         selectedLink.classList.add("supporter-type-selector-selected"); | ||||||
|         $(event.target.hash).show(); |         qsa(".supporter-type-selection").forEach(function(el) { hide(el); }); | ||||||
|  |         let hash = window.location.hash !== '' ? window.location.hash : '#annual'; | ||||||
|  |         show(qs(hash)); | ||||||
|         formCorrectionNeeded.classList.add('hidden'); |         formCorrectionNeeded.classList.add('hidden'); | ||||||
|         return false; |         return false; | ||||||
|     }; |     }; | ||||||
|     $(".supporter-type-selector a").bind("click", selectSupportType); |     qsa(".supporter-type-selector a").forEach(function(el) { | ||||||
|  |         el.addEventListener("click", () => selectSupportType(el)); | ||||||
|  |     }); | ||||||
| 
 | 
 | ||||||
|     var selectSupportTypeFromHash = function() { |     let el = qs(window.location.hash !== '' ? window.location.hash + 'Selector' : '#annualSelector'); | ||||||
|         return supportTypeSelector(window.location.hash).click(); |     selectSupportType(el); | ||||||
|     }; | 
 | ||||||
|     $(window).bind("hashchange", selectSupportTypeFromHash); |     window.addEventListener("hashchange", function () { | ||||||
|     if (selectSupportTypeFromHash().length === 0) { |         let el = qs(window.location.hash !== '' ? window.location.hash + 'Selector' : '#annualSelector'); | ||||||
|         supportTypeSelector("#annual").click(); |         selectSupportType(el); | ||||||
|     } |     }); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| function init_expanders () { | function init_expanders () { | ||||||
|  |  | ||||||
|  | @ -15,7 +15,6 @@ | ||||||
|     <link rel="stylesheet" type="text/css" href="{% static 'css/tachyons.css' %}"/> |     <link rel="stylesheet" type="text/css" href="{% static 'css/tachyons.css' %}"/> | ||||||
|     <link rel="stylesheet" type="text/css" media="screen" href="{% static 'css/conservancy.css' %}" /> |     <link rel="stylesheet" type="text/css" media="screen" href="{% static 'css/conservancy.css' %}" /> | ||||||
|     <link rel="stylesheet" type="text/css" media="(min-width: 67em)" href="{% static 'css/conservancy-bigscreen.css' %}" /> |     <link rel="stylesheet" type="text/css" media="(min-width: 67em)" href="{% static 'css/conservancy-bigscreen.css' %}" /> | ||||||
|     <script type="text/javascript" src="{% static 'js/jquery-1.7.2.js' %}" defer></script> |  | ||||||
|     <script type="text/javascript" src="{% static 'js/conservancy.js' %}" defer></script> |     <script type="text/javascript" src="{% static 'js/conservancy.js' %}" defer></script> | ||||||
|     {% block head %}{% endblock %} |     {% block head %}{% endblock %} | ||||||
|   </head> |   </head> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue