Подтвердить что ты не робот

Методы ввода JavaScript с использованием Objective-C

Я ищу различные методы ввода JavaScript в WebView (в Cocoa).

Я пытаюсь вставить некоторый javascript в тег <head> файла HTML, который был загружен в WebView.

Следующий метод для меня не работает. Кажется, он работает только с очень простым 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();
        });
    });
}
4b9b3361

Ответ 1

Вы не можете использовать 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 );

Итак, это то, что вы хотите, чтобы веб-представление выполнялось... Это код, который мы передаем веб-просмотру. Но вы должны построить эту строку в своей программе 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 ] ;

Думаю, что я написал достаточно сейчас:)

Ответ 2

Я бы получил весь 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-адрес из вашего запроса, если он заменит этот нуль.

Ответ 3

Я не пробовал это, но если проблема связана с скобками и сложностью кода, вы можете попробовать вызвать JS файл, хранящийся в комплекте. Возможно, это решает это. Например:

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

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

[webView stringByEvaluatingJavaScriptFromString:jsString];

Возможно, настройка типа кодировки помогает правильно разобрать все скобки.