我试图愚弄这个特定的代码:
<!DOCTYPE html>
<html>
<body>
<p>Click anywhere in the document (the right frame) to get focus. If you click outside the document, it will lose focus.</p>
<p id="demo"></p>
<script>
setInterval("myFunction()", 1);
function myFunction() {
var x = document.getElementById("demo");
if (document.hasFocus()) {
x.innerHTML = "The document has focus.";
} else {
x.innerHTML = "The document DOES NOT have focus.";
}
}
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
因此,即使我不是 Chrome 中的前台应用程序,它也会返回 True。我想到的解决方案:
以某种方式使用硒?
在 chrome JS 引擎或铬中编译新的 hasFocus() 方法?总是返回 True。
尝试使用子类化的QObject作为参数执行小型脚本。
QJSEngine jsEngine;
QJSValue arg = jsEngine.newQObject(child); // Child it's subclassed QObject
QJSValue function = jsEngine.evaluate(m_childRestriction);
QJSValue result = function.call(QJSValueList() << arg);
Run Code Online (Sandbox Code Playgroud)
在销毁jsEngine时,它将为我的子对象调用delete(因为newQObject使用JavaScriptOwnership创建了它)。如何避免这种情况,如何更改arg的所有权?
脚本很简单:
function(device) {
return device.m_place >=0 && device.m_place < 16;
}
Run Code Online (Sandbox Code Playgroud)
UPD:
可以调用QQmlEngine::setObjectOwnership(child, QQmlEngine::CppOwnership);对象,因为它是静态函数。从帮助中还不清楚。认为也应该在QJSEngine。
我必须在C++应用程序中运行一系列javascript"脚本".其中大多数都是重复性的行为.这里的代码示例.
我知道Qt,因为版本5包含2个javascript引擎:QtScript和QJSEngine.
我的问题是我们应该使用哪种情况?哪种表现更好,在哪种情况下?
我从Qt开始,我的一个项目是使用QJSEngine评估javascript,我想为脚本提供完整的API,包括类和全局函数。
现在,我的程序仅提供ECMAScript默认值(eval,encodeURI,parseInt等),但是我需要向代码公开一些自定义类,例如浏览器API(WebSocket类,Image类,文档对象)。例如:
var obj = new CustomClass("", 0);
var ret = obj.customClassMethod("[...]!");
customFunction(ret);
Run Code Online (Sandbox Code Playgroud)
我需要在C ++中定义类的行为,这无助于评估类定义并让用户代码运行。
我正在将QScriptEngine代码迁移到QJSEngine,并且遇到了一个问题,我在评估脚本后无法调用函数:
#include <QCoreApplication>
#include <QtQml>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QJSEngine engine;
QJSValue evaluationResult = engine.evaluate("function foo() { return \"foo\"; }");
if (evaluationResult.isError()) {
qWarning() << evaluationResult.toString();
return 1;
}
if (!evaluationResult.hasProperty("foo")) {
qWarning() << "Script has no \"foo\" function";
return 1;
}
if (!evaluationResult.property("foo").isCallable()) {
qWarning() << "\"foo\" property of script is not callable";
return 1;
}
QJSValue callResult = evaluationResult.property("foo").call();
if (callResult.isError()) {
qWarning() << "Error calling \"foo\" function:" << …Run Code Online (Sandbox Code Playgroud) 由于 qt 文档上的QJSValue,QJsonObjectinst 不能隐式转换为QJSValue,我想QJSEngine从 C++ 调用一个 javascript 函数,参数应该传递到QList<QJsValue>调用另一个QJSValue保存函数本身的函数。
问题是我的一个论点是QJsonObject,到目前为止,我应该将其转换为文本,然后调用并将其传递给调用将JSON.parse其转换为对象的 javascript 函数,我正在寻找一种解决方案,让我可以将其转换QJsonObject为QJSValueC++并使用对象参数而不是 json 文本调用 javascript 函数。
目前代码如下
QJsonObject obj;
obj["1"] = QString("A");
obj["2"] = QString("B");
QJSValue func = myEngine.evaluate("(function(arg) { var obj = JSON.parse(arg); var res = obj[\"1\"] + obj[\"2\"]; return res; })");
QJSValueList args;
args << QString(QJsonDocument(obj).toJson());
QJSValue res = func.call(args);
Run Code Online (Sandbox Code Playgroud)
我想要一个像QJSValue ConvertToQJSValue(QJsonObject object)这样的函数:
QJsonObject obj;
obj["1"] = …Run Code Online (Sandbox Code Playgroud) 我正在从QScriptEngine(已被弃用)转移到QJSEngine,我发现我无法使用print:
QJSEngine engine;
QJSValue val = engine.evaluate(
"print('123');"
);
if (val.isError()){
qDebug() << "error: " << val.toString();
}
qDebug() << "val: " << val.toVariant();
Run Code Online (Sandbox Code Playgroud)
输出是:
error: "ReferenceError: print is not defined"
Run Code Online (Sandbox Code Playgroud)
在QScriptEngine它的作品.
然后,打印控制台的方式是什么QJSEngine?在文档中找不到任何内容.我尝试使用console.log,但console也没有定义.
qjsengine ×7
qt ×6
c++ ×5
javascript ×4
qtscript ×2
chromium ×1
console.log ×1
qt5 ×1
selenium ×1