12

JavaScriptをWebView(Cocoa内)に挿入するさまざまな方法を探しています。

<head>WebViewにロードされたHTMLファイルのタグにJavaScriptを挿入しようとしています。

次の方法は私にはうまくいきません。ネストされた角かっこがない非常に単純なJavaScriptでのみ機能するようです(私がテストしたものから):

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"var script = document.createElement('script');"
                                                     "script.type = 'text/javascript';"
                                                     "script.text = \"some simple JavaScript"
                                                     "}\";"
                                                     "document.getElementsByTagName('head')[0].appendChild(script);"]];

より複雑なJavaScript/jQuery関数でこれを行う他の方法はありますか?

私が注入しようとしている完全なコードは次のとおりです。

function submitFormForTime(time){
    $(\".t_h\").each(function(i, obj) {
        if ($(this).text() != time) return;
        $(this).parent().find(\"form\").each(function(i, obj){
            obj.submit();
        });
    });
}
4

3 に答える 3

8

<script>jQueryを使用してタグを追加することはできません。これは何度も聞かれました。見る:

あなたはブラウザの組み込み関数でそれを行うことができます、しかし:

関数をページ上の変数に割り当ててから評価するだけで機能しますか?何かのようなもの:

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    // add function to page:
    NSString * js = @"myFunction = function(){ return \"success!\"; }" ;
    [ webView stringByEvaluatingJavaScriptFromString:js ] ;

    // execute newly added function:
    NSString * result = [ webView stringByEvaluatingJavaScriptFromString:@"myFunction();"] ;
    NSLog(@"result=\"%@\"", result) ;
}

明示的な例を更新します。

上記の例をテンプレートとして使用する必要があります。

とにかく、プロセスには2つの部分があります...Javascript部分とObjective-C部分。Javascriptレベルでは、次のことを行っています。

// assign a function to the variable "someFunction":
var someFunction = function(){...};

// call the function in the variable "someFunction":
someFunction();

たとえば、将来関数を参照する必要がない場合は、関数を変数に割り当てずに実行することもできます。変数なしで無名関数を使用すると、次のようになります。

( function(){...} )() ;

つまり、var A = <the function>; A();あなたがしているのではなく(<the function>)();

最後に、匿名関数が引数を取る場合、パターンは次のようになります。

( function(var0, ..., varN){...} )(arg0, ..., argN);

これをコードのテンプレートとして使用すると、JSは次のようになります。

( function(time) {
    $(\".t_h\").each(function(i, obj) 
    {
        if ($(this).text() != time)  return;

        $(this).parent().find(\"form\").each(function(i, obj) {
            obj.submit();
        });
    });
})( 123.456 );

つまり、これがWebビューに実行させたいものです...これがWebビューに渡すコードです。ただし、Obj-Cプログラムでその文字列を作成する必要があり、現在の時刻引数を挿入するという「複雑さ」があります(123.456上記のコード内)。

次のようになります。

NSString * jsTemplate =
    @"( function(time) {"
    @"        $(\".t_h\").each(function(i, obj) {"
    @"            if ($(this).text() != time)  return;"
    @"            $(this).parent().find(\"form\").each(function(i, obj) {"
    @"                obj.submit();"
    @"            });"
    @"        });"
    @"    })( %g );" ;
NSString * js = [ NSString stringWithFormat:jsTemplate, 123.456 ] ;
NSString * result = [ webView stringByEvaluatingJavaScriptFromString:js ] ;

私は今十分に書いたと思います:)

于 2012-09-27T00:18:48.490 に答える
0

WebビューからすべてのHTMLを取得してから、コードを挿入してページをリロードします。それはまだ適切な注射方法ではありませんが、うまくいくかもしれません。

NSString *htmlDataString = [webView stringByEvaluatingJavaScriptFromString: @"document.documentElement.outerHTML"];
// use nsstring methds to find the place for injecting
// inject avascript code
[webView loadHTMLString:htmlDataString baseURL:nil];

もちろん、リクエストのベースURLがある場合は、そのnilを置き換えます。

于 2012-09-21T10:26:56.690 に答える
0

これは試していませんが、角かっことコードの複雑さに問題がある場合は、バンドルに保存されているJSファイルを呼び出してみてください。多分それはそれを解決します。例えば:

NSData *fileData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@”submitFormForTime” ofType:@”js”]];

NSString *jsString = [[NSMutableString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];

[webView stringByEvaluatingJavaScriptFromString:jsString];

おそらく、エンコーディングタイプを設定すると、すべての角かっこを正しい方法で解析するのに役立ちます。

于 2012-09-25T20:12:45.307 に答える