JS确认android webview中的框不起作用

使用此代码加载url.Url在Android和桌面浏览器中工作正常。 我已经编写了Android代码来显示android中的确认框。 它在Nexus和Samsung设备上工作正常,但在控制台中出错时,华为设备中没有显示确认框

“未捕获的TypeError:无法调用null的querySelector方法”,来源: http://abc/build/js/frontend-abc.js (16683)

 private class WebViewChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result) { new AlertDialog.Builder(context) .setTitle(getString(R.string.str_confirmation_title)) .setMessage(message) .setPositiveButton(getString(R.string.str_ok), new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.confirm(); } }).setCancelable(false).create().show(); return true; } @Override public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { new AlertDialog.Builder(context) .setTitle(getString(R.string.str_confirmation_title)) .setMessage(message) .setPositiveButton(getString(R.string.str_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.confirm(); } }).setNegativeButton(getString(R.string.str_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { result.cancel(); } }).create().show(); return true; } @Override public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { final LayoutInflater factory = LayoutInflater.from(context); final View v = factory.inflate(R.layout.layout_alertdialog, null); ((TextView) v.findViewById(R.id.tv_messagealert)).setText(message); showJSPromptAlert(v, result); return true; } } private void showJSPromptAlert(View v, final JsPromptResult result) { AlertDialog.Builder builder = new AlertDialog.Builder(context) .setTitle(getString(R.string.str_confirmation_title)) .setView(v) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { result.confirm(getString(R.string.str_ok)); } }) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { result.cancel(); } }) .setOnCancelListener( new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface dialog) { result.cancel(); dialog.cancel(); } }); alert11 = builder.create(); alert11.show(); } WebView wvContainer = (WebView) findViewById(R.id.wv_container); private void loadUrl(String url) { wvContainer.setInitialScale(1); wvContainer.setWebViewClient(new MyBrowser()); adjustWebViewSettings(); wvContainer.canGoBack(); adjustWebViewForLatestVersion(); wvContainer.setWebChromeClient(new WebViewChromeClient()); wvContainer.loadUrl(url); } private void adjustWebViewSettings() { wvContainer.getSettings().setJavaScriptEnabled(true); wvContainer.getSettings().setSupportZoom(true); wvContainer.getSettings().setAllowContentAccess(true); wvContainer.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); wvContainer.getSettings().setSupportMultipleWindows(true); wvContainer.getSettings().setDomStorageEnabled(true); wvContainer.getSettings().setAppCacheEnabled(true); wvContainer.getSettings().setUseWideViewPort(true); if (Build.VERSION.SDK_INT >= 21) { wvContainer.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } } private void adjustWebViewForLatestVersion() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { wvContainer.getSettings().setAllowUniversalAccessFromFileURLs(true); wvContainer.getSettings().setAllowFileAccessFromFileURLs(true); wvContainer.getSettings().setAllowFileAccess(true); wvContainer.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } } 

"Uncaught TypeError: Cannot call method 'querySelector' of null"基本上意味着webview中的JS代码试图访问querySelector对象中被解释为null的东西。

Null是原始的,没有属性。 所以你可能有一些编程错误,它依赖于A的存在来填充B但是A似乎不存在(querySelector是文档或元素中的方法)。

该怎么办

尝试获取设备错误的JS堆栈跟踪,弄清楚为什么应该提供querySelector(文档或元素)的东西为null。 然后解决这个问题,看看是否一切都很好……

可能的原因

  • 代码在其上调用方法时,文档未完全加载
  • 设备特定代码变坏了
  • 墨菲定律…