暂停UIWebView中的Javascript执行

时间:2013-07-26 08:34:34

标签: javascript ios uiwebview

我成功地使用了一个不可见的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不能,这可能是一个令人遗憾的负面证据:(

3 个答案:

答案 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。