2014-11-18 8 views
5

Ich habe v8-Engine verwendet, um ein Programm zu erstellen, es kann JS-Codes wie ausführen:wie REAL globales Objekt in V8 erstellen?

alert ('test'); // Alert-Funktion wird in C++ erstellt und global auf v8-Kontext gesetzt. so kann es ausgeführt werden.

window.name = 'aa'; // window-Objekt wird von C++ in v8-Umgebung exportiert.

Aber wenn ich gesetzt Eigenschaft Fenster Objekt wie:

window.name = 'aa';

dann besuche ich es:

alert (name); // --------> Dies verursachte den Fehler, dass der Name nicht definiert ist ...

In Chrome können wir Eigenschaft, eine beliebige Zeichenfolge für den Namen der Fenstereigenschaft festlegen. es läuft gut.

Also, wie kann ich das umsetzen? Es scheint, dass das Fenster im JS-Kontext real global ist.

Mein Code:

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; 

Antwort

-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);"); 

==== so einfach -_-!

+2

Bitte bedenken Sie, dass Sie Ihren Post bearbeiten müssen, um weitere Erklärungen dazu zu erhalten, was Ihr Code tut und warum er das Problem löst. Eine Antwort, die meistens nur Code enthält (auch wenn es funktioniert) wird dem OP normalerweise nicht helfen, ihr Problem zu verstehen. – Reeno

0

Ich denke, dass Sie "alert" mit "window.name" statt nur "name" aufrufen müssen.

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

„window.name“ bedeutet eine Eigenschaft „Namen“ des Objekts „Fenster“, sondern nur „Name“ bedeutet Eigenschaftsnamen von objet „this“ (das in diesem Fall ist das Objekt, das Sie durch den Aufruf "erhalten context-> Global() "in C++ - Code). Sie legen "Fenster" als eine Eigenschaft des globalen Objekts nicht als globales Objekt fest.