2013-07-26 30 views
3

的JavaScript执行等我successfuly使用不可见的UIWebView作为Javascript代码段的执行引擎。相反,what certain pages suggest,它不需要可见。如果宣告死亡只是作为暂停在UIWebView的

UIWebView* myJSExecutor = [UIWebView new]; 

不仅处执行它抛出的任何stringByEvaluatingJavaScriptFromString:,甚至泡alert()到桌面! (不,它的东西你想经常这样做)免责声明:只在iOS 5以上

现在测试,我有另一个常可见UIWebView正常的网页内容,我希望它暂停 JavaScript执行:即停止对定时器和DOM事件进行操作。我认为removeFromSuperviewstopLoading和设置delegate = nil会做的伎俩。但是,不,只要我将UIWebView添加回一些可见的视图,我可以看到定时器一直在运行。

我明白我的要求schizophreny。我很欣赏它在背景下工作(与一些观察相反),但我想暂停它。但是我想问一下,是否有任何可能的私人方式来暂停它。适用于iOS的Safari能够在后台挂起浏览器选项卡。 iOS版Google Chrome不能,这可能是一个悲伤的负面证明:(

回答

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

+0

不幸的是,我需要一个完整的UIWebView,是的。为JavaScriptCore提示+1。 –

3

如果你看为了疯狂,我有一个想法。

我知道暂停的JavaScript的唯一方法是显示一个警告,确认,提示,或与async=false Ajax请求。

是隐藏的,当一个UIWebView隐藏警报?如果是这样,您可以在需要冻结时发送提醒。当您再次显示视图时,用户将不得不解除它:

[web stringByEvaluatingJavaScriptFromString:@"alert('Press OK to continue...')"]; 

或者您可以通过编程方式解除它。我相信你会同意这整个建议是有困难的,但这是一个想法。

+0

_“UIWebView隐藏时是否隐藏了警报?”**不幸的是没有**。无论可视性如何,警报都会冒出来,甚至根本就没有(超)视图上下文。正如我在问题中所写的那样。但是用'async = false'_发送ajax请求让我们思考。 +1。这不是当前的重中之重,但我保证如果它能够正常工作,就会回复你。 –

+0

我给你的赏金,因为这是唯一的建议,可能符合我们的特殊要求(需要完整的'UIWebView',不控制页面内容)。正如@PavelZdenek所说,'alert'不起作用,但是当我们通过我们工作队列中更紧急的任务后,我们将尝试同步的'XMLHttpRequest'。 –

1

这听起来很明显,但是如果您可以编辑您在UIWebView中运行的JS,是不是可以将全局变量存储在称为“已暂停”的JS中,并检查定时器何时开启?

var paused = false; 
var thread = setInterval(function() { 
    if(!paused) { 
     // normal timer checking etc 
    } 
}, 300); 

然后刚刚火[webView的stringByEvaluatingJavaScriptFromString:@“暂停= TRUE;”当你删除web视图,并设置暂停=假,当你将其重新添加到视图。

+0

不幸的是,我不控制页面内容。这是一个网络浏览器,因此它的作者可能会随时随地做任何他喜欢的事情。但是,是的,你确认了我们的“死胡同”理论之一:) –