WebView loadURL(“javascript:XYZ”)在我的webview中多次执行

时间:2012-07-31 07:32:10

标签: javascript android android-webview

我有一个webview,显示确认用户交互的消息。在该页面上的其他任何用户交互之后,该消息应该淡出。为此,我检测到任何onTouchEvent并注入对网页的调用以触发消息淡出。

这是第一次运行良好,但如果我第二次这样做(网页没有重新加载,但是通过将不透明度设置为1并显示为“阻止”,通过javascript再次显示该消息)该消息再次显示但是然后立即淡出没有任何用户交互。从日志语句中我可以看到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注入我的webview以触发淡出这样的消息元素的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);
   }
 }

1 个答案:

答案 0 :(得分:0)

我自己找到了一个解决方案:用窗口进行2次间隔调用,即。 window.clearInterval(推子)确实解决了这个问题。我不太明白为什么,但看起来间隔计时器确实持续运行并且没有正确关闭。