WebView加载URL(“javascript:XYZ”)在我的WebView中执行多次
我有一个webview,它显示了一条确认用户交互的消息。在该页面的其他地方进行任何用户交互后,该消息应该会淡出。为此,我检测任何onTouchEvent并向网页注入一个调用以触发消息淡出 这在第一次使用时效果很好,但如果我第二次使用它(网页不会重新加载,但消息会通过javascript再次显示,方法是将“不透明度”设置为1,并将“显示”设置为“阻止”),消息会再次出现,但随后会立即消失,没有任何用户交互。从log语句中,我可以看到onTouchEvent没有被触发,我也没有注入javascript 我怀疑loadURL在网页中创建了一些弹性调用,这些调用会粘住并以某种方式再次激活。 是否有任何方法可以清除此项并只执行一次 我在WebView中捕捉到onTouchEvent,如下所示:WebView加载URL(“javascript:XYZ”)在我的WebView中执行多次,javascript,android,android-webview,Javascript,Android,Android Webview,我有一个webview,它显示了一条确认用户交互的消息。在该页面的其他地方进行任何用户交互后,该消息应该会淡出。为此,我检测任何onTouchEvent并向网页注入一个调用以触发消息淡出 这在第一次使用时效果很好,但如果我第二次使用它(网页不会重新加载,但消息会通过javascript再次显示,方法是将“不透明度”设置为1,并将“显示”设置为“阻止”),消息会再次出现,但随后会立即消失,没有任何用户交互。从log语句中,我可以看到onTouchEvent没有被触发,我也没有注入javascrip
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(音量控制器)确实解决了这个问题。我不太明白为什么,但看起来间隔计时器一直在运行,并且没有正确关闭