iOS js 使用与JSContext

JSContext:js执行环境,包含了js执行时所需要的所有函数和对象;

js执行时,会在执行环境搜索需要的函数然后执行,或者保存传入的变量或函数;

JSContext *jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

jsContext[@"sayhi"] = ^(NSString *name) {

NSLog(@"say hi to %@",name);

};

<div data-role="collapsible">

<h3 onclick="sayhi(‘systemVersion‘)">systemVersion</h3>

<p id="systemVersion"></p>

</div>

* thread #7: tid = 0x15e622, 0x000000010f557f13 jsTest`__27-[ViewController refreshXX]_block_invoke(.block_descriptor=<unavailable>, [email protected]"systemVersion") + 51 at ViewController.m:70, name = ‘WebThread‘, stop reason = breakpoint 1.1

* frame #0: 0x000000010f557f13 jsTest`__27-[ViewController refreshXX]_block_invoke(.block_descriptor=<unavailable>, [email protected]"systemVersion") + 51 at ViewController.m:70

frame #1: 0x00000001106145cc CoreFoundation`__invoking___ + 140

frame #2: 0x000000011061441e CoreFoundation`-[NSInvocation invoke] + 286

frame #3: 0x000000010f9cedb3 JavaScriptCore`JSC::ObjCCallbackFunctionImpl::call(JSContext*, OpaqueJSValue*, unsigned long, OpaqueJSValue const* const*, OpaqueJSValue const**) + 451

frame #4: 0x000000010f9ce926 JavaScriptCore`JSC::objCCallbackFunctionCallAsFunction(OpaqueJSContext const*, OpaqueJSValue*, OpaqueJSValue*, unsigned long, OpaqueJSValue const* const*, OpaqueJSValue const**) + 262

frame #5: 0x000000010f9cfbad JavaScriptCore`long long JSC::APICallbackFunction::call<JSC::ObjCCallbackFunction>(JSC::ExecState*) + 573

frame #6: 0x000000010f999340 JavaScriptCore`JSC::LLInt::setUpCall(JSC::ExecState*, JSC::Instruction*, JSC::CodeSpecializationKind, JSC::JSValue, JSC::LLIntCallLinkInfo*) + 528

frame #7: 0x000000010f9a035d JavaScriptCore`llint_entry + 22900

frame #8: 0x000000010f99a7d9 JavaScriptCore`vmEntryToJavaScript + 326

frame #9: 0x000000010f86c959 JavaScriptCore`JSC::JITCode::execute(JSC::VM*, JSC::ProtoCallFrame*) + 169

frame #10: 0x000000010f8535ad JavaScriptCore`JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 493

frame #11: 0x000000010f627bd7 JavaScriptCore`JSC::call(JSC::ExecState*, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&, WTF::NakedPtr<JSC::Exception>&) + 71

frame #12: 0x00000001158f5c1a WebCore`WebCore::JSEventListener::handleEvent(WebCore::ScriptExecutionContext*, WebCore::Event*) + 1002

frame #13: 0x0000000115542630 WebCore`WebCore::EventTarget::fireEventListeners(WebCore::Event*, WebCore::EventTargetData*, WTF::Vector<WebCore::RegisteredEventListener, 1ul, WTF::CrashOnOverflow, 16ul>&) + 752

frame #14: 0x0000000115542267 WebCore`WebCore::EventTarget::fireEventListeners(WebCore::Event*) + 311

frame #15: 0x000000011552b50e WebCore`WebCore::MouseOrFocusEventContext::handleLocalEvents(WebCore::Event&) const + 174

frame #16: 0x000000011552c0b8 WebCore`WebCore::EventDispatcher::dispatchEvent(WebCore::Node*, WTF::PassRefPtr<WebCore::Event>) + 920

frame #17: 0x0000000115c2dc5d WebCore`WebCore::Node::dispatchEvent(WTF::PassRefPtr<WebCore::Event>) + 29

frame #18: 0x000000011551561e WebCore`WebCore::Element::dispatchMouseEvent(WebCore::PlatformMouseEvent const&, WTF::AtomicString const&, int, WebCore::Element*) + 318

frame #19: 0x00000001155328df WebCore`WebCore::EventHandler::dispatchMouseEvent(WTF::AtomicString const&, WebCore::Node*, bool, int, WebCore::PlatformMouseEvent const&, bool) + 111

frame #20: 0x0000000115534108 WebCore`WebCore::EventHandler::handleMouseReleaseEvent(WebCore::PlatformMouseEvent const&) + 1192

frame #21: 0x000000011553b50d WebCore`WebCore::EventHandler::mouseUp(WebEvent*) + 237

frame #22: 0x00000001150a2be3 WebKitLegacy`-[WebHTMLView mouseUp:] + 115

frame #23: 0x00000001160e230d WebCore`-[WAKView _selfHandleEvent:] + 125

