diff --git a/js/utils/tap.js b/js/utils/tap.js index ec8d14b35b0..c868f1e4d6b 100644 --- a/js/utils/tap.js +++ b/js/utils/tap.js @@ -228,12 +228,20 @@ ionic.tap = { }, requiresNativeClick: function(ele) { - if(!ele || ele.disabled || (/^(file|range)$/i).test(ele.type) || (/^(object|video)$/i).test(ele.tagName) ) { + if(!ele || ele.disabled || (/^(file|range)$/i).test(ele.type) || (/^(object|video)$/i).test(ele.tagName) || ionic.tap.isLabelContainingFileInput(ele) ) { return true; } return ionic.tap.isElementTapDisabled(ele); }, + isLabelContainingFileInput: function(ele) { + var lbl = tapContainingElement(ele); + if(lbl.tagName !== 'LABEL') return false; + var fileInput = lbl.querySelector('input[type=file]'); + if(fileInput && fileInput.disabled === false) return true; + return false; + }, + isElementTapDisabled: function(ele) { if(ele && ele.nodeType === 1) { var element = ele; diff --git a/test/html/tapInputs.html b/test/html/tapInputs.html index 78a3ce79272..04cd25becef 100755 --- a/test/html/tapInputs.html +++ b/test/html/tapInputs.html @@ -168,6 +168,15 @@ <option>United States</option> </select> </div> + <div class="item item-divider"> + File Input + </div> + <label class="item item-input"> + <div class="input-label"> + <i class="icon ion-document-text"></i> File + </div> + <input type="file"/> + </label> <div class="item item-divider"> Other Tests diff --git a/test/unit/utils/tap.unit.js b/test/unit/utils/tap.unit.js index b3969a096b4..3335f98f22b 100644 --- a/test/unit/utils/tap.unit.js +++ b/test/unit/utils/tap.unit.js @@ -746,6 +746,24 @@ describe('Ionic Tap', function() { expect( ionic.tap.requiresNativeClick( div5 ) ).toEqual(true); }); + it('Should ionic.tap.requiresNativeClick for labels containing input[file]', function() { + var lbl = document.createElement('label'); + var ele = document.createElement('input'); + ele.type = 'file'; + lbl.appendChild(ele); + expect( ionic.tap.requiresNativeClick( lbl ) ).toEqual(true); + }); + + it('Should ionic.tap.requiresNativeClick for elements underneath labels containing input[file]', function() { + var lbl = document.createElement('label'); + var txt = document.createElement('span'); + var ele = document.createElement('input'); + ele.type = 'file'; + lbl.appendChild(ele); + lbl.appendChild(txt); + expect( ionic.tap.requiresNativeClick( txt ) ).toEqual(true); + }); + it('Should not allow a click that has an textarea target but not created by tapClick', function() { var e = { target: document.createElement('textarea'),