2009-08-07 6 views
6

मेरे पास एक UIWebView है जिसे मैं अपने ऐप के भीतर एक एम्बेडेड ब्राउज़र के रूप में उपयोग कर रहा हूं।UIWebView में पॉपअप लिंक खोलना, संभव है?

मैंने देखा है कि नए विंडोज़ खोलने वाले वेबपृष्ठों में लिंक मेरे कोड में किसी भी कॉल के बिना अनदेखा किए जाते हैं।

मैं

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 

और फिर आगे breakpointing की कोशिश की है कि एक पॉपअप विंडो खोलेगा एक लिंक का चयन करके और ब्रेकप्वाइंट मारा कभी नहीं किया गया है। क्या ऐसा कुछ भी है जो मैं पॉपअप लिंक के चयन को रोकने के लिए कर सकता हूं और यूआरएल प्राप्त कर सकता हूं और इसे सामान्य रूप से लोड कर सकता हूं?

मुझे ऐप में पॉपअप विंडो प्रदर्शित करने में कोई दिलचस्पी नहीं है, मैं सिर्फ मुख्य वेबव्यू में लोड करने के लिए पॉपअप विंडो में लोड होने वाला यूआरएल चाहता हूं।

क्या यह संभव है?

धन्यवाद!

उत्तर

7

मैं इसमें भी भाग गया, और एचटीएमएल रीराइटिंग सबसे अच्छा समाधान था जिसके साथ मैं आ सकता था। उस दृष्टिकोण के साथ मैंने जो सबसे बड़ा मुद्दा चलाया वह यह है कि वेब ब्राउज़र वेबव्यूडिडफिनिश लोड: विधि कहलाता है, तब तक कुछ सेकंड तक इंटरैक्टिव होता है, इसलिए जब तक उन्हें दोबारा लिखा नहीं जाता है तब तक लिंक कुछ सेकंड तक टूटा हुआ प्रतीत होता है।

तीन क्षेत्रों में मैंने दोबारा लिखा है: लिंक, फॉर्म पोस्ट, और window.open() पर कॉल करें।

मैंने Jasarian's में टैग किए गए पहले कोड के समान दृष्टिकोण का उपयोग किया जो टैग और रूपों पर पुनरावृत्त करके लिंक और रूपों के लक्ष्य को ओवरराइट करने के लिए उत्तर देता है। window.open ओवरराइड करने के लिए, मैं निम्न के समान कोड का इस्तेमाल किया:

var oldWindowOpen = window.open; 
window.open = function(url, sName, sFeatures, bReplace) { 
    oldWindowOpen(url, '_self'); 
}; 
3

तो थोड़ी सी शोध के बाद, यह स्पष्ट है कि UIWebView क्लास उद्देश्य से लिंक को अनदेखा करता है जो एक नई विंडो में खुल जाएगा (या तो टैग पर 'लक्ष्य' तत्व का उपयोग करके या ऑनक्लिक ईवेंट में जावास्क्रिप्ट का उपयोग करके)।

मुझे मिले एकमात्र समाधान जावास्क्रिप्ट का उपयोग कर किसी पृष्ठ के HTML में हेरफेर करना है। हालांकि यह कुछ मामलों के लिए काम करता है, यह बुलेटप्रूफ नहीं है। यहाँ कुछ उदाहरण हैं:

links = document.getElementsByTagName('a'); 
for (i=0; i<links.length; i++) 
{ 
    links[i].target='_self'; 
} 

यह सभी लिंक _self पर बात करने के लिए 'लक्ष्य' तत्व का उपयोग बदल जाएगा - _blank या _new के बजाय। यह शायद बोर्ड भर में काम करेगा और कोई समस्या नहीं पेश करेगा।

अन्य टुकड़ा मैंने पाया एक ही विचार पीछा किया, लेकिन onClick ईवेंट के साथ:

links = document.getElementsByTagName('a'); 
for (i=0; i<links.length; i++) 
{ 
    links[i].onclick=''; 
} 

यह एक सादे बुरा है। यह केवल तभी काम करेगा जब लिंक टैग में इसका href तत्व सही ढंग से सेट हो, और केवल तभी जब ऑनक्लिक ईवेंट नई विंडो खोलने के लिए उपयोग किया जाता है (window.open() या कुछ इसी तरह का उपयोग करें)। कारणों से यह बुरा क्यों है, उसे समझाने की आवश्यकता नहीं है, लेकिन एक उदाहरण होगा यदि ऑनक्लिक का उपयोग खिड़की खोलने के अलावा किसी अन्य चीज़ के लिए किया जाता है - जो एक बहुत ही आम मामला है।

मुझे लगता है कि कोई इसके साथ आगे बढ़ सकता है और ऑनक्लिक विधि के साथ कुछ स्ट्रिंग मिलान करना शुरू कर सकता है, और window.open() की जांच कर सकता है, लेकिन फिर से, यह वास्तव में आदर्श से बहुत दूर है।

2

यहाँ मैं कैसे चहचहाना लिंक काम करने के लिए मिलता है (अर्थातपृष्ठों के लिए लिंक है कि नए खिड़कियों के साथ खोलने के लिए) की कोशिश:

-(BOOL)webView:(UIWebView *)mainWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 

    if (navigationType == UIWebViewNavigationTypeLinkClicked) { 
     //Allows for twitter links 
     [self.mainWebView loadRequest:request]; 
     return NO; 
    } 

    return YES; 

} 
0
WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init]; 
    theConfiguration.preferences.javaScriptCanOpenWindowsAutomatically = YES; 

    webView1 = [[WKWebView alloc] initWithFrame:self.webView.frame configuration:theConfiguration]; 
    webView1.navigationDelegate = self; 
    webView1.UIDelegate = self; 
    [self.view addSubview:webView1]; 

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 

    NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 
     NSString *htmlString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 
     NSLog(@"htmlString: %@", htmlString); 
     [webView1 loadHTMLString:htmlString baseURL:[NSURL URLWithString:@"your url"]; 
    }]; 

    [dataTask resume];