frame #24: 0x00000001160e226f WebCore`-[WAKView handleEvent:] + 63

frame #25: 0x00000001160e546d WebCore`-[WAKWindow sendEventSynchronously:] + 269

frame #26: 0x0000000110e02e81 UIKit`__47-[UIWebDocumentView(Interaction) performClick:]_block_invoke + 740

frame #27: 0x0000000110e02b97 UIKit`-[UIWebDocumentView(Interaction) performClick:] + 68

frame #28: 0x0000000110e0349f UIKit`__64-[UIWebDocumentView(Interaction) _sendMouseMoveAndAttemptClick:]_block_invoke + 345

frame #29: 0x00000001160fd996 WebCore`HandleRunSource(void*) + 390

frame #30: 0x0000000110651301 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17

frame #31: 0x00000001106471a7 CoreFoundation`__CFRunLoopDoSources0 + 423

frame #32: 0x00000001106466e3 CoreFoundation`__CFRunLoopRun + 867

frame #33: 0x00000001106460f8 CoreFoundation`CFRunLoopRunSpecific + 488

frame #34: 0x00000001160fd325 WebCore`RunWebThread(void*) + 469

frame #35: 0x000000011286799d libsystem_pthread.dylib`_pthread_body + 131

frame #36: 0x000000011286791a libsystem_pthread.dylib`_pthread_start + 168

frame #37: 0x0000000112865351 libsystem_pthread.dylib`thread_start + 13

时间: 2024-08-28 06:17:52

iOS js 使用与JSContext的相关文章

iOS JS 交互之利用系统JSContext实现 JS调用oc方法

ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择如下操作,(拖入的文件夹是蓝色的,相对路径),不然css,js 的路径会存在问题 加载本地html: oc调用js:一句代码搞定 2.js 调用oc js调用oc又分为两种: 1.js端是直接调用方法 这里就要说到ios7才推出的一个新的api    JavaScriptCore,首先我们引入这个类,并初始化一个JSContext对

iOS js oc相互调用(JavaScriptCore)(二)

http://blog.csdn.net/lwjok2007/article/details/47058795 上节地址 http://blog.csdn.net/lwjok2007/article/details/47058101 接着上节我们讲到的iOS调用js 下来我们使用js调用iOS js调用iOS分两种情况 一,js里面直接调用方法 二,js里面通过对象调用方法 首先我们看第一种,直接调用方法. 其中用到了iOS的block 上代码 [objc] view plaincopy -(v

转载 iOS js oc相互调用(JavaScriptCore)

iOS js oc相互调用(JavaScriptCore) 从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这个框架 首先我导入framework 方法如下 点击Linked Frameworks and Libraries 的添加后 选择 JavaScriptCore.framework 选中JavaScriptCore.framework后 点击右下角Add 添加完成 好 创建完成之后我们导入一下头文件 [

iOS js oc相互调用JavaScriptCore(一)

原址:http://blog.csdn.net/lwjok2007/article/details/47058101 1.普通调用 从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这个框架 首先我导入framework 方法如下 点击Linked Frameworks and Libraries 的添加后 选择 JavaScriptCore.framework 选中JavaScriptCore.framewor

iOS js oc相互调用(JavaScriptCore)

从iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了. 下面我们就简单了解一下这个框架 首先我导入framework 方法如下 点击Linked Frameworks and Libraries 的添加后 选择 JavaScriptCore.framework 选中JavaScriptCore.framework后 点击右下角Add 添加完成 好 创建完成之后我们导入一下头文件 #import <JavaScriptCore/JavaScr

iOS JS 和 OC交互 / JS 和 native 相互调用

现在app 上越来越多需求是通过UIWebView 来展示html 或者 html5的内容, js 和 native OC代码交互 就非常常见了. js 调用 native  OC代码 第一种机制 (1)最常用的是 利用 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationT

iOS: JS和Native交互的两种方法

背景: UIWebView: iOS 用来展示 web 端内容的控件. 1. 核心方法: - (NSString*)stringByEvaluatingJavaScriptFromString:(NSString *)script; script 就是 JS 代码,返回结果为 js 执行结果. 比如一个 JS function 为 function testFunction(abc){ return abc; }; webview 调用此 JS 代码如下: NSString *js = @"te

[ios]js调用oc代码(oc)

用途:在ios开发中,经常回用到js调用oc代码的时候,例如在网页上有个拍照和打电话的按钮,想打开系统自带的拍照和电话的时候,就需要用到js调用oc代码的功能. 实现原理:在webView加载html网页的时候,没当发送一个请求,就会调用<UIWebViewDelegate>代理的 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIW

ios js call ios

以前方法总是要拦截shouldStartLoadWithRequest 新方法用 javascriptCore 可以像android一样方便把ios 对像export 到js中调用 https://github.com/TomSwift/UIWebView-TS_JavaScriptContext https://www.bignerdranch.com/blog/javascriptcore-example/