WebView加载URL(“javascript:XYZ”)在我的网络视图中执行了好几次

WebView loadURL("javascript:XYZ") get executed several times in my webview

本文关键字:网络 我的 视图 好几次 执行 URL 加载 javascript XYZ WebView      更新时间:2024-06-02

我有一个网络视图,它显示了一条确认用户交互的消息。该消息应该在该页面其他地方的任何用户交互后淡出。为此,我检测任何onTouchEvent,并向网页注入一个调用,以触发消息淡出。

第一次这样做效果很好,但如果我第二次这样做(网页没有重新加载,但通过javascript将不透明度设置回1并显示为"阻止",消息会再次显示),但在没有任何用户交互的情况下,消息会立即消失。从日志语句中,我可以看到onTouchEvent没有被触发,也没有注入javascript。

我怀疑loadURL在网页中创建了一些弹性调用,这些调用会一直存在并以某种方式再次激活。有没有什么方法可以清除这一点,只执行一次?

我在我的WebView中捕捉到onTouchEvent,如下所示:

    final class MyWebView extends WebView {
    ...
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.v(TAG,"onTouchEvent");
        if (mUndoActive && (event.getAction() == MotionEvent.ACTION_DOWN)) {
            mUndoActive = false;
            mLastAction = LAST_ACTION_NONE;
            Log.v(TAG,"send hide message");
            handler.sendEmptyMessageDelayed(CLICK_ON_WEBVIEW, 300);
        }
        return super.onTouchEvent(event);
    }
}

在父活动中,我覆盖handleMessage,并向我的网络视图注入一个javascript,以触发淡出消息元素的javascript,如下所示:

    @Override
    public boolean handleMessage(Message msg) {
      Log.v(TAG,"handleMessage triggered");
      if (msg.what == CLICK_ON_WEBVIEW){
        Log.v(TAG,"handle message registerd click from stack view web page");
        webview.loadUrl("javascript:hideMessage()");
        return true;
      }
      return false;
    }

webview中的javascript为:

function hideMessage() {
  var message = document.getElementById("message");
  if (message != null) {
    if (!message.style.opacity) {
     message.style.opacity = 1;
    } 
    var fader = setInterval(function(){
      message.style.opacity -= .02;
      if (message.style.opacity <= 0) {
        clearInterval(fader);
        message.style.display = "none";
      }
    }, 25);
   }
 }

我自己发现了一个解决方案:在用window进行2次Interval调用之前,即window.clearInterval(fader)确实解决了这个问题。我不太明白为什么,但看起来间隔计时器确实一直在运行,并且没有正确关闭。