引言
監(jiān)聽網(wǎng)頁的按鈕的點擊事件,并且網(wǎng)頁不是我們招呼一聲對方就能改的颜启。那么繼續(xù)。
正文
1.WKUserScript
先介紹WebKit框架一個類WKUserScript:
核心方法浪讳,傳入JS代碼字符串缰盏,返回給我們一個WKUserScript對象。
/*! @abstract Returns an initialized user script that can be added to a @link WKUserContentController @/link.
@param source The script source.
@param injectionTime When the script should be injected.
@param forMainFrameOnly Whether the script should be injected into all frames or just the main frame.
*/
- (instancetype)initWithSource:(NSString *)source injectionTime:(WKUserScriptInjectionTime)injectionTime forMainFrameOnly:(BOOL)forMainFrameOnly;
WKUserScriptInjectionTime枚舉
// 兩個枚舉值得解釋
// WKUserScriptInjectionTimeAtDocumentStart Description: Inject the script after the document element is created, but before any other content is loaded.
// WKUserScriptInjectionTimeAtDocumentEnd Description: Inject the script after the document finishes loading, but before other subresources finish loading.
typedef NS_ENUM(NSInteger, WKUserScriptInjectionTime) {
WKUserScriptInjectionTimeAtDocumentStart,
WKUserScriptInjectionTimeAtDocumentEnd
} API_AVAILABLE(macosx(10.10), ios(8.0));
它的功能是可以往webview加載的網(wǎng)頁注入JS代碼淹遵。那么我們的問題有望解決了口猜。我們就把我們需要的核心代碼window.webkit.messageHandlers.(messagename).postMessage
注入到我們想監(jiān)聽的網(wǎng)頁。
2.找出網(wǎng)頁按鈕的id
這里我們用某知名搜索網(wǎng)站的按鈕做測試透揣。
我們找出網(wǎng)頁按鈕的id济炎,在通過document.getElementById("buttonId");
獲取控件對象。
在給控件添加監(jiān)聽button.addEventListener('click',addFun,false);
注意:
(1)有的控件沒有id屬性辐真,可以選擇class屬性獲取getElementsByClassName须尚。遍歷getElementsByClassName返回的集合確定我們需要的控件崖堤。
(2)有些網(wǎng)頁pc端和手機端的域名不一樣。所以找網(wǎng)頁控件的id或class的時候恨闪,同一個網(wǎng)站pc網(wǎng)頁和手機網(wǎng)頁源碼中id或class屬性不一致的情況倘感。
3.準備注入的JS代碼
function fun() {
window.webkit.messageHandlers.%@.postMessage(null);
}
(function(){
var btn = document.getElementById("%@");
btn.addEventListener('click',fun,false);
}());
在OC中,上面代碼以字符串的形式傳給WKUserScript
NSString *scriptStr = [NSString stringWithFormat:@"function fun(){window.webkit.messageHandlers.%@.postMessage(null);}(function(){var btn=document.getElementById(\"%@\");btn.addEventListener('click',fun,false);}());", baiduMessage, baiduButtonId];
WKUserScript *userScript = [[WKUserScript alloc] initWithSource:scriptStr injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
[_userContentController addUserScript:userScript];
4.執(zhí)行結果
點擊網(wǎng)頁按鈕我們的控制臺會打恿省:
總結
到此我們監(jiān)聽網(wǎng)頁按鈕點擊事件的目的可以實現(xiàn)了老玛,(想看交互本地html的可以去看第一張交互本地html鏈接)。有其他方望分享出來一起學習钧敞。
監(jiān)聽了哪個網(wǎng)頁的按鈕呢蜡豹?建議去看demo工程,到我的Github下載溉苛。