gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:09:00 28 4
gpt4 key购买 nike

我正在寻找将 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com