使用JavaScriptInterface返回页面元素

使用JavaScriptInterface返回页面元素,javascript,android,getelementsbytagname,Javascript,Android,Getelementsbytagname,我有一个简单的WebViewClient类,它应该返回我当前所在页面的所有元素(在webview中) 这是密码 public class SearchClient extends WebViewClient { class MyJavaScriptInterface { @SuppressWarnings("unused") public void processHTML(String[] html) { Log.w("Length", String.valueOf(h

我有一个简单的WebViewClient类,它应该返回我当前所在页面的所有元素(在webview中)

这是密码

public class SearchClient extends WebViewClient {

class MyJavaScriptInterface {
    @SuppressWarnings("unused")
    public void processHTML(String[] html) {
    Log.w("Length", String.valueOf(html.length));
        for(String s : html)
        {

            Log.w("Row", s.toString());
        }



    }
}


public SearchClient(WebView wv)
{
    wv.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
}

public void onPageFinished(WebView view, String url) {
    view.loadUrl("javascript:window.HTMLOUT.processHTML(document.getElementsByTagName('p'));");

}
}


document.getElementsByTagName
显然正在返回元素,因为processHTML函数中的“Log.w”行有100多个字符串。。。但是for循环崩溃了。这是为什么???

节点列表是一个
JavaScript
类,但只有在
JavaScript
中,您应该创建一个方法,将列表和字符串数组转换为,然后您可以将其传递到
JavaScriptInterface
方法中

从解决方案来看,可以是:

function toArray(obj) {
  var array = [];
  // iterate backwards ensuring that length is an UInt32
  for (var i = obj.length >>> 0; i--;) { 
  array[i] = obj[i];
  }
  return array;
} 
这也是可能的(从上面链接中的问题来看),但我还没有测试过自己:


Array.prototype.slice.call(list,0)

我发现getElementsByTagName实际上返回一个节点列表。。。我用NodeList更改了String[]参数,但仍然使用了java.lang.NullPointerExceptionOk。谢谢您的帮助,但实际上我还是使用String[]作为参数来处理HTML。。。原因是长度显示返回了100个字符串。。。但是当我尝试在for循环中访问它们时,我得到一个空指针。。。我不明白如果有100个字符串存在。我真的应该使用NodeList并按照Jon说的做吗。。。如果是这样,我如何将他的代码放入我的view.loadUrl函数??因为我已经让它调用getElementsByTagName。尝试了这个。。。。view.loadUrl(“javascript:window.HTMLOUT.processHTML(函数toArray(document.getElementsByTagName('p')){var数组=[];for(var i=obj.length>>>0;i--;){array[i]=obj[i];}return array;};”)没有崩溃,但我没有得到对processHtmlName的调用,可能是因为您正在传递名为
toArray()的函数
进入
processHTML()
函数?JavaScript知道您有一个名为
processHTML()
的函数,但它只接受一个
字符串[]
作为参数。我认为JavaScript如果找不到它认为需要的方法,就会自动失败,因此不会抛出任何错误。请尝试创建
toArray()
函数,而不仅仅是在这里加载,然后在WebView:view.loadUrl(“JavaScript:window.HTMLOUT.processHTML(function-toArray(document.getElementsByTagName('p'))上调用它);此外,您不能在Java中使用
NodeList
s,即使它位于
JavaScriptInterface
中。您必须将其转换为
字符串[]
让您的
JavaScriptInterface
能够使用它。问题是……我正在加载的页面中没有任何javascript……我正在尝试创建一个基本的新闻阅读器应用程序……一旦加载页面,我想获取所有元素,这就是我需要的数据所在。这不是我的页面,所以我无法添加javascript…我需要在页面加载后注入它。我想出了这个,但还是沉默。。。