diff --git a/core/src/components/button/button.tsx b/core/src/components/button/button.tsx index a936f54185..02e9ea0638 100644 --- a/core/src/components/button/button.tsx +++ b/core/src/components/button/button.tsx @@ -1,7 +1,8 @@ import { Component, Element, Event, EventEmitter, Prop, State } from '@stencil/core'; import { Color, CssClassMap, Mode, RouterDirection } from '../../interface'; -import { getParentNode, openURL } from '../../utils/theme'; +import { hasShadowDom } from '../../utils/helpers'; +import { openURL } from '../../utils/theme'; @Component({ tag: 'ion-button', @@ -121,28 +122,25 @@ export class Button { } onClick(ev: Event) { - if (this.type === 'submit') { + if (this.type === 'button') { + openURL(this.win, this.href, ev, this.routerDirection); + + } else if (hasShadowDom(this.el)) { // this button wants to specifically submit a form // climb up the dom to see if we're in a
// and if so, then use JS to submit it + const form = this.el.closest('form'); + if (form) { + ev.preventDefault(); + ev.stopPropagation(); - let node = this.el; - while ((node = getParentNode(node))) { - if (node.nodeName.toLowerCase() === 'form') { - // cool, this submit button is within a , let's submit it - - // prevent the button's default and stop it's propagation - ev.preventDefault(); - ev.stopPropagation(); - - // submit the via JS - (node as HTMLFormElement).submit(); - break; - } + const fakeButton = document.createElement('button'); + fakeButton.type = this.type; + fakeButton.style.display = 'none'; + form.appendChild(fakeButton); + fakeButton.click(); + fakeButton.remove(); } - - } else { - openURL(this.win, this.href, ev, this.routerDirection); } } diff --git a/core/src/components/button/test/form/index.html b/core/src/components/button/test/form/index.html index 718a241bc9..eb30472c52 100644 --- a/core/src/components/button/test/form/index.html +++ b/core/src/components/button/test/form/index.html @@ -20,10 +20,10 @@ - +
- +
@@ -36,6 +36,21 @@ + + diff --git a/core/src/utils/helpers.ts b/core/src/utils/helpers.ts index 76938a9db5..1fc614e5b8 100644 --- a/core/src/utils/helpers.ts +++ b/core/src/utils/helpers.ts @@ -9,8 +9,12 @@ export function reorderArray(array: any[], indexes: {from: number, to: number}): return array; } +export function hasShadowDom(el: HTMLElement) { + return !!el.shadowRoot && !!el.attachShadow; +} + export function renderHiddenInput(container: HTMLElement, name: string, value: string, disabled: boolean) { - if (container.shadowRoot) { + if (hasShadowDom(container)) { let input = container.querySelector('input.aux-input') as HTMLInputElement; if (!input) { input = container.ownerDocument.createElement('input');