14

在 QT 4.8.4 中,我通过 c++ 中的回调执行了一些任意 Javascript:

myWebElement->evaluateJavaScript( myScript );

现在,测试脚本是:

$(this).css('border', 'solid 10px #000')

它起作用了,但是运行了几秒钟,并运行了 CPU 100%

然后在测试时我添加了“;console.log('X')”,同时调试脚本以查明挂断......它立即执行!

我发现只要我登录到控制台,脚本就可以按预期有效地工作。一旦我删除控制台日志记录,性能就会变慢。我直接在脚本中登录,或者在C++中添加日志都没有关系。

有任何想法吗?我不想在我的程序中出现像下面这样的 hack。

myWebElement->evaluateJavaScript( myScript + "; console.log('X')" );

更新:

看起来此错误受页面上元素数量的影响。有一个表,在只有一两行的情况下,没有 CPU 启动。当有 600 行时,会有几秒钟的 CPU 使用率达到最大值。不过,只要最后有一个 console.log 命令,即使有 600 行,CPU 也不会启动。

(还在问题中添加了版本信息)

更新 2:

经过测试,我不需要向控制台传递任何东西来让黑客工作,我什至不需要调用 log. 我可以附加“;控制台;” 到脚本,它仍然会立即工作。我还测试了在末尾添加一个 return 语句,但没有奏效。

4

1 回答 1

17

问题是 Qt 正在评估 Javascript 中最后一条语句的返回值并将其转换为 QVariant。它变得非常耗时,因为 jQuery 正在返回 jQuery 对象,该对象正在被 Qt 完整地评估 - 并且在那时递归地进行评估。这也消耗了 RAM。

解决问题的不是 console.log,而是它返回的“null”值。我进行了测试,并且在脚本末尾装订“null”也有效。以下是更新后的代码。

myWebElement->evaluateJavaScript(myScript + "; null" );

于 2013-11-04T15:03:00.607 回答