You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Firemonkey iOS/Android应用中禁用TWebBrowser控件的滚动功能?

FireMonkey iOS/Android 禁用TWebBrowser滚动及触摸操作方案

我刚好折腾过类似需求,给你分享几个可行的实现方式,分iOS和Android平台来处理——毕竟FireMonkey的跨平台控件底层逻辑不太一样:

iOS平台实现思路

iOS上TWebBrowser底层是UIWebView(或新版本的WKWebView),有两种方式可以实现完全静态的效果:

  • 方案一:JavaScript注入(简单易上手)
    等页面加载完成后,注入JS代码直接从网页层面禁用滚动和触摸响应:
procedure TForm1.WebBrowser1DidFinishLoad(ASender: TObject);
begin
  WebBrowser1.EvaluateJavaScript(
    'document.body.style.overflow = "hidden"; ' +
    'document.addEventListener("touchstart", function(e){e.preventDefault();}, {passive: false}); ' +
    'document.addEventListener("touchmove", function(e){e.preventDefault();}, {passive: false});'
  );
end;

这种方式适合加载静态页面的场景,不需要操作原生控件,兼容性也不错。

  • 方案二:直接操作原生控件(彻底禁用)
    如果JS注入不够彻底,你可以直接获取iOS原生的WebView实例,禁用它的滚动和交互:
uses
  FMX.WebBrowser.iOS, iOSapi.UIKit, Macapi.ObjectiveC;

procedure DisableWebBrowserScroll(WebBrowser: TWebBrowser);
var
  LWebView: UIWebView;
begin
  if WebBrowser.Handle <> nil then
  begin
    LWebView := TUIWebView.Wrap(TWebBrowseriOS(WebBrowser).GetWebView);
    LWebView.scrollView.setScrollEnabled(False);
    LWebView.scrollView.setUserInteractionEnabled(False); // 完全屏蔽所有触摸操作
  end;
end;

记得在WebBrowser1DidFinishLoad事件里调用这个方法,如果你的Delphi版本用的是WKWebView,只需要把UIWebView换成WKWebView,核心逻辑都是找到scrollView然后禁用相关属性。

Android平台实现思路

Android上TWebBrowser底层是android.webkit.WebView,同样有两种方案:

  • 方案一:JavaScript注入(和iOS通用)
    和iOS端逻辑一致,页面加载完成后注入相同的JS代码即可:
procedure TForm1.WebBrowser1DidFinishLoad(ASender: TObject);
begin
  WebBrowser1.EvaluateJavaScript(
    'document.body.style.overflow = "hidden"; ' +
    'document.addEventListener("touchstart", function(e){e.preventDefault();}, {passive: false}); ' +
    'document.addEventListener("touchmove", function(e){e.preventDefault();}, {passive: false});'
  );
end;
  • 方案二:操作原生WebView(彻底拦截触摸)
    通过获取Android原生WebView实例,禁用滚动条并拦截所有触摸事件:
uses
  FMX.WebBrowser.Android, Androidapi.JNI.WebKit, Androidapi.JNI.GraphicsContentViewText;

procedure DisableWebBrowserScroll(WebBrowser: TWebBrowser);
var
  LWebView: JWebView;
begin
  if WebBrowser.Handle <> nil then
  begin
    LWebView := TWebBrowserAndroid(WebBrowser).WebView;
    // 禁用垂直/水平滚动条
    LWebView.setVerticalScrollBarEnabled(False);
    LWebView.setHorizontalScrollBarEnabled(False);
    // 拦截所有触摸事件,让WebView不响应任何触摸操作
    LWebView.setOnTouchListener(TJOnTouchListener.Wrap(
      TAnonymousMethod.Create(function(v: JView; e: JMotionEvent): Boolean
      begin
        Result := True;
      end)
    ));
  end;
end;

通用注意事项

  • 所有操作都要在WebBrowser1DidFinishLoad事件中执行,只有页面加载完成后,JS注入或原生控件操作才能生效。
  • 如果加载的是本地HTML文件,你可以直接在HTML里提前写好禁用代码,这样更省心:
<style>
  body { overflow: hidden; }
</style>
<script>
  document.addEventListener("touchstart", e => e.preventDefault(), {passive: false});
  document.addEventListener("touchmove", e => e.preventDefault(), {passive: false});
</script>

内容的提问来源于stack exchange,提问作者Mahmoud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:13:50