iOSに基づいてJavaScriptとの対話を実現する.

3789 ワード

先日、WebKitに基づくプロキシブラウザを開発しました.ウェブページを閲覧する機能を実現したほか、Socksプロキシ機能(主にフリー流量、流量転送、悪意のあるURL検出などを実現します.)を追加しました.iOSは一つのインターフェースだけを提供して、JavaScriptとインタラクションします.
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
はい、以下の例では、JavaScriptにおいて、コントロールの中にNameがある場合、このコントロールを取得するコードは以下の通りです.
document.getElementByTagName("controlName")
さて、iOSでは、strigByEveraluating JavaScript FroomStringを使用します.
[self.webView stringBYEvaluatingJavaScriptFromString:
@"var control = document.getElementsByTagName("controlName");
control.style.background = '#080A3B';
"
]
それと同じように、htmlページの画像を全部修正したい場合、以下の方法を使ってもいいです.前提は)ページに怠け者用のローディングがないことです.
[self.webView stringByEvaluatingJavaScriptFromString:
@"var i, a;"
"for(i = 0; (a = document.getElementsByTagName('img')[i]); i ++) {"
"a.src = 'picture.png';"     //       
"}"
]
いくつかのよく使われている代用語を列挙して、現在のtitleを取得します.
NSString *title = [self.webView stringByEvaluatingJavaScriptFromString:@"document.title"]
ページのdyを取得します
NSString *bodyStr = [self.webView stringByEvaluatingJavaScriptFromString:@"document.inner.body"]
現在のページのURLを取得します.
NSString *urlStr = [self.webView stringByEvaluatingJavaScriptFromString:@"document.location.href"]       //        url     
界面要素の値を変更
document.getElementsByName('controlName')[0].value = 'other value'  
フォームを送信
document.forms[0].submit()
jsコードをhemlページに挿入する場合、方法は以下の通りです.
[self.webView stringByEvaluatingJavaScriptFromString:
@"var script = document.createElement('aScript');"
"script.type = 'text/javascript';"
"script.text = \function newFunction() {"
"var temp = document.getElementsByName('controlName')[0]; "
"temp.value = 'Visitor';"
"document.forms[0].submit();"
"} \";"
"document.getElementsByTagName(head)[0].appendChild(script);"
];
[self.webView stringByEvaluatingJavaScriptFromString:@"newFunction();"];
一般的に、ブラウザには夜間/昼モード機能があります.UC、QQなどのブラウザの夜間/昼モードが完全に修正されました.
UCブラウザーをテストする時、夜間、昼間モードを変えてべつにページを更新していません(つまり、バックグランドは夜間、昼間の2つの異なっている様式のを用意していません)を発見して、クライアントの研究開発者だけはstrigByEveraluding JavaScript FroomString:改正を通してページのcssを更新していません.js、cssとpictureを含めて、設定画面で見られますが、完全にキャッシュされています.ページは一般的に3 MBの空間が必要です.だから、夜間/昼モードを変更する際には、ネットワークを再要求する必要はなく、良いユーザー体験効果が得られます.
しかし、他のブラウザなどに対しては、画面の明るさを調整するだけで、開発者のレベルから実力が現れるということです.
ブラウザを開発する時、夜間/昼モードについてもいろいろ工夫しました.方法は重いですが、大量の遍歴は携帯のメモリに一定の消耗があるかもしれません.テスト後、効率はまあまあです.
- (void)setNightMode:(UIWebView *)webView {
    [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('body')[0].style.webkitTextFillColor= '#2D99BC'"];
    
    NSString *javaScriptPath = [[NSBundle mainBundle] pathForResource:@"JavaScript" ofType:@"plist"];
    NSDictionary *javaDict = [NSDictionary dictionaryWithContentsOfFile:javaScriptPath];
    NSArray *array = javaDict[@"controls"];
    for(NSString *control in array) {
        [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"var i, a;"
                                                         "for(i = 0; (a = document.getElementsByTagName('%@')[i]); i ++) {"
                                                         "a.style.background = '#080A3B';"
                                                         "}", control]];
    }
}
上のコードとplistファイルは私のGitHubでダウンロードできます.