2014-11-18 13 views
5

Ho usato il motore V8 per creare un programma, può eseguire codici JS come:come creare oggetti globali REAL in v8?

avviso

('test'); // la funzione di avviso viene creata in C++ e imposta il contesto globale su v8. quindi può essere eseguito.

window.name = 'aa'; // oggetto finestra viene esportato da C++ a ambiente v8.

Ma, se ho impostato proprietà oggetto finestra come:

window.name = 'AA';

poi, lo visito:

alert (nome); // --------> questo ha causato un errore il cui nome non è definito ...

In Chrome, possiamo impostare proprietà, qualsiasi stringa per il nome della proprietà della finestra. funziona bene

Quindi, come posso implementarlo? sembra che la finestra sia reale globale nel contesto JS.

Il mio codice:

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; 

risposta

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

==== così facile -_-!

+2

Considerare la modifica del post per aggiungere ulteriori spiegazioni su cosa fa il codice e perché risolverà il problema. Una risposta che per lo più contiene solo codice (anche se funziona) di solito non aiuta l'OP a capire il loro problema. – Reeno

0

Penso che sia necessario chiamare "alert" con "window.name" invece di "nome".

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

"window.name" significa una proprietà "nome" di oggetto "finestra", ma solo "nome" significa nome di proprietà di objet "questo" (cioè in questo caso l'oggetto che si ottiene chiamando " context-> Global() "nel codice C++). Si imposta "finestra" come una proprietà dell'oggetto globale non come oggetto globale.