用JAVA編寫瀏覽器內核之實現javascript的document對象與內置方法
阿新 • • 發佈:2017-07-20
public urn cti cli 原理 null 編寫 代碼塊 頁面
通過實現document對象,就能夠動態解析html頁面了。
原創文章。轉載請註明。
閱讀本文之前,您須要對瀏覽器怎樣載入javascript有一定了解。
當然,對java與javascript本身也須要了解。
本文首先介紹瀏覽器載入並執行javascript的原理。
其次將介紹怎樣用java與javascript互調用對象。
最後介紹怎樣用java實現javascript的document對象與其他內置方法。
瀏覽器從server得到含有javascript代碼的html文本後,將順序運行javascript代碼塊。
看代碼是最簡單的方式:
package org.taoningyu.js; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; public class TaoDocument { Document mydoc = null; public TaoDocument(String url) throws MalformedURLException, IOException{ mydoc = Jsoup.parse(new URL(url),30000);//利用Jsoup實現document樹 } public Element getElementById(String id){//實現document的getElementById方法 System.out.println("Java println:\t"+mydoc.getElementById(id)); return mydoc.getElementById(id);//返回的是Element對象 } public static void main(String[] args) throws MalformedURLException, IOException { ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine se = sem.getEngineByName("javascript"); //初始化Java內置的javascript引擎 try { se.eval("function test() {" + "id='areaDefault'; print('js print:'+document.getElementById(id));return document.getElementById(id);}"); //測試用javascript自己定義函數,功能為輸出id為areaDefault的元素,並返回。 Invocable invocableEngine = (Invocable) se;//轉換引擎類型為Invocable se.put("document", new TaoDocument("http://www.ifeng.com/")); //關聯對象,這一步非常重要,關聯javascript的document對象為TaoDocument。亦即我自己實現的document對象 Element callbackvalue=(Element) invocableEngine.invokeFunction("test"); //直接執行函數。返回值為Element System.out.println("callback return :"+callbackvalue); //打印輸出返回內容 se.eval("test()");//第二種調用函數方式,我更偏愛此種方式 } catch (ScriptException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
通過實現document對象,就能夠動態解析html頁面了。
在另外的文章。我將介紹怎樣結合httpclient,使其成為headless瀏覽器的雛形。
用JAVA編寫瀏覽器內核之實現javascript的document對象與內置方法