2014-11-18 18 views
5

Użyłem silnika v8 do stworzenia programu, można uruchomić kody JS, takie jak:jak stworzyć PRAWDZIWY obiekt globalny w wersji 8?

alert ("test"); // funkcja alertu jest tworzona w C++ i ustawia globalny na kontekst v8. więc można go uruchomić.

window.name = 'aa'; // obiekt okna jest eksportowany z środowiska C++ do v8.

Ale, jeśli mogę ustawić właściwość obiektu window jak:

window.name = 'aa';

następnie odwiedzam:

alert (nazwa); // --------> spowodował błąd, którego nazwa jest niezdefiniowana ...

W przeglądarce Chrome możemy ustawić właściwość, dowolny ciąg znaków dla nazwy właściwości okna. działa dobrze.

Jak mogę to zrealizować? wygląda na to, że okno jest prawdziwe globalnie w kontekście JS.

Mój kod:

Isolate* isolate = Isolate::GetCurrent(); 
Isolate::Scope isolate_scope(isolate); 
HandleScope handle_scope(isolate); 


Handle<ObjectTemplate> global = ObjectTemplate::New(isolate); 

v8::Handle<v8::FunctionTemplate> log_ft = v8::FunctionTemplate::New(isolate, log_Callback); 
log_ft->InstanceTemplate()->SetInternalFieldCount(1); 
global->Set(isolate, "alert", log_ft); 


Handle<Context> context = Context::New(isolate, NULL, global); 
Context::Scope context_scope(context); 


// set global objects and functions 

Local<Object> obj(Object::New(isolate)); 
context->Global()->Set(String::NewFromUtf8(isolate, "window"), obj); 



runJSCode(context, (char*)"window.name =33; alert(name);"); 

std::cout << "********* v8 executed finished !! ********** \n"; 
return 0; 

Odpowiedz

-2
//Local<Object> obj(Object::New(isolate)); 
//context->Global()->Set(String::NewFromUtf8(isolate, "window"), obj); 

runJSCode(context, (char*)"window=this; window.name =33; alert(name);"); 

==== tak łatwe -_-!

+2

Proszę rozważyć edycję swojego wpisu, aby dodać więcej wyjaśnień na temat tego, co robi twój kod i dlaczego to rozwiąże problem. Odpowiedź, która najczęściej zawiera kod (nawet jeśli działa) zazwyczaj nie pomoże OP zrozumieć jego problemu. – Reeno

0

Myślę, że musisz wywołać "alert" z "window.name" zamiast po prostu "name".

runJSCode(context, (char*)"window.name =33; alert(window.name);"); 

„window.name” oznacza właściwość „nazwa” obiektu „okna”, ale po prostu „nazwa” oznacza nazwę właściwości z Objet „to” (czyli w tym przypadku obiekt można uzyskać poprzez wywołanie " context-> Global() "w kodzie C++). Ustawiasz "okno" jako właściwość obiektu globalnego, a nie obiekt globalny.