| Index: pages/donate.html |
| =================================================================== |
| --- a/pages/donate.html |
| +++ b/pages/donate.html |
| @@ -221,14 +221,14 @@ |
| var currencyValue = { |
| get: function() |
| { |
| - return document.querySelector("input[name=currency]:checked").value; |
| + return getCheckedCheckbox(document.querySelectorAll("input[name=currency]")).value; |
|
Thomas Greiner
2016/01/22 11:19:32
Since you decided to use `<form>` as a wrapper you
juliandoucette
2016/01/24 23:23:10
This is not true in IE8, unfortunately.
Thomas Greiner
2016/01/25 16:56:12
That's a real pity. In that case that function see
juliandoucette
2016/01/26 16:37:16
Acknowledged.
|
| } |
| }; |
| var priceValue = { |
| get: function() |
| { |
| - var value = document.querySelector("input[name=price]:checked").value; |
| + var value = getCheckedCheckbox(document.querySelectorAll("input[name=price]")).value; |
| if (value == 0) |
| value = document.getElementById("price-other").value >> 0; |
| return value; |
| @@ -239,7 +239,7 @@ |
| }, |
| verify: function() |
| { |
| - var selected = document.querySelector("input[name=price]:checked"); |
| + var selected = getCheckedCheckbox(document.querySelectorAll("input[name=price]")); |
| if (!selected) |
| return "Please select an amount"; |
| if (this.get() < this.min()) |
| @@ -391,9 +391,10 @@ |
| } |
| // To submit a form in Firefox it needs to be part of the DOM |
| - document.head.appendChild(form); |
| + var docHead = document.getElementsByTagName('head')[0] |
| + docHead.appendChild(form); |
| form.submit(); |
| - document.head.removeChild(form); |
| + docHead.removeChild(form); |
| } |
| function getText(id) |
| @@ -412,50 +413,83 @@ |
| if (priceOther.value >> 0 < minPrice) |
| priceOther.value = minPrice; |
| } |
| + |
| + function getCheckedCheckbox (checkboxes) |
|
Thomas Greiner
2016/01/22 11:19:31
I noticed a couple of inconsistencies with our cod
juliandoucette
2016/01/24 23:23:10
I have to apologize for this. I should not have su
Thomas Greiner
2016/01/25 16:56:12
No worries. That's one reason why we have code rev
juliandoucette
2016/01/26 16:37:15
Done.
|
| + { |
| + var checkboxLength = checkboxes.length; |
| + while(checkboxLength--) { |
|
Thomas Greiner
2016/01/22 11:19:31
Detail: This is inconsistent with our coding style
juliandoucette
2016/01/26 16:37:15
Done.
|
| + if (checkboxes[checkboxLength].checked) { |
| + return checkboxes[checkboxLength]; |
| + } |
| + } |
| + } |
| function updateCurrency() |
| { |
| - var checkbox = document.querySelector("input[name=currency]:checked"); |
| - if (!checkbox) |
| + var currencyField = document.getElementById('form-currency'); |
|
Thomas Greiner
2016/01/22 11:19:31
Detail: This is inconsistent with our coding style
juliandoucette
2016/01/26 16:37:16
Done.
|
| + var selectedCurrency = getCheckedCheckbox( |
| + currencyField.querySelectorAll("input[name=currency]") |
| + ); |
| + if (typeof selectedCurrency === 'undefined') { |
|
Thomas Greiner
2016/01/22 11:19:31
Detail: This is inconsistent with our coding style
juliandoucette
2016/01/26 16:37:16
Done.
|
| return; |
| - |
| - var currencyLabel = checkbox.parentNode[textAttr]; |
| - if (!currencyLabel) |
| - return; |
| - |
| - var elements = document.getElementsByClassName("currency-label"); |
| - for (var i = 0; i < elements.length; i++) |
| - elements[i][textAttr] = currencyLabel; |
| + } |
| + var currencyLabel = selectedCurrency.parentNode.innerText; |
|
Thomas Greiner
2016/01/22 11:19:32
`innerText` is not supported by most Firefox versi
juliandoucette
2016/01/24 23:23:10
Good catch.
juliandoucette
2016/01/26 16:37:16
Done.
|
| + var currencyLabels = document.querySelectorAll('.currency-label'); |
| + for (var i = 0, ii = currencyLabels.length; i < ii; i++) |
|
Thomas Greiner
2016/01/22 11:19:31
Detail: This is premature optimization. The perfor
juliandoucette
2016/01/24 23:23:10
Stylistic habit. I see your point.
juliandoucette
2016/01/26 16:37:16
Done.
|
| + currencyLabels[i][textAttr] = currencyLabel; |
| ensureMinPrice(); |
| } |
| + |
| + function addEventsBySelector (query, event, callback, bubble, base) |
|
Thomas Greiner
2016/01/22 11:19:30
Why do you specify the "bubble" and "base" paramet
Thomas Greiner
2016/01/22 11:19:31
Detail: You're not adding events but event listene
juliandoucette
2016/01/24 23:23:09
I intended to use them when I wrote this function.
juliandoucette
2016/01/24 23:23:10
I chose "addEvent" instead of "addListeners" to be
juliandoucette
2016/01/26 16:37:16
Done.
|
| + { |
| + base = base || document; |
| + bubble = bubble || false; |
| + var query = base.querySelectorAll(query); |
|
Thomas Greiner
2016/01/22 11:19:31
`query` has already been declared so no need for `
juliandoucette
2016/01/24 23:23:10
Good catch.
juliandoucette
2016/01/26 16:37:15
Done.
|
| + var queryIndex = query.length; |
| + //fallback to attachEvent for IE8 |
| + var addListenerFunction = typeof document.addEventListener === 'function' ? |
| + 'addEventListener' : |
| + 'attachEvent'; |
| + if (addListenerFunction === 'attachEvent') { |
| + event = 'on' + event; |
| + } |
| + while(queryIndex--) { |
| + query[queryIndex][addListenerFunction](event, callback, bubble); |
| + } |
| + } |
| - document.addEventListener("DOMContentLoaded", function() |
| + function initializeDonationForm () |
| { |
| formValues.name = getText("i18n_name"); |
| - |
| - document.getElementById("payment").addEventListener("click", function(event) |
| - { |
| - if (event.target.localName != "button") |
| - return; |
| - |
| - document.getElementById("form").className = event.target.className; |
| - ensureMinPrice(); |
| - }, true); |
| - |
| - document.getElementById("form-currency").addEventListener("click", function(event) |
| - { |
| - if (event.target.localName == "input") |
| - updateCurrency(); |
| - }, true); |
| + |
| + addEventsBySelector('button[name="payment"]', 'click', onSelectPayment); |
|
Thomas Greiner
2016/01/22 11:19:32
What's the reason for this change? Did you see any
juliandoucette
2016/01/24 23:23:09
- attachEvent doesn't support bubbling (Therefore
Thomas Greiner
2016/01/25 16:56:12
Thanks for the explanation. I just wanted to make
juliandoucette
2016/01/26 16:37:15
Acknowledged.
|
| + addEventsBySelector('input[name="currency"]', 'click', updateCurrency); |
| + addEventsBySelector('#form', 'submit', onSubmitDonation); |
| + |
| updateCurrency(); |
| - |
| - document.getElementById("donate").addEventListener("click", function(event) |
| - { |
| - var provider = providers[document.getElementById("form").className]; |
| + } |
| + |
| + function onSelectPayment (event) |
| + { |
| + event.preventDefault ? event.preventDefault() : (event.returnValue = false); |
|
Thomas Greiner
2016/01/22 11:19:30
Detail: We usually don't write single-line stateme
juliandoucette
2016/01/26 16:37:15
Done.
|
| + document.getElementById("form").className = (event.target || event.srcElement).className; |
| + ensureMinPrice(); |
| + } |
| + |
| + function onSubmitDonation (event) |
| + { |
| + event.preventDefault ? event.preventDefault() : (event.returnValue = false); |
| + var provider = providers[document.getElementById("form").className]; |
| if (provider) |
|
Thomas Greiner
2016/01/22 11:19:31
Detail: The indentation here is inconsistent with
juliandoucette
2016/01/26 16:37:15
Done.
|
| provider(); |
| - }, false); |
| - }, false); |
| + } |
| + |
| + if (document.addEventListener) { |
|
Thomas Greiner
2016/01/22 11:19:31
Since you have that fallback in two different plac
juliandoucette
2016/01/24 23:23:09
I agree. I wasn't sure if adding a polyfill for th
Thomas Greiner
2016/01/25 16:56:12
Generally, it's about maintenance effort. Checking
juliandoucette
2016/01/26 16:37:16
Acknowledged.
Thomas Greiner
2016/01/27 17:20:31
I remembered that we had that problem before and I
|
| + document.addEventListener('DOMContentLoaded', initializeDonationForm, false); |
| + } else { |
| + document.attachEvent('onreadystatechange', initializeDonationForm); |
| + } |
| + |
| })(); |
| // --> |
| @@ -468,12 +502,12 @@ |
| Your donation directly helps the development of Adblock Plus.}} |
| </p> |
| -<div class="paypal" id="form"> |
| +<form class="paypal" id="form"> |
| <p id="payment"> |
| <strong>{{s3 Select your payment method}}</strong> |
| - <button class="paypal">{{s4 PayPal}}</button> |
| - <button class="credit-card">{{s5 Credit Card}}</button> |
| + <button class="paypal" value="paypal" name="payment">{{s4 PayPal}}</button> |
| + <button class="credit-card" value="credit-card" name="payment">{{s5 Credit Card}}</button> |
| </p> |
| <div id="form-fields"> |
| @@ -540,4 +574,4 @@ |
| </div> |
| </div> |
| </div> |
| -</div> |
| +</form> |