12

我正在寻找将 JavaScript 注入 WebView(在 Cocoa 中)的不同方法。

我正在尝试将一些 javascript 注入到<head>已加载到 WebView 中的 HTML 文件的标记中。

以下方法对我不起作用。它似乎只适用于没有嵌套括号的非常简单的 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

您不能使用 jQuery 添加<script>标签。这已经被问过很多次了。看:

您可以使用浏览器内置功能来做到这一点,但是:

将函数分配给页面上的变量然后对其进行评估是否可行?就像是:

-(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 回答