2009-08-04 12 views
10

Pracuję w macierzystej aplikacji na iPhone'a. Jestem w stanie załadować lokalnego pliku index.html w UIWebView:Wysyłaj parametry do pliku lokalnego w UIWebView

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"]isDirectory:NO]]]; 

Wstęgę ładunki porządku. Teraz chciałbym, aby załadować wstęgę z niektórych parametrów, w taki sam sposób jeden typy w przeglądarce: URL zm1 = myValue & var2 = myValue2

Więc mogę dostać te wartości wewnątrz javascript w html? plik. Czy istnieje sposób wysyłania parametrów do lokalnego pliku html?

Dzięki!

Odpowiedz

2

Nie, niestety nie.

Można jednak obejść ten problem przez ustawienie zmiennych i wywołanie funkcji/metody w JavaScripcie pomocą UIWebView:stringByEvaluatingJavaScriptFromString:

+0

Mam funkcji javascript zdefiniowane w lokalnym pliku html. Mogę załadować ten plik, ale jak mogę wywołać funkcję javascript w tym pliku? Potrzebuję przykładu. – Hectoret

+0

[webView stringByEvaluatingJavaScriptFromString: [NSString stringWithFormat: @ "myJavascriptFunction (% f);", 1.0f]]; – rpetrich

+0

Czy to działa? Czy wywoływana jest funkcja myJavascriptFunction? W moim kodzie nie ma ... jak mogę sprawdzić na pewno, czy połączenie jest wykonywane? – Hectoret

4

ładujesz HTML z własnego pakietu co oznacza, masz pełną kontrolę nad nim. Dlaczego nie sparametryzować kodu HTML za pomocą odpowiednich pól. Możesz łatwo dodać niektóre ukryte pola wejściowe, które javascript może wtedy uzyskać dostęp. Załóżmy, że Twoja HTML wyglądał następująco:

<body> 
<form> 
Static Field 1: <input type="text" name="field1"><br> 
Static Field 2: <input type="text" name="field2"><br> 
%@ 
</form> 
</body> 

Teraz wystarczy odczytać te dane na ciąg znaków i sformatować% @ z niektórych ukrytych pól takich jak to:

NSString *input = @"<input type=\"hidden\" name=\"field3\"><br>"; 
NSString *formatted = [NSString stringWithFormat:html, input]; 

Następnie zadzwonić -loadHTMLString: w WebView.

[webView loadHTMLString:formatted baseURL:nil]; 

Czy jest jakiś powód, dla którego nie można tego zrobić w ten sposób. Teraz twój JavaScript może pobrać wartość pola wejściowego ukrytym z wezwaniem do:

document.getElementsByName('field3')[0].value; 
3

można wstawić w lokalnym pliku HTML javascript do analizowania get-request

<script language="javascript"> 
function getget(name) { 
     var q = document.location.search; 
     var i = q.indexOf(name + '='); 

     if (i == -1) { 
      return false; 
     } 

     var r = q.substr(i + name.length + 1, q.length - i - name.length - 1); 

     i = r.indexOf('&'); 

     if (i != -1) { 
      r = r.substr(0, i); 
     } 

     return r.replace(/\+/g, ' '); 
    } 
</script> 

Używaj getget ('parameter_name'), aby uzyskać parametr z łańcucha żądania.

0

Następnie wywołanie -loadHTMLString: w widoku internetowym.

wierzę mu unikanie korzystania loadHTMLString zamiast loadRequest ponieważ łamie się i przyciski z przodu w UIWebView

24

najlepsze i naprawdę działa odpowiedź, tylko w objc (pamiętaj, aby zachować swoją strukturę katalogów - kopiowanie plików do kodu Xcode za pomocą "Utwórz odniesienia do folderu dla wszystkich dodanych folderów")

NSString *path = [[NSBundle mainBundle] 
     pathForResource:@"YOUR-HTML-FILE" 
     ofType:@"html" 
     inDirectory:@"YOUR-FOLDER" ]; 
NSURL *url = [NSURL fileURLWithPath:path]; 



NSString *theAbsoluteURLString = [url absoluteString]; 

NSString *queryString = @"?var=1232123232"; 

NSString *absoluteURLwithQueryString = [theAbsoluteURLString stringByAppendingString: queryString]; 

NSURL *finalURL = [NSURL URLWithString: absoluteURLwithQueryString]; 

NSURLRequest *request = [NSURLRequest requestWithURL:finalURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:(NSTimeInterval)10.0 ]; 

[web loadRequest:request]; 
+0

Co jest nie tak z Swift? Próbowałem i działa. – NikeAlive

+0

Ta anser mi bardzo pomaga – inix

7

Sposób Marjana jest właściwym sposobem na jego działanie.

Mój przyjaciel, Terence, wskazał, że chodzi o użycie bezwzględnego pliku URI (file: //) o numerze podczas prawidłowego tworzenia adresu URL z ciągu znaków. Tą drogą ? znak nie zostanie zakodowany, a widok internetowy może poprawnie załadować plik.

[NSURL URLWithString: @"file://localhost/Users/sj/Library/Application%20Support/iPhone%20Simulator/5.0/Applications/../PrintingWebView.app/final.html?slide=2"]; 

Albo użyć URLWithString: metoda relativeToURL

NSURL *relativeURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]; 
NSURL *u = [NSURL URLWithString:@"html/index.html?site=2" relativeToURL:relativeURL]; 
+1

Bardziej proste rozwiązanie! – inix

Powiązane problemy