2009-08-04 32 views
10

Tôi đang làm việc trên ứng dụng iPhone gốc. Tôi có thể tải một địa phương tập tin index.html vào một UIWebView:Gửi tham số đến tệp cục bộ trong UIWebView

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

Các web tải tốt. Bây giờ, tôi muốn tải web với một số thông số, giống như một loại trong trình duyệt: URL? Var1 = myValue & var2 = myValue2

Vì vậy, tôi có thể nhận được các giá trị đó bên trong javascript của html tập tin. Có cách nào để gửi các tham số cho một tập tin html địa phương?

Cảm ơn!

Trả lời

2

Không, rất tiếc là không.

Bạn có thể, tuy nhiên, làm được việc này bằng cách thiết lập các biến và gọi chức năng/phương pháp trong JavaScript bằng cách sử dụng UIWebView:stringByEvaluatingJavaScriptFromString:

+0

Tôi đã có một hàm javascript định nghĩa trong file html địa phương. Tôi có thể tải tập tin đó, nhưng, làm thế nào tôi có thể gọi một hàm javascript bên trong tập tin đó? Tôi cần một ví dụ. – Hectoret

+0

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

+0

Bạn có làm việc đó không? Hàm myJavascriptFunction có được gọi không? Trong mã của tôi nó không ... làm thế nào tôi có thể kiểm tra chắc chắn nếu cuộc gọi nó đang được thực hiện? – Hectoret

4

Bạn đang tải HTML từ bó của riêng bạn mà ngụ ý là bạn có toàn quyền kiểm soát nó. Tại sao không chỉ tham số hóa HTML với các trường bạn muốn. Bạn có thể dễ dàng thêm vào một số trường nhập ẩn mà javascript của bạn có thể truy cập. Say HTML của bạn trông như thế này:

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

Bây giờ chỉ cần đọc dữ liệu này vào một chuỗi và định dạng% @ với một số lĩnh vực tiềm ẩn như thế này:

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

Sau đó gọi -loadHTMLString: trong webview.

[webView loadHTMLString:formatted baseURL:nil]; 

Có lý do nào bạn không thể thực hiện theo cách đó hay không. Bây giờ javascript của bạn có thể lấy giá trị của trường nhập ẩn với một cuộc gọi đến:

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

Bạn có thể chèn trong html-file địa phương của bạn một javascript để phân tích GET-yêu cầu

<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> 

Sử dụng getget ('parameter_name') để lấy tham số từ chuỗi yêu cầu.

0

Sau đó gọi -loadHTMLString: trong chế độ xem web.

Tôi tin rằng ông đã tránh sử dụng loadHTMLString thay vì loadRequest vì nó phá vỡ trở lại và các nút phía trước của UIWebView

24

Câu trả lời tốt nhất và thực sự làm việc, chỉ trong ObjC (nhớ giữ lại cấu trúc thư mục của bạn - sao chép file vào xcode bằng cách sử dụng "Tạo Tham khảo Thư mục cho bất kỳ thư mục nào được thêm")

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

Có gì sai với Swift? Tôi đã thử và nó hoạt động. – NikeAlive

+0

Anser này giúp tôi rất nhiều – inix

7

Cách Marjan là cách thích hợp để làm việc đó.

Khi bạn tôi Terence chỉ ra, mẹo là sử dụng tệp uri tuyệt đối (tệp: //) chuỗi khi tạo url từ chuỗi đúng cách. Cách này ? ký tự không được mã hóa và chế độ xem web có thể tải tệp đúng cách.

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

Hoặc sử dụng URLWithString: Phương pháp relativeToURL

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

Giải pháp đơn giản hơn! – inix

Các vấn đề liên quan