是否可以将哈希标记发送到UIWebView中的文件URL?

时间:2011-05-25 16:37:17

标签: iphone ios uiwebview

我想从文件加载一个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中并将其作为字符串加载,但我认为必须有更好的方法!

7 个答案:

答案 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)


}