-
-
Notifications
You must be signed in to change notification settings - Fork 8.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Vue 3 does not work well with iframes #2513
Comments
I'm in a similar boat, not sure how much it's related to OP but it sounds very similar. I've a Vue.js app with an iframe, which loads a different Vue.js app. Sometimes, click events weren't registering in the nested app, commenting out the line highlighted in OP helped. It's weird because it didn't happen every time and both machines are running the same version of browser. |
From what you experience, this is the same issue |
@yyx990803 Looking at the source code, I noticed this comment accompanied the "fix" that introduced the problem above:
I have made some tests using the reproduction template provided in the initial ticket ( vuejs/vue#6566 ) with Vue 3 and it seems that the problem mentioned there is not reproducing anymore if I comment out the timestamp check. Are there other issues that involved that fix? If there aren't, I would like to make a pull request removing the timestamp check. |
I have the same problem in 3.0.7. Is there a solution now?the reproduce |
raise by the iframe's event.timeStamp. need to wait until the iframe's creation time longer than clickEvent's creation time. |
It's not a solution.🙁 |
Is there any solution to fix this problem yet? Every time, I mounted an iframe without reloading the page, |
As indicated by the open issue, there's no solution yet. |
The "solution" we are using in production is to manually modify a vue file and disable this ( runtime-dom.esm-bundler.js in our case ), however, I do not recommend doing so as other problems may appear. The changes we've made: We have this modification in a live product ( zionbuilder.io ) and didn't encounter any side effects so far. I also tested the initial bug that introduced this modification and I cannot reproduce it in Vue 3 ( with the timestamp check disabled ), so, I am not sure if the initial problem is still valid in Vue 3. |
Thank you so much, it was working great, I will try with a new fork 👍 |
@zauan Here's a demo of the behaviour this check is meant to protect against, simulated with a custom directive (which leaves event handling to your vanilla JS adn thus doesn't contain this check unless added manually: https://jsfiddle.net/Linusborg/tc1aksvx/ It really is an edge case so things could seem to be working fine for 99.9% of the time with your change in place. But you could still be right theoretically that the problem doesn't persist with actual v-on events with your modification, haven't had the time to properly test this (optimally across all supported browsers). |
The workaround to this problem is to register all events in <template>
<div ref="mydiv"></div>
</template>
<script>
export default {
setup() {
const mydiv = ref(null);
onMounted(() => {
mydiv.value.addEventListener('click', handler);
});
onBeforeUnmount(() => {
mydiv.value.removeEventListener('click', handler);
});
function handler(event) {
// ...
}
return {
mydiv,
};
}
};
</script> |
Yes, this works on smaller projects, however, this cannot be implemented in larger projects like Zion Builder as it increase the code base and there are many places were events are used. Also, can you please also add the removeEventListener on the 'beforeUnmount' hook to your code so that the event gets removed when the component gets unmounted ( in case someone wants to use you workaround and just copies and pastes the code ) |
Sure, I edited the code. |
This issue is a nightmare for big projects. Adding events manually doesn't work for elements with v-if conditions. I hope this bug will be fixed soon. |
I confirm that the problem is still here, is there any update on that? |
For information, this is how we temporaly fix it for our usecase (App which load components inside iframe) iframe.onload = () => { Tested only on Chrome, this is a way to resynchronise the timestamps used by Vue |
For anyone else attempting @zauan's fix in Vite, here's what I needed to do-
|
I am also encountering this issue when mounting a component into an empty iframe. Since the time check fix concerns only rare edge cases and introduces bugs in other cases, it might be interesting to allow disabling this check, either via a global application config, or locally per component (and its children). |
FYI, I am working on a solution to allow opting out of the timestamp check. |
related issue : #3933 |
Really struggling with this one. None of the workarounds above seem to work reliably and @semiaddict 's pull request has been sitting there unmerged for over 6 months. Is there any updates? |
@Hyperblaster this was the only thing that worked for me.
Edit: Credit to @lidlanca for this solution from #3933 (comment) |
I wouldn't recommend overriding the userAgent as this can have side effects within and outside of Vue. I've personally been patching Vue 3 with the changes in my pull request using patch-package without issues. I just hope someone in the Vue team will get the time to look into the pull request soon. |
Any chance of getting the pull request reviewed? |
@semiaddict @Kyon147 the source of this snippet is from here and it doesn't override the user-agent, it actually overrides the |
@lidlanca thanks so much! This helped me solve my issue. Adding the script into the head (before vue is initialised) seemed to do the trick. I tried all kinds of things in Hopefully this can be merged and fixed in core soon |
Has anybody come across this issue with Vue 3 using the Options API? Any idea if it's been resolved yet at all? |
We're about to starting building a Vue application for a client but have been informed that it may need to be placed inside an iframe for 3rd party sites using the app; what problems do we need to be aware of with this in 2023? |
@nicholasfishjgm I haven't yet deployed my Vue3 Options API application yet, it's going to sit in an iframe on a client's Wordpress site, so I'll let you know any issues/solutions I have. |
Thanks @miainchambers, that would be much appreciated |
@miainchambers I'm using Vue 3 with the comp api but I still have that "fix" in place and don't want to remove it until there is an official fix in place... |
Version
3.0.2
Reproduction link
https://codesandbox.io/s/unruffled-northcutt-cmndl?file=/public/iframe.html
Steps to reproduce
What is expected?
The click event should fire immediatelly
What is actually happening?
The click is not working until the event.timestamp ( that is generated by the iframe dom ) gets higher than the attached timestamp from the parent window.
More info can be found here ( https://github.com/vuejs/vue-next/blob/ea5f92ae051be511558569eaf4c2afa2839c3e4d/packages/runtime-dom/src/modules/events.ts#L114 here, inside the iframe the event.timeStamp which is calculated based on the iframe timestamp is lower than the initial invoker.attached = getNow() that is calculated based on the parent frame ). Due to this, events are not firing for the time difference it takes the iframe to load
The text was updated successfully, but these errors were encountered: