我想从文件加载一个html页面,并为其附加一个哈希标记。这可能吗?
我试过了
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"html"];
NSURL *fileUrl = [NSURL fileURLWithPath:[filePath stringByAppendingFormat:@"#hashtag"]];
[self.webView loadRequest:[NSURLRequest requestWithURL:fileUrl]];
NSLog(@"fileUrl = %@, reachable? %d", fileUrl, [fileUrl checkResourceIsReachableAndReturnError:nil]);
但是这会尝试查找无法找到的文件someFile.html%23hashtag
。有没有办法在创建NSURL
对象后添加哈希?
我还尝试将文件加载到字符串中并使用loadHTMLString
:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"html"];
NSString *fileContents = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:fileContents baseURL:[NSURL URLWithString:@"http://someFile.html#hashtag"]];
这里哈希标签确实有效,但我在html中的javascript引用不起作用。这个方法的后续问题是,如何从UIWebView中作为字符串加载的html引用javascript文件,即什么是基本URL?
我能想到的一个黑客就是将我的所有javascript文件内联到html中并将其作为字符串加载,但我认为必须有更好的方法!
答案 0 :(得分:25)
我没试过这个但是如何在没有hashtag的情况下正常加载文件并用这样的东西实现UIWebViewDelegate呢?
- (void)webViewDidFinishLoad:(UIWebView *)webView {
[webView stringByEvaluatingJavaScriptFromString:@"window.location.href = '#hashtag';"];
}
参考文献:
答案 1 :(得分:10)
关于%23问题,我认为Scott Kohlert的替代解决方案并不好。
以下解决方案似乎更好,我只是从here
复制了它NSURL *baseUrl = [NSURL fileURLWithPath:stringUrl];
NSURL *fullURL = [NSURL URLWithString:@"#jumpto" relativeToURL:baseUrl];
有点偏离主题,我发现iOS 6.0,6.1上的Safari与iOS 5.1和其他桌面浏览器(包括OS for OSX)的关于带锚的句柄URL的行为有所不同。对于我的一个特定文档,无论是在UIWebview或iOS 6.0或6.1上的移动Safari中,在第一次加载时,页面都不会滚动到正确的位置,重新加载将修复它。也许它与html的一部分动态生成的事实有关。有什么想法吗?
答案 2 :(得分:2)
这是我在代码中执行此操作的方式。我将哈希标记附加到NSString,然后使用fileURLWithPath将其转换为NSURL。然后我将%23的所有实例替换回#。这一切都在下面的代码中解释,但如果您有任何问题,请告诉我。
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"html"];
NSString *filePathWithHash = [NSString stringWithFormat:@"%@#yourDesiredHashTagHere",filePath];
NSURL *theURL = [NSURL fileURLWithPath:filePathWithHash];
//NSURL turns the # into %23 when using fileURLWIthPath. So we need to change it back:
NSString *finalURLString = [[NSString stringWithFormat:@"%@",theURL] stringByReplacingOccurrencesOfString:@"%23" withString:@"#"];
//Then we need to change it back to an NSURL
NSURL *finalURL = [NSURL URLWithString:finalURLString];
//And finally we load this in the webView
[theWebView loadRequest:[NSURLRequest requestWithURL:finalURL]];
答案 3 :(得分:1)
您应该能够拦截NSURLRequest
,将其转换为NSMutableURLRequest
,然后按如下方式更改网址。所有这些都会发生在shouldStartLoadWithRequest
中。确保设置UIWebView委托。
- (void) viewDidLoad
{
self.webView.delegate = self;
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"html"];
NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
//Make sure the request is mutable
if(![request isKindOfClass:[NSMutableURLRequest class]])
[NSException raise:@"Need to change the request, but can't" format:@""];
NSMutableURLRequest* mutableRequest = (NSMutableURLRequest*)request;
NSString* newUrl = [NSString stringWithFormat:@"%@#hashtag", [[request URL] absoluteString]];
[mutableRequest setURL:[NSURL URLWithString:newUrl]];
return YES;
}
我没有遇到任何请求不可变的情况,但谁知道呢。
或者您可能希望在原始网址中设置哈希值(就像您正在做的那样),然后将%23
的第一个匹配项替换为#
中的shouldStartLoadWithRequest
。
答案 4 :(得分:1)
@ xiang的答案的补充。如果您正在使用应用中的本地html文件,请使用swift版本:
@REBOOT
答案 5 :(得分:0)
我认为您必须在创建文件URL后添加哈希
如果你改变
它是否有效NSURL *fileUrl = [NSURL fileURLWithPath:[filePath stringByAppendingFormat:@"#hashtag"]];
类似于:
NSString *urlString = [[NSURL fileURLWithPath:filePath] absoluteString];
NSURL *fileUrl = [NSURL URLWithString:[urlString stringByAppendingString:@"#hashtag"]];
答案 6 :(得分:0)
在Swift中(使用WKWebView):
override func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let baseURL = Bundle.main.url(forResource: "myFile", withExtension: "html") {
//Load the main page and allow access to its directory
webView.loadFileURL(baseURL, allowingReadAccessTo: baseURL.deletingLastPathComponent())
}
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
let anchor = "#myanchor"
//Use javascript to jump to the location
webView.evaluateJavaScript("location.href = '" + anchor + "'", completionHandler: nil)
}