CEF 攔截打開超鏈接事件
- 2020 年 1 月 4 日
- 筆記
使用 CEF 載入指定頁面後,如果你希望控制頁面在打開超鏈接時根據自己預定義的一些行為來操作,比如在自己的 UI 框架中新建一個 Tab 頁又或者阻止打開新的頁面等。我們就需要通過 CEF 提供的兩個介面來實現這個功能了,分別是 OnBeforeBrowser 和 OnBeforePopup,兩個介面各有各的用處,下面分別來詳細介紹兩個介面的作用。
OnBeforePopup
當你在頁面中編寫了一個 target 屬性為 _blank 的超鏈接標籤時,介面中點擊這個超鏈接就會跳轉到這個介面中,該介面聲明如下:
virtual bool OnBeforePopup(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, const CefString& target_url, const CefString& target_frame_name, CefLifeSpanHandler::WindowOpenDisposition target_disposition, bool user_gesture, const CefPopupFeatures& popupFeatures, CefWindowInfo& windowInfo, CefRefPtr<CefClient>& client, CefBrowserSettings& settings, bool* no_javascript_access) = 0;
- browser 和 frame 分別代表當前瀏覽器實例和表示了在哪個 frame 觸發的這個事件
- target_url 和 target_frame_name 代表了目標要打開的地址和 frame 名稱
- target_disposition 描述了是從當前頁還是從新標籤中打開鏈接
- user_gesture 如果用戶手動點擊 a 標籤觸發這個事件則該屬性為 true,否則如果是自動觸發的為 false(重要)
- popupFeatures 包含了一些彈窗的資訊,是一個結構體自己可以跟進去看一下
- windowInfo 窗口的資訊
- client 當前客戶端實例
- settings 彈出窗口的設置資訊
- no_javascript_access 是否允許彈出的窗口使用 JS 腳本,如果為 false 則不允許使用並且與當前頁面可能不在一個 render 進程中
當該函數返回 false 的時候,則允許彈出窗口,為 true 的時候就攔截掉不允許彈出了。這裡你可以根據自己的需要隨便修改。但如果你點擊的鏈接是一個不帶 _blank 屬性的鏈接,那麼就需要下面的介面才能攔截到了。
OnBeforeBrowser
上面介紹的介面只管彈出窗口的一些資訊透傳,而這個介面無論你是彈出窗口還是從當前頁面載入一個地址,都會經過該介面。該介面的一些參數就不多介紹了,我們關注返回值就好了,當返回值為 false 的時候,頁面繼續載入。當返回值為 true 的時候,不好意思頁面就停止載入了。與上面方法不同的是所有打開新鏈接的操作都會經過這個介面,OnBeforePopup 也是一樣,當你打開一個彈出窗口的鏈接時,首先進入 OnBeforePopup 再進入 OnBeforeBrowser 函數。