Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在UIWebView中暂停Javascript执行_Javascript_Ios_Uiwebview - Fatal编程技术网

在UIWebView中暂停Javascript执行

在UIWebView中暂停Javascript执行,javascript,ios,uiwebview,Javascript,Ios,Uiwebview,我成功地使用了一个不可见的UIWebView作为Javascript片段的执行引擎。相反,它不要求可见。如果被宣布死亡 UIWebView* myJSExecutor = [UIWebView new]; 它不仅通过EvaluatingJavaScriptFromString:执行抛出的任何StringByEvaluationJavaScriptFromString:,它甚至将alert()!(这并不是你经常想做的事情)免责声明:仅在iOS5上测试+ 现在,我有另一个正常可见的UIWebVie

我成功地使用了一个不可见的UIWebView作为Javascript片段的执行引擎。相反,它不要求可见。如果被宣布死亡

UIWebView* myJSExecutor = [UIWebView new];
它不仅通过EvaluatingJavaScriptFromString:执行抛出的任何
StringByEvaluationJavaScriptFromString:
,它甚至将
alert()!(这并不是你经常想做的事情)免责声明:仅在iOS5上测试+

现在,我有另一个正常可见的
UIWebView
,具有正常的网页内容,我希望它能够暂停JavaScript执行:即停止对计时器和DOM事件进行操作。我认为
removeFromSuperview
使用
stopLoading
并设置
delegate=nil
就可以了。但是没有,只要我将UIWebView添加回某个可见视图,我就可以看到计时器一直在运行


我理解我的要求的精神分裂症。一方面,我欣赏它在后台工作(与一些观察相反),但另一方面,我想暂停它。但我仍然想问,是否有任何,甚至可能是私人的方式来暂停它。Safari for iOS能够在后台挂起浏览器选项卡。Chrome for iOS不能,这可能是一个令人悲伤的负面证据:(

您需要完整的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的更完整示例,请参见

如果您正在寻找疯狂,我有一个想法

我知道暂停JavaScript的唯一方法是显示警报、确认、提示或发送带有
async=false
的ajax请求

UIWebView隐藏时警报是否隐藏?如果是,您可以在希望其冻结时发送警报。当您再次显示该视图时,用户必须将其解除:

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

或者你可以通过编程的方式取消它。我相信你会同意这整个建议肯定会有麻烦,但这是一个想法。

这听起来可能很明显,但是如果你可以编辑你在UIWebView中运行的JS,你就不能在JS中存储一个名为“暂停”的全局变量,并在计时器启动时检查它吗

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

然后,在删除webView时只需启动[webView stringByEvaluatingJavaScriptFromString:@“paused=true;”,并在将其添加回视图时将其设置为paused=false。

很遗憾,我需要完整的UIWebView,是的。+1作为JavaScriptCore提示。“当UIWebView隐藏时,警报是否隐藏?”不幸的是,没有。无论可见性如何,警报都会冒泡,甚至有一个(超级)查看上下文。正如我在问题中所写的。但是发送带有
async=false
的ajax请求让我们思考。+1.目前这不是最优先考虑的问题,但我保证如果可行的话会给你回复。我会给你赏金,因为这是考虑到我们的特殊要求,唯一可行的建议(需要完整的
UIWebView
,不控制页面内容)。正如@PavelZdenek所说,
警报
将无法工作,但一旦我们完成了工作队列中更为紧迫的任务,我们将尝试同步的
XMLHttpRequest
。不幸的是,我无法控制页面内容。它是一个web浏览器,因此其作者可能会用计时器做任何他想做的事情。但是,是的,您确认其中一个你的“死胡同”理论:)