亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

iframe 內的 Vue 3 實例中事件監聽器的延遲注冊

iframe 內的 Vue 3 實例中事件監聽器的延遲注冊

桃花長相依 2023-08-10 14:36:28
當將新元素添加到 中時iframe,用戶事件(即單擊)需要相當長的時間才能開始被識別。(在我的場景中更加明顯,以至于完全無法使用)精通 Vue 的人是否至少了解為什么會發生這種情況以及是否有辦法防止它發生?任何見解將不勝感激。謝謝。*原因是我正在構建一個瀏覽器擴展,將側邊欄注入到頁面中,并且我需要隔離CSS,因為該擴展要在各個頁面上使用,所以幾乎不可能防止所有樣式泄漏到頁面中注入側邊欄。是的,避免iframe使用 and using#myDiv{ all: unset }在某種程度上是有效的,但對于頁面 CSS 中定義的一些非常具體的選擇器來說會失?。ú⑶彝耆贿m用于input元素)。在我想要支持的所有頁面上尋找它們很快就會變成一場噩夢。
查看完整描述

1 回答

?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

回答我自己的問題,因為沒有人對此有任何解釋。然而,這并沒有回答最初的問題,但我認為如果有人偶然發現這個問題,他們應該知道我是如何解決它的。

最后,我放棄了 iFrame 的想法,并使用Shadow DOM的概念來將頁面的 CSS 和注入的擴展的 CSS 彼此隔離。

盡管這種方法有其自身的注意事項*,但恕我直言,它優于使用 iframe。

*就像需要手動將自定義樣式注入到影子根中一樣。并且還需要將影子根元素存儲在應用程序所有部分都可以訪問的地方(不是 Vuex,元素本身不能存儲在那里),以便使諸如此類的事情正常工作。

這是我用來將側邊欄注入頁面的代碼片段:

// append a new node to the document body

let shadowHost = document.createElement("div");

document.body.appendChild(shadowHost);

? ??

// make it the root of our shadow DOM

let shadow = shadowHost.attachShadow({ mode: 'open'})


// create a new node for the sidebar

let sidebar = document.createElement("div");

sidebar.id = "my-sidebar";


// and also a style node into which we put all our custom css

const style = document.createElement('style');

// getPackedCss is my function that returns all the custom css as a string

style.textContent = getPackedCss();


// and append those to the shadow DOM

shadow.appendChild(style);

shadow.appendChild(sidebar);

? ??

// store the shadow root somewhere that we can access

// globally in order to select elements from it

staticStore.shadowRoot = shadow;


// create our vue app and mount it to the shadow DOM

const app = createApp(MyApp);

app.mount(sidebar);

如果您確實需要 Vue 3 和 iframe 來互相點贊,我想您只能靠自己了。


查看完整回答
反對 回復 2023-08-10
  • 1 回答
  • 0 關注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號