我成功地使用了一个不可见的UIWebView作为Javascript片段的执行引擎。与what certain pages suggest相反,不需要显示。如果宣布死亡只是
UIWebView* myJSExecutor = [UIWebView new];
不仅会执行任何stringByEvaluatingJavaScriptFromString:
抛出,它甚至会将alert()
冒充到桌面! (这不是你想经常做的事情)免责声明:仅在iOS 5 +上进行测试
现在,我有另一个正常可见的UIWebView
具有正常的网页内容,我希望它暂停 JavaScript执行:停止对定时器和DOM事件采取行动。我认为removeFromSuperview
stopLoading
和设置delegate = nil
可以解决问题。但是,不,只要我将UIWebView添加回某些可见视图,我就可以看到计时器一直在运行。
我理解我的要求的精神分裂症。我很欣赏它一方面在后台工作(与一些观察相反),但另一方面我想暂停它。但我仍然想问是否有任何,甚至是私人方式暂停它。 Safari for iOS能够在后台暂停浏览器选项卡。 Chrome for iOS不能,这可能是一个令人遗憾的负面证据:(
答案 0 :(得分:3)
如果你正在寻找疯狂,我有一个想法。
我知道暂停JavaScript的唯一方法是显示警告,确认,提示或发送带async=false
的ajax请求。
隐藏UIWebView时是否隐藏了警报?如果是这样,您可以在希望冻结时发送警报。当您再次显示视图时,用户将不得不将其关闭:
[web stringByEvaluatingJavaScriptFromString:@"alert('Press OK to continue...')"];
或许你可以通过编程方式解雇它。我相信你会同意这整个建议都有麻烦,但这是一个想法。
答案 1 :(得分:1)
您需要完整的UIWebView吗?如果没有,你可以直接调用JavaScriptCore。
- (NSString *)runJS:(NSString *)aJSString
{
JSContextRef ctx = JSGlobalContextCreate(NULL);
JSStringRef scriptJS = JSStringCreateWithUTF8CString([aJSString UTF8String]);
JSValueRef exception = NULL;
JSValueRef result = JSEvaluateScript([self JSContext], scriptJS, NULL, NULL, 0, &exception);
JSGlobalContextRelease(ctx);
...
这可以让你更好地控制整个JS运行时,但不幸的是我没有找到一个API来暂停执行定时器而不是释放整个上下文。
有关如何使用JavaScriptCore的更完整示例,请参阅https://github.com/jfahrenkrug/AddressBookSpy/blob/master/AddressBookSpy/AddressBookSpy/ABSEngine.m
答案 2 :(得分:1)
这听起来很明显,但是如果你可以编辑你在UIWebView中运行的JS,你不能只在JS中存储一个名为'paused'的全局变量,并检查你的计时器何时开始?< / p>
var paused = false;
var thread = setInterval(function() {
if(!paused) {
// normal timer checking etc
}
}, 300);
然后在删除webview时触发[webView stringByEvaluatingJavaScriptFromString:@“paused = true;”],并在将其添加回视图时设置paused = false。