gpt4 book ai didi

javascript - stringByEvaluatingJavaScriptFromString 似乎并不总是有效

转载 作者:行者123 更新时间:2023-11-30 10:47:30 26 4
gpt4 key购买 nike

我正在开发一个 Objective C 应用程序,它在用户滚动浏览时将大型 HTML 文档加载到 UIWebView 中。这是因为该文档是 20Mb,如果一次加载所有文档,它往往会导致 webview 崩溃。这个想法是将文档分成 HTML block ,当用户滚动浏览它时,新元素将添加到文档中,旧元素将被删除。

目前我正在努力让 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 View 中没有出现任何警报,并且 html 没有附加到 nextHtmlToAdd,只有 HTML 的第一位似乎正确地传递给了 UIWebView。

我想知道的是,stringByEvaluatingJavaScriptFromString 可以执行的 javascript 字符串的长度或执行次数是否有限制?有没有其他方法可以做到这一点?

谢谢,

最佳答案

是的,stringByEvaluatingJavaScriptFromString 方法有一些限制。您需要了解的两个:

  • 不允许超过 10MB 的 JavaScript 分配
  • 不允许执行时间超过 10 秒的 JavaScript

在前者中,您会生成一个异常,但在后者中,它可能会“无声地”失败。你在测试方法的返回值吗?如果失败,它将返回 nil。这是查看您的脚本是否由于上述原因之一而被操作系统终止的有用方法。

关于javascript - stringByEvaluatingJavaScriptFromString 似乎并不总是有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7388743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com