用JAVA編寫瀏覽器核心之實現javascript的document對象與內建方法

來源:互聯網
上載者:User

標籤:pos   manager   int   對象   exception   pre   todo   efault   content   

原創文章。轉載請註明。

閱讀本文之前,您須要對瀏覽器怎樣載入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 blocke.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}

通過實現document對象,就能夠動態解析html頁面了。

在另外的文章。我將介紹怎樣結合httpclient,使其成為headless瀏覽器的雛形。



用JAVA編寫瀏覽器核心之實現javascript的document對象與內建方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.