В старом Awesomium? (нового вроде пока нет для .NET)
Он ж давно умер, вместо него лучше что-то на основе CEF (CefGlue, CefSharp, …).
хз даже где сейчас его документацию найти.
ну так то да … но проект то уже работает на авесомиуме. никто не горит желанием спонсировать перевод на новый функционал.
Если ссылки в новом окне открываются (они по умолчанию вроде никак не откроются), то можно ловить их в ShowCreatedWebView
как тут или в оф. примерах (кстати, скачать Awesomium с документацией и примерами можно тут в веб-архиве).
Если надо просто знать о переходе без возможности прервать и т.п. — AddressChanged
.
Если не в новом окне и надо прерывать — скорее всего ResourceInterceptor
.
там даже не ссылки а переходы по параграфам. адрес не срабатывает. webview только один раз создается и дальше не меняется и не срабатывает также евент.
Должно работать если адрес меняется, например, как при <a href="#some_section_id">
.
Покажите код ссылок или адрес сайта с ними )
Вот так оглавление выглядит
<li class="liMenu"><span class="folder"><a target="mainFrame" href="1.2.html#Par101">Раздел 1</a></span></li>
А вот так в основной странице
<div class="s2B aC bH" ><a id="Par101"></a>Раздел</div>
То есть никаких новый окон не открывается. Изначально все загружается а дальше просто навигация по страницу.
А, если во фрейме, то да, сложнее, потому что адрес основной страницы не меняется же.
Как вариант можно так:
private void Log(string text)
{
lstLog.Items.Insert(0, text);
}
private void LoadWebsiteWithFrames()
{
File.WriteAllText("index.html", @"<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>Title</title>
</head>
<body>
<table>
<tr>
<td width=""200px"">
<iframe src=""list_frame.html"" name=""list_frame""></iframe>
</td>
<td width=""100%"">
<iframe src=""page1.html"" name=""content_frame""></iframe>
</td>
</tr>
</table>
</body>
</html>");
File.WriteAllText("list_frame.html", @"<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>List</title>
</head>
<body>
<ul>
<li><a href=""page1.html"" target=""content_frame"">Page 1</a></li>
<li><a href=""page2.html"" target=""content_frame"">Page 2</a></li>
</ul>
</body>
</html>");
File.WriteAllText("page1.html", @"<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>Page 1</title>
</head>
<body>
<h1>Hello</h1>
</body>
</html>");
File.WriteAllText("page2.html", @"<!DOCTYPE html>
<html lang=""en"">
<head>
<meta charset=""UTF-8"">
<title>Page 2</title>
</head>
<body>
<h1>World</h1>
</body>
</html>");
webControl1.Source = new Uri(Environment.CurrentDirectory + "/index.html");
}
public Form1()
{
InitializeComponent();
webControl1.ViewType = Awesomium.Core.WebViewType.Offscreen;
LoadWebsiteWithFrames();
webControl1.MouseClick += (o, e) =>
{
if (webControl1.HasTargetURL && e.Button == MouseButtons.Left)
{
Log("Clicked " + webControl1.TargetURL.ToString());
}
};
webControl1.KeyUp += (o, e) =>
{
if (webControl1.HasTargetURL && e.KeyCode == Keys.Enter)
{
Log("Clicked via keyboard " + webControl1.TargetURL.ToString());
}
};
}
Еще по идее можно примерно так:
webControl1.LoadingFrameComplete += (o, e) =>
{
if (e.IsMainFrame)
{
JSObject linkClickHandler = webControl1.CreateGlobalJavascriptObject("linkClickHandler");
linkClickHandler.Bind("handle", (s, ev) =>
{
string url = ev.Arguments[0].ToString();
Log("Clicked " + url);
return null;
});
}
if (e.OriginalString.EndsWith("list_frame.html"))
{
webControl1.ExecuteJavascript(@"
<подписаться на события клика <a> и т.п.>
linkClickHandler.handle('url'));
",
"//*[@name='list_frame']");
}
};
но чот не работает из фрейма даже с
webControl1.WebSession = WebCore.CreateWebSession(new WebPreferences
{
WebSecurity = false
});
Может быть есть способы проще, я Awesomium в основном использовал не для такого взаимодействия, а для автоматизации действий на сайте (потом перешел на Selenium и стало в 100500 раз проще ).
Заказчик настаивает на поддержке XP. Насколько я читал эти новые платформы уже там не работают.
Какие?
Selenium любые браузеры автоматизирует, но он для автоматизации (боты, …) и автоматических тестов, а не для HTML UI и встраивания браузера в приложение.
А CEF да, примерно с 49 версии Хромиум не поддерживает ХР. Но старая версия CEF думаю таки лучше Авесомиума потому что опен-сорс, есть сообщество, больше шанс получить помощь/исправления и т.д., ну и более новая версия Хромиума (в Awesomium 18 Хромиум).