[英]Swift on OSX: WebView stringByEvaluatingJavaScriptFromString doesn't work
[英]stringByEvaluatingJavaScriptFromString doesn't always seem to work
我正在開發一個Objective C應用程序,當用戶滾動它時,它將大型HTML文檔加載到UIWebView中。 這是因為文檔是20Mb,如果一次加載,往往會導致webview崩潰。 我們的想法是將文檔拆分為HTML塊,並在用戶滾動瀏覽時將新元素添加到文檔中,並刪除舊元素。
目前我正致力於將Objective C應用程序傳遞給文檔中的javascript函數。 我有以下Objective C代碼:
- (BOOL)webView:(UIWebView *)webView2
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
NSString *url = [[request URL] absoluteString];
// Intercept custom location change, URL begins with "js-call:"
if ([url hasPrefix:@"js-call:"]) {
// Extract the selector name from the URL
NSArray *components = [url componentsSeparatedByString:@":"];
NSString *function = [components objectAtIndex:1];
// Call the given selector
[self performSelector:NSSelectorFromString(function)];
// Cancel the location change
return NO;
}
// Accept this location change
return YES;
}
- (void)loadNext {
int endIndex = [self.partIndexEnd intValue];
int newEndIndex = endIndex + 9;
if (newEndIndex >= [self.parts count] - 2){
newEndIndex = [self.parts count] - 2;
}
if (endIndex == newEndIndex){
return; // Already at the end of the document
}
int splitLen = 300;
NSRange range = NSMakeRange(endIndex, newEndIndex - endIndex);
for (NSString *html in [self.parts subarrayWithRange:range]) {
NSLog(@"%@", html);
NSString *htmlToSplit = html;
while ([htmlToSplit length] > 0) {
NSString *curHtml;
if ([htmlToSplit length] <= splitLen){
curHtml = htmlToSplit;
htmlToSplit = @"";
}
else {
curHtml = [htmlToSplit substringToIndex:splitLen + 1];
htmlToSplit = [htmlToSplit substringFromIndex:splitLen - 1];
}
NSString* result = [self.web stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"next('%@');", [curHtml gtm_stringByEscapingForAsciiHTML]]];
NSLog(@"START %@ END %@", curHtml, result);
}
}
[self.web stringByEvaluatingJavaScriptFromString:@"next(null);"];
NSLog(@"HTML = %@ *END*", [self.web stringByEvaluatingJavaScriptFromString:@"$('body').html();"]);
}
我在文檔中有以下javascript:
var nextHtmlToAdd = '';
function next(html){
var retval = '';
try{
if (html){
if (html.match(/teststring/i)){
alert('teststring');
}
nextHtmlToAdd = nextHtmlToAdd + html;
retVal = 'appended';
alert(html);
} else {
// Finished sending HTML
alert('finished');
if (nextHtmlToAdd.match(/teststring/i)){
alert('encoded html contains teststring');
}
nextHtmlToAdd = $("<div/>").html(nextHtmlToAdd).text();
if (nextHtmlToAdd.match(/teststring/i)){
alert('html contains teststring');
}
alert(nextHtmlToAdd);
var elem = $(nextHtmlToAdd);
$('.endofsections').before(elem);
if (elem.text().match(/teststring/i)){
alert('element contains teststring');
}
if ($(document).text().match(/teststring/i)){
alert('document contains teststring');
}
nextHtmlToAdd = '';
retVal = 'finished';
}
} catch (err) {
alert('Error: ' + err.description);
retVal = 'error';
}
return retVal;
}
使用以下代碼在jQuery的$(document).ready()事件中觸發Objective C代碼:
var iframe = document.createElement("IFRAME");
iframe.setAttribute("src", "js-call:loadNext");
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
iframe = null;
如果我單步執行代碼,那么我看到的是運行的stringByEvaluatingJavaScriptFromString方法,並且返回'附加'作為結果或有時返回的指針無效。 Web視圖中沒有出現警報,並且html沒有附加到nextHtmlToAdd,只有HTML的第一位似乎正在正確地傳遞給UIWebView。
我想知道的是,stringByEvaluatingJavaScriptFromString可以執行的javascript字符串的長度是否有限制,或者它可以執行的次數是多少? 有沒有其他方法可以做到這一點?
謝謝,
喬
是的, stringByEvaluatingJavaScriptFromString
方法有限制。 你需要知道的兩個:
在前者中,您將獲得異常,但在后者中,它可能會“無聲地”失敗。 您是否正在測試該方法的返回值? 如果失敗,它將返回nil
。 由於上述原因之一,這可以是查看操作系統是否終止腳本的有用方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.