2010-02-25 4 views
4

Я загружаю страницу в WebView. Страница имеет этот маленький тест Javascript:Cocoa WebView: не удается вызвать конкретный метод Javascript с помощью `callWebScriptMethod:`

<script type="text/javascript"> 
function test(parametr) 
{ 

    $('#testspan').html(parametr); 

} 

var bdu = (function(){ 
return { 
    secondtest: function(parametr) { 

    $('#testspan').html(parametr); 

    } 
} 
})(); 
</script> 

Проблема заключается в том, что я не могу назвать «secondtest функции» из какао

это прекрасно работает:

[[webview1 windowScriptObject] callWebScriptMethod:@"test" withArguments:arguments]; 

и это не работает:

[[webview1 windowScriptObject] callWebScriptMethod:@"bdu.secondtest" withArguments:arguments]; 

Что может вызвать эту проблему и как ее исправить?

Благодаря

+0

Я отправлю это как комментарий вместо Ответ: Я не знаю много о Javascript, но похоже, что функция secondTest встроена внутри блока, который сам находится внутри вызова функции. Я не вижу, как что-то внешнее по отношению к скрипту может разрешить его как вызываемую функцию. (Если это работает в Javascript, этот язык является еще большим крушением поезда, чем я думал.) Я бы удалил функцию из своего внедрения и посмотрел, работает ли она. Если это так, то вложение неверно. – TechZen

ответ

0

callWebscriptMethod: (NSString *) Имя withArguments: (NSArray *) Args:

не оценивает name как выражение JavaScript. Поэтому он не может разобрать bdu.secondtest: сначала он не ищет bdu, а затем получает запись secondtest.

Вместо этого просто используйте evaluateWebScript:.

1

«callWebScriptMethod» предназначен для вызова данного метода на заданный объект webscript (то есть javascript). На второй строке вы хотите вызвать метод «secondTest» в javascript-объекте с именем «bdu». Способ сделать это состоит в следующем:

  1. Получить BDU объект из окна объекта:

    WebScriptObject* bdu =[[webview1 windowScriptObject] valueForKey:@"bdu"];

  2. Вызов метода "secondTest" на БДУ объекта:

    [bdu callWebScriptMethod:@"secondtest" withArguments:arguments];

2

Я боролся с это в течение некоторого времени в Кордове MacOSX и здесь есть решение, которое я нашел и работает для меня:

JavaScript:

CordovaBridgeUtil.isObject = function(obj) { return obj.constructor == Object; }; 

ObjectiveC:

WebScriptObject* bridgeUtil = [win evaluateWebScript:@"CordovaBridgeUtil"]; 
NSNumber* result = [bridgeUtil callWebScriptMethod:@"isObject" withArguments:[NSArray arrayWithObject:item]];