WebView加载URL(“javascript:XYZ”)在我的WebView中执行多次

WebView加载URL(“javascript:XYZ”)在我的WebView中执行多次,javascript,android,android-webview,Javascript,Android,Android Webview,我有一个webview,它显示了一条确认用户交互的消息。在该页面的其他地方进行任何用户交互后,该消息应该会淡出。为此,我检测任何onTouchEvent并向网页注入一个调用以触发消息淡出 这在第一次使用时效果很好,但如果我第二次使用它(网页不会重新加载,但消息会通过javascript再次显示,方法是将“不透明度”设置为1,并将“显示”设置为“阻止”),消息会再次出现,但随后会立即消失,没有任何用户交互。从log语句中,我可以看到onTouchEvent没有被触发,我也没有注入javascrip

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

这在第一次使用时效果很好,但如果我第二次使用它(网页不会重新加载,但消息会通过javascript再次显示,方法是将“不透明度”设置为1,并将“显示”设置为“阻止”),消息会再次出现,但随后会立即消失,没有任何用户交互。从log语句中,我可以看到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);
    }
}
    @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;
    }
在父活动中,我覆盖handleMessage并将javascript注入我的webview以触发javascript,该javascript淡出消息元素,如下所示:

    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);
    }
}
    @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);
   }
 }
函数隐藏消息(){
var message=document.getElementById(“消息”);
如果(消息!=null){
如果(!message.style.opacity){
message.style.opacity=1;
} 
var fader=setInterval(函数(){
message.style.opacity-=.02;

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