Skip to content
This repository has been archived by the owner on Jul 26, 2022. It is now read-only.

Selecting item from list doesn’t fired @hit on Safari #14

Open
socheatsok78 opened this issue Sep 7, 2018 · 14 comments
Open

Selecting item from list doesn’t fired @hit on Safari #14

socheatsok78 opened this issue Sep 7, 2018 · 14 comments
Labels
bug Something isn't working

Comments

@socheatsok78
Copy link

On Safari, selecting item from the list doesn’t do anything! Any solution?

@alexurquhart alexurquhart added the bug Something isn't working label Sep 7, 2018
@alexurquhart
Copy link
Owner

Thanks for the feedback. I don't have any solution yet, I'll have to find a way to test on Safari.

@Owumaro
Copy link
Contributor

Owumaro commented Sep 7, 2018

I started digging on this and

While this provides the clicked element in Chrome, the value in Safari is null....

capture d ecran 2018-09-08 a 00 22 20

Weird as Safari seems to be ok on this:
https://developer.mozilla.org/en-US/docs/Web/API/FocusEvent/relatedTarget#Browser_compatibility

In some cases (like when tabbing in or out of a page), this property may be set to null for security reasons.

Don't think this applies here...

@Owumaro
Copy link
Contributor

Owumaro commented Sep 8, 2018

Found a nice explanation here:

https://stackoverflow.com/questions/42764494/blur-event-relatedtarget-returns-null

I just tested adding tabindex="0" on the <a> tag in VueBootstrapTypeaheadListItem.vue and it does fix the issue in Safari.

@ChuchunovMV
Copy link

Hi, the same problem manifested itself in IE11, the Blur event does not return a relatedTarget, it worked when I changed the event to focusout. Can you fix the release?

@chriszrc
Copy link

Huh, it's working for me in Safari, what version of Safari are you using?

@rmknecht
Copy link

Hi, the same problem manifested itself in IE11, the Blur event does not return a relatedTarget, it worked when I changed the event to focusout. Can you fix the release?

Can confirm, I am encountering the same issue in IE11.

@AntoineLX
Copy link

Hi, the same problem manifested itself in IE11, the Blur event does not return a relatedTarget, it worked when I changed the event to focusout. Can you fix the release?

Same issue here on IE11. Can you please please fix the release ?

@triplejae
Copy link

Also confirmed that IE11 does not fire the @hit event. Fix would be much appreciated here.

@nitin-fed
Copy link

please give some solution for the @hit is not firing in IE 11. Banging my head for this issue. Please provide some fix...

@rmknecht
Copy link

After looking into why the hit event "disappears" in IE11 I believe the issue is related to hiding and showing <vue-bootstrap-typeahead-list> at:

v-show="isFocused && data.length > 0"

When v-show == false the element in the DOM is set to display: none; and IE11 appears to ignore/supress/blow-away any associated events bubbling up - including the emitted hit.

I removed the v-show and the event works in IE11; however, this breaks the display logic and the list remains visible.

I tried swapping v-show on <vue-bootstrap-typeahead-list> for a custom class to "move" the list out of view, instead of setting the display property, and didn't have any luck resolving the issue. Will continue to poke around to see if an IE11 compatible solution exists.

@Raisi
Copy link

Raisi commented Oct 29, 2019

Solved with an faked animation and an duration that is quite long enough to count as user interaction:
replaced
v-show="isFocused && data.length > 0"
with
:class="{'vbt-autcomplete-list--hidden': !(isFocused && data.length > 0)}"
and in the style section

/* Fake for IE. because it doesn't emit the hit event when using display:none */
    .vbt-autcomplete-list--hidden {
        animation-name: hide;
        animation-fill-mode: both;
        animation-duration: .3s;
        animation-timing-function: linear;
    }


    @keyframes hide {
        to {
            visibility: hidden;
            display: none;
        }
    }

@socheatsok78
Copy link
Author

@Raisi do a pull request 👍

@stanislavhannes
Copy link

Solved with an faked animation and an duration that is quite long enough to count as user interaction:
replaced
v-show="isFocused && data.length > 0"
with
:class="{'vbt-autcomplete-list--hidden': !(isFocused && data.length > 0)}"
and in the style section

/* Fake for IE. because it doesn't emit the hit event when using display:none */
    .vbt-autcomplete-list--hidden {
        animation-name: hide;
        animation-fill-mode: both;
        animation-duration: .3s;
        animation-timing-function: linear;
    }


    @keyframes hide {
        to {
            visibility: hidden;
            display: none;
        }
    }

Thank u very much! Works perfect!

@peterhass
Copy link

Solved with an faked animation and an duration that is quite long enough to count as user interaction:
replaced
v-show="isFocused && data.length > 0"
with
:class="{'vbt-autcomplete-list--hidden': !(isFocused && data.length > 0)}"
and in the style section

/* Fake for IE. because it doesn't emit the hit event when using display:none */
    .vbt-autcomplete-list--hidden {
        animation-name: hide;
        animation-fill-mode: both;
        animation-duration: .3s;
        animation-timing-function: linear;
    }


    @keyframes hide {
        to {
            visibility: hidden;
            display: none;
        }
    }

Thanks a lot!

Since I needed to fix this ASAP I created a component to apply the workaround. I didn't like copying the whole template section but I found no other quick solution (other than forking this package).

<template>
  <div>
    <div :class="sizeClasses">
      <div
        ref="prependDiv"
        v-if="$slots.prepend || prepend"
        class="input-group-prepend"
      >
        <slot name="prepend">
          <span class="input-group-text">{{ prepend }}</span>
        </slot>
      </div>
      <input
        ref="input"
        type="search"
        :class="`form-control ${inputClass}`"
        :placeholder="placeholder"
        :aria-label="placeholder"
        :value="inputValue"
        @focus="isFocused = true"
        @blur="handleBlur"
        @input="handleInput($event.target.value)"
        autocomplete="off"
      />
      <div v-if="$slots.append || append" class="input-group-append">
        <slot name="append">
          <span class="input-group-text">{{ append }}</span>
        </slot>
      </div>
    </div>
    <vue-bootstrap-typeahead-list
      class="vbt-autcomplete-list"
      ref="list"
      :class="{
        'vbt-autcomplete-list--hidden': !(isFocused && data.length > 0)
      }"
      :query="inputValue"
      :data="formattedData"
      :background-variant="backgroundVariant"
      :text-variant="textVariant"
      :maxMatches="maxMatches"
      :minMatchingChars="minMatchingChars"
      @hit="handleHit"
    >
      <!-- pass down all scoped slots -->
      <template
        v-for="(slot, slotName) in $scopedSlots"
        :slot="slotName"
        slot-scope="{ data, htmlText }"
      >
        <slot :name="slotName" v-bind="{ data, htmlText }"></slot>
      </template>
      <!-- below is the right solution, however if the user does not provide a scoped slot, vue will still set $scopedSlots.suggestion to a blank scope
            <template v-if="$scopedSlots.suggestion" slot="suggestion" slot-scope="{ data, htmlText }">
              <slot name="suggestion" v-bind="{ data, htmlText }" />
            </template>-->
    </vue-bootstrap-typeahead-list>
  </div>
</template>
<script>
// Workaround to fix dead list selection in IE
// https://github.com/alexurquhart/vue-bootstrap-typeahead/issues/14#issuecomment-547389426
import VueBootstrapTypeahead from "vue-bootstrap-typeahead"

export default {
  extends: VueBootstrapTypeahead
}
</script>
<style lang="scss">
/* Fake for IE. because it doesn't emit the hit event when using display:none */
.vbt-autcomplete-list--hidden {
  animation-name: hide;
  animation-fill-mode: both;
  animation-duration: 0.3s;
  animation-timing-function: linear;
}

@keyframes hide {
  to {
    visibility: hidden;
    display: none;
  }
}
</style>

danigm added a commit to endlessm/kolibri-channel-custom-web-app that referenced this issue Feb 24, 2021
The VueBootstrapTypeahead component doesn't work correctly on IE11:

alexurquhart/vue-bootstrap-typeahead#14

There's a fix proposed in the issue, so right now, without a new release
we just can override the component with the fix.

https://phabricator.endlessm.com/T31418
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests