NO IMAGE

使用CEF時,載入的網頁,如果裡面有連結,指定target=”_blank”,則會彈出一個新的瀏覽視窗。如果想禁掉,讓新頁面在當前瀏覽視窗中顯示,可以在browser程序的handler裡重寫CefLifeSpanHandler的OnBeforePopup方法,用browser的mainFrame載入popup請求的url。程式碼如下:

bool SimpleHandler::OnBeforePopup(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
const CefString& target_url,
const CefString& target_frame_name,
WindowOpenDisposition target_disposition,
bool user_gesture,
const CefPopupFeatures& popupFeatures,
CefWindowInfo& windowInfo,
CefRefPtr<CefClient>& client,
CefBrowserSettings& settings,
bool* no_javascript_access)
{
switch (target_disposition)
{
case WOD_NEW_FOREGROUND_TAB:
case WOD_NEW_BACKGROUND_TAB:
case WOD_NEW_POPUP:
case WOD_NEW_WINDOW:
browser->GetMainFrame()->LoadURL(target_url);
return true; //cancel create
}
return false;
}

OnBeforePopup函式的第一個引數browser代表了發出popup請求的瀏覽器物件,frame是發出popup請求的那個frame,target_url是要載入的目標url,target_disposition是顯示方式。我們就管這幾個引數就行了,針對特定的幾種WOD,用browser的mainFrame載入新的url,返回true,結束建立新視窗的流程。

關於這種需求,這還有一些討論可以參考:http://www.magpcss.org/ceforum/viewtopic.php?f=6&t=196。裡面提到修改DOM或者修改CEF的原始碼來實現,也可以參考。


就這樣吧。

其他參考文章詳見我的專欄:【CEF與PPAPI開發】。