CEF 攔截打開超鏈接事件

使用 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 函數。