在UIWebView中挂起Javascript执行
Suspend Javascript execution in UIWebView
我成功地使用了一个不可见的UIWebView作为Javascript片段的执行引擎。与某些页面所建议的相反,它不需要是可见的。如果只是作为宣布死亡
UIWebView* myJSExecutor = [UIWebView new];
它不仅执行任何向它抛出的stringByEvaluatingJavaScriptFromString:
,甚至将alert()
弹出到桌面!(并不是说这是你想经常做的事情)免责声明:仅在iOS 5+上测试
现在,我有了另一个具有正常网页内容的正常可见的UIWebView
,我希望它暂停JavaScript执行:即停止对计时器和DOM事件执行操作。我认为removeFromSuperview
和stopLoading
以及设置delegate = nil
就可以了。但不,只要我将UIWebView添加回某个可见视图,我就可以看到计时器一直在运行。
我理解我的要求的精神错乱。我赞赏它一方面在后台工作(与一些意见相反),但另一方面我想暂停它。但我还是想问一下,是否有任何,甚至是私人的方式可以暂停它。Safari for iOS能够在后台暂停浏览器选项卡。iOS版Chrome不能,这可能是一个可悲的负面证明:(
如果你想找疯子,我有个主意。
我知道暂停JavaScript的唯一方法是显示警报、确认、提示或使用async=false
发送ajax请求。
UIWebView被隐藏时,警报是否被隐藏?如果是这样,您可以在希望它冻结时发送警报。当你再次显示视图时,用户将不得不关闭它:
[web stringByEvaluatingJavaScriptFromString:@"alert('Press OK to continue...')"];
或者,您可以通过编程方式将其忽略。我相信你会同意整个建议一定会有麻烦,但这只是一个想法。
您需要完整的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
这听起来可能很明显,但如果你可以在UIWebView中编辑你正在运行的JS,难道你不能在JS中存储一个名为"paused"的全局变量,并在计时器启动时检查一下吗?
var paused = false;
var thread = setInterval(function() {
if(!paused) {
// normal timer checking etc
}
}, 300);
然后,当您删除webView时,只需激发[webView字符串ByEvaluatingJavaScriptFromString:@"paused=true;"],当您将其添加回视图时,设置paused=false。
- JavaScript执行暂时挂起页面
- 页面在我的javascript执行后重新加载,我不希望它这样做
- 如何在使用jQuery.html()时防止javascript执行
- 如何打开一个新窗口或选项卡,并将其提供给javascript执行
- 如何在Ajax加载新内容时停止JavaScript执行
- 如何使用xpath和Javascript执行器打印文本
- cakehp2.x用javascript执行控制器
- 如何在不使用javascript执行的情况下为函数分配参数
- Javascript执行顺序错误
- Javascript执行顺序和回调
- 如何在Javascript执行后防止浏览器锁定
- JavaScript执行从函数声明开始,而不是从$(document).ready()开始
- 在asp.net页面中显示javascript执行过程中的加载图标
- 基于浏览器窗口大小的条件 JavaScript 执行
- 使用 JavaScript 执行一行 PHP(不包括 PHP 文件)
- Dom 解析和 JavaScript 执行
- 为什么通过javascript执行php可以工作
- JavaScript执行路径
- 从javaScript执行服务器端代码
- 如何使用Javascript执行客户端web抓取