折衷的 IE Javascript Inject

之前為了在報告系統中插入想要執行的 javascript,利用了 AutoHotKey 可以控制網頁物件 DOM 的方式,來進行 javascript inject,不過前一陣子更新了 IE11 後,好像有點問題,執行 window.execScript() 時總會出現錯誤,看了一個討論串,目前用到最重要的 Lib — WBGet() — 的作者 jethrow 表示:

This is of course assuming that window contains a valid window object – but more importantly that you have the correct credentials for that window object. In other words, if you access the window object via HTML Dom navigation, this won’t work.

看來可能是這個原因造成的。雖然目前主力的電腦還是 WinXP + IE8,但總是要想辦法解決 IE11 的問題,而且 IE11+ 以後也不再支援 window.execScript,改以 window.eval 來替代,只好另想其他方法。

幸好我想 inject 進去的 js 只是想跑一段 Ajax 把 server api 的資料抓回來,好像也不一定要在原網頁進行,就是要多做一些步驟把資料在不同的物件裡傳來傳去。

流程大概是:

  1. 開一個新的 IE 物件,取得有正確 credential 的 window 物件。
  2. window.eval() 將一段想要執行的 js 插入。將 Ajax 運行的結果存在新的 IE 物件的 DOM 裡。
  3. 利用 AutoHotKey 將物件轉存回原本的工作視窗 DOM 中,再放到想要替換的 HotString 裡。

其中新建立的 IE 物件,因為需要利用 jQuery 來跑 Ajax,所以我設了一個空網頁,先進行 navigation 後將 jQuery 載入,當然也可以用一些動態的方式,不過這樣比較方便些。

花了兩天左右的時間,終於完工,不過正當我要寫這篇的時候,因為碰上前兩天報告系統改版,要先把 IE 的 Cache 清掉,結果好像什麼問題都沒了,噢~我真是搞不懂你啊!@[email protected]