В данной статье мы рассмотрим проблему, с которой сталкиваются разработчики, использующие компонент TWebBrowser в Delphi XE7 для отображения JavaScript-контента, в частности, библиотеки D3. Проблема заключается в том, что при попытке выполнить JavaScript-код, ссылающийся на локальные ресурсы, встроенный браузер в Delphi выдает ошибку, в то время как тот же контент корректно отображается в современных браузерах, таких как Chrome или IE 11.
Описание проблемы
Компонент TWebBrowser в Delphi XE7 представляет собой ActiveX-обертку для Internet Explorer. При попытке загрузить веб-страницу, использующую JavaScript-библиотеку D3, которая сервируется локальным сервером (например, WAMPServer), встроенный браузер выдает сообщение об ошибке, указывающее на проблему со скриптом на странице.
Пользователь уже предпринял ряд шагов для решения проблемы:
Очистка кэша IE
Сброс настроек интернета в панели управления Windows
Установка минимального уровня безопасности IE
Отключение антивирусной защиты
Анализ проблемы
Проблема может быть связана с тем, что по умолчанию встроенный веб-браузер в Delphi запускается в режиме совместимости с IE7. Это может привести к некорректной работе современного JavaScript-кода, предназначенного для более новых версий браузера.
Подтвержденный ответ
Для решения проблемы можно использовать один из двух подходов:
Этот тег указывает браузеру использовать последнюю доступную версию движка для отображения страницы.
Добавление класса TBrowserEmulationAdjuster в ваш проект Delphi и вызов его метода SetBrowserEmulationDWORD с параметром, соответствующим желаемому режиму совместимости (например, IE11_Quirks для режима IE11 с использованием режима несовместимости):
Этот метод изменяет настройки режима совместимости для вашего приложения в реестре Windows.
Пример кода на Object Pascal (Delphi)
type
TBrowserEmulationAdjuster = class
private
class function GetExeName: String; inline;
public
const
IE11_default = 11000;
IE11_Quirks = 11001;
// ... другие константы ...
IE7_embedded = 7000;
class procedure SetBrowserEmulationDWORD(const Value: DWORD);
end;
implementation
class function TBrowserEmulationAdjuster.GetExeName: String;
begin
Result := TPath.GetFileName(ParamStr(0));
end;
class procedure TBrowserEmulationAdjuster.SetBrowserEmulationDWORD(const Value: DWORD);
var
Registry: TRegistry;
ExeName: String;
begin
ExeName := GetExeName;
Registry := TRegistry.Create(KEY_SET_VALUE);
try
Registry.RootKey := HKEY_CURRENT_USER;
Registry.OpenKey('\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION', True);
Registry.WriteInteger(ExeName, Value);
finally
Registry.Destroy;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
TBrowserEmulationAdjuster.SetBrowserEmulationDWORD(TBrowserEmulationAdjuster.IE11_Quirks);
end;
Добавьте этот код в ваш проект, и вызовите процедуру FormCreate в событии OnCreate формы, содержащей компонент TWebBrowser.
Заключение
Использование компонента TWebBrowser в Delphi XE7 для отображения JavaScript-контента может быть неожиданно сложной задачей из-за ограничений, связанных с режимом совместимости. Приведенные выше решения помогут вам улучшить совместимость и обеспечить корректную работу JavaScript-кода, включая библиотеку D3, в вашем приложении.
Проблема связана с некорректной работой компонента `TWebBrowser` в Delphi XE7 при использовании JavaScript-контента, в частности библиотеки D3, из-за ограничений режима совместимости встроенного браузера.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.