javascript - 使用 Objective-C 的 JavaScript 注入(inject)方法

标签 javascript iphone objective-c code-injection

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

我正在尝试向 <head> 中注入(inject)一些 javascript已加载到 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 函数执行此操作?

我尝试注入(inject)的完整代码如下:

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

最佳答案

您不能使用 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) ;
}

更新明确的例子:

你应该使用我上面的例子作为模板!

无论如何,这个过程有两个部分...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 View 执行的...这就是我们传递给 web View 的代码。但是你必须在你的 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 ] ;

我想我现在已经写够了:)

关于javascript - 使用 Objective-C 的 JavaScript 注入(inject)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12435899/

相关文章:

iphone - AudioFileSetProperty 返回 'kAudioFileUnsupportedPropertyError (pty?)'

ios - 使用带数组的 NSDictionary 创建 JSON 文件

javascript - 如何在表行 (tr) 上叠加一个 div(或任何元素)?

javascript - 通过 javascript 自定义验证器错误文本?

iphone - 重写子类中的观察者方法

iphone - AFNetworking 无法下载文件

javascript - Selenium 中的 execute_script() 有什么作用

JavaScript:使用 'this.' 调用函数不引用类中的方法

ios - 如何在 iOS 上搜索并连接附近的经典蓝牙设备(非 BLE)?

ios - 动画导航栏标题文本更改