我有一个带有webView的Android测试应用程序,如下所示:
<WebView
android:alpha="0"
android:id="@+id/myWebView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
Run Code Online (Sandbox Code Playgroud)
我的主要活动加载了一个我运行JS内容的页面.使用JS启用JS:
webSettings.setJavaScriptEnabled(true);
Run Code Online (Sandbox Code Playgroud)
我的应用程序上有一个按钮,可以将alpha值从0切换为1(显示/隐藏webView).
是否有任何"创造性"方式来检测JS方面的变化?
我试过的事情:
更新:
澄清,我正在寻找一个JS Only解决方案,实际的JS代码是在WebView环境中使用的SDK.
我无法控制Android应用程序,完全控制WebView内容.
我只是想将我的 java 应用程序与 webview 上的内容进行交流。
详细地说,可能只是在单击按钮时显示祝酒词?
在谷歌上搜索并做了一些研究后,最终得到了以下代码。
PS:-我正在使用 Android Studio,是否需要编译任何外部库才能完成任务?或者是其他东西 ?
以下是我的 WebviewActivity 代码:-
public class WebviewActivity extends AppCompatActivity {
private static final String TAG = "Main";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_webview);
//WebView Object
WebView browser;
browser=(WebView)findViewById(R.id.webView);
//Enable Javascript
browser.getSettings().setJavaScriptEnabled(true);
//Inject WebAppInterface methods into Web page by having Interface 'Android'
browser.addJavascriptInterface(new WebAppInterface(this), "Android");
browser.loadUrl("http://www.somewebsite.com/app/form.html");
}
//Class to be injected in Web page
public class WebAppInterface {
Context mContext;
/** Instantiate the interface and set the context */ …Run Code Online (Sandbox Code Playgroud) 假设我们有一个标准的登录页面,如下所示:
我们可以像这样使用using 或plain中的HTML元素:DOMjQueryJavaScript
换句话说,获取元素在网页中的像素位置的方法非常简单,方法是使用element.getBoundingClientRect():
Run Code Online (Sandbox Code Playgroud)var rect = element.getBoundingClientRect(); console.log(rect.top, rect.right, rect.bottom, rect.left);
因此,我们可以从控制台或通过网络应用程序以编程方式进行操作。
现在,假设我们随时都有一个Android浏览器(Chrome / Mozilla / WebView)。我可以URL在浏览器中检索网页的。在这种情况下:
https://login.microsoftonline.com/
所以我的问题是,给定登录页面的URL,我如何类似地获得对上相同输入字段的访问权限Android browser?
我需要能够HTML在Android浏览器中访问网页的元素,并计算其像素位置。作为输入,我具有任何Android浏览器中的网页URL。
我说的是在Android运行时中通过Android应用执行此操作,即以编程方式使用Java / JS代码。
如果有人需要DOM页面的结构为文本,则可以使用以下(Java)代码以编程方式获取它:
URL url;
HttpURLConnection urlConnection;
String DOMContent = null;
try {
url = new URL("https://login.microsoftonline.com/");
urlConnection = (HttpURLConnection) url.openConnection();
int responseCode = urlConnection.getResponseCode();
if(responseCode == HttpURLConnection.HTTP_OK){
DOMContent = readStream(urlConnection.getInputStream());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch …Run Code Online (Sandbox Code Playgroud) 我有一个webview我在android中使用,我试图触发按钮点击javascript.我正在尝试使用下面的代码将类的颜色更改为红色.但我似乎无法让它发挥作用
final WebView wb=(WebView)findViewById(R.id.webView2);
wb.loadUrl("javascript:"
+ "var FunctionOne = function () {"
+ " try{document.getElementsByClassName('test')[0].style.color='red';}catch(e){}"
+ "};");
Run Code Online (Sandbox Code Playgroud) 我知道这个问题是很常见的,并且可以使用来解决这里 - JS或jQuery和这里 -如何在Android上运行它.那么这个方法工作正常,但是当我们打电话时:
`myWebView.loadUrl("javascript:document.body.innerHTML = document.body.innerHTML.replace('link1', 'link2')");`
Run Code Online (Sandbox Code Playgroud)
图像link1正在改变link2,图像正在加载,但页面重新启动,所以如果我在最后我将开始...我可以只是实时更改link1到link2,而不是重新加载页面真正的浏览器
我也尝试在我的html文件中设置id,如:
<img src="https://link1.jpg" id="dm5kode"/>
Run Code Online (Sandbox Code Playgroud)
并在Android上运行:
myWebView.loadUrl("javascript:document.getElementById('dm5kode').src = 'link2'");
在这里,我没有得到任何空白屏幕......
我想为手机创建一个插件,它传递并返回javascript和android之间的值.
任何人都可以建议如何做到这一点?
我将.html(包含.js web链接)文件放在assest中,现在我正在尝试加载url
mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setPluginsEnabled(true);
mWebView.getSettings().setAllowFileAccess(true);
mWebView.loadUrl("file:///android_asset/anim1.html");
Run Code Online (Sandbox Code Playgroud)
在这里,我无法播放.js文件,等待积极响应.
我正在使用Xamarin Android开发一个应用程序,它有一个显示网页的WebView.我想实现从WebView到c#的Javascript之间的双向通信.我可以使用此链接从Javascript调用C#.但是我找不到将数据从C#发送回Javascript的方法.有没有办法在这种方法中来回发送数据.我认为在Javascript中编写回调会起作用,但是如何从C#代码中激活它.
现在,我的问题是如何从javascript接口类调用WebView.我有一个Javascript接口类,如https://developer.xamarin.com/recipes/android/controls/webview/call_csharp_from_javascript/ namespace ScannerAndroid {public class JSInterface:Java.Lang.Object {Context context; WebView webView;
public JSInterface (Context context, WebView webView1)
{
this.context = context;
this.webView = webView1;
}
[Export]
[JavascriptInterface]
public void ShowToast()
{
Toast.MakeText (context, "Hello from C#", ToastLength.Short).Show ();
this.webView.LoadUrl ("javascript:callback('Hello from Android Native');");
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码在LoadUrl行抛出异常.java.lang.Throwable:在线程'Thread-891'上调用了一个WebView方法.必须在同一个线程上调用所有WebView方法.(预期的Looper Looper(main,tid 1){42ce58a0}调用null,FYI主Looper是Looper(main,tid 1){42ce58a0})
现在我正在努力如何从这个Java脚本接口类引用WebView
我看到一个非常奇怪的问题.
在我的代码中,我有以下条件:
if (Build.VERSION.SDK_INT >= 19)
myWebView.evaluateJavascript("..."), null);
else
myWebView.loadUrl("...");
Run Code Online (Sandbox Code Playgroud)
根据文档,evaluateJavascript应该从4.4(API 19)及以上.
从大约几个星期开始,我一直在运行Kitkat的多个用户崩溃:
java.lang.IllegalStateException: This API not supported on Android 4.3 and earlier
at android.webkit.WebViewClassic.evaluateJavaScript(WebViewClassic.java:2674)
at android.webkit.WebView.evaluateJavascript(WebView.java:905)
Run Code Online (Sandbox Code Playgroud)
所有看到此崩溃的用户都在运行Android 4.4.4或4.4.2,两者都应该使用此方法.
这些设备包括:Ascend G510,Ascend Y300,p715,PAD1042以及其他一些不起眼的型号.
我很困惑.我考虑过简单地将这个要求提升到API 21(棒棒糖),但这似乎并不合适.我的代码应该有效,除非我遗漏了什么?
谁知道这里发生了什么?
我试图在页面加载之前将全局 JavaScript 函数注入到 Web 视图中。我有一个名为testJS我正在注入的函数。在我的 WebViewClient 中,我正在执行以下操作
private String getJS() {
return "javascript:function testJS() { return { test: 'Hello World' };}";
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
view.loadUrl(getJS());
}
Run Code Online (Sandbox Code Playgroud)
当我检查页面时,window.testJS未定义。
如果我执行以下操作,window.testJS网络视图中具有正确的功能,但它加载得不够早,因此无法正常工作。
@Override
public void onPageFinished(WebView view, String url) {
view.loadUrl(getJS());
}
Run Code Online (Sandbox Code Playgroud)
在 iOS 中,我可以通过注入脚本执行相同的操作atDocumentStart,并且它按照我期望的方式工作。
let userScript = WKUserScript(
source: scriptContent!,
injectionTime: WKUserScriptInjectionTime.atDocumentStart,
forMainFrameOnly: false)
contentController.addUserScript(userScript)
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以在 android WebView 中实现此目的?它适用于PageFinished,但不适用于PageStarted。