簡體   English   中英

stringByEvaluatingJavaScriptFromString似乎並不總是有效

[英]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方法有限制。 你需要知道的兩個:

  • 不允許大於10MB的JavaScript分配
  • 不允許執行時間超過10秒的JavaScript

在前者中,您將獲得異常,但在后者中,它可能會“無聲地”失敗。 您是否正在測試該方法的返回值? 如果失敗,它將返回nil 由於上述原因之一,這可以是查看操作系統是否終止腳本的有用方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM