У меня есть html-страница, содержащая это:
<div id="ajaxloader" style="display: none;">
<div>
hello world
</div>
</div>
я могу прочитать его отображаемое значение с помощью document.getElementById('ajaxloader').style.display
Я хочу получать уведомления, когда его отображение изменяется на block
или none
.
В настоящее время я использую тупое решение с использованием таймера:
Timer{
running : true
repeat : true
interval: 500
onTriggered: {
var js = "document.getElementById('ajaxloader').style.display"
webView.runJavaScript(js,x=>{
if(x=="block"){
// we catch the change but its really bad solution
}
})
}
}
Я ищу способ отследить такого рода изменения в DOM, что-то называется Mutation Observer
, но я не уверенкак внедрить его в WebEngineView QML.
все, что мне нужно, это способ отследить изменения, произошедшие в WebEngineView, или событие, чтобы отловить CRUD, происходящие в движке или в любом случае лучше, чем этот таймер!
UPDATE:
например, у нас есть веб-двигатель, который переходит на google.com, и после завершения загрузки он меняет текст поиска на «hello world», мы хотим отследить это изменение без использования таймера, на реальных веб-сайтах это изменение фактически происходит сФункции CRUD (запросы ajax) или другие способы:
WebChannel{
id:_channel
}
WebEngineView{
id:webEngine
height: parent.height
width: parent.width
webChannel: _channel
url : "www.google.com"
onNewViewRequested: {
request.openIn(webEngine)
}
objectName: "webView"
profile.httpCacheType: WebEngineProfile.NoCache
onLoadingChanged: {
if(loadRequest.status == WebEngineView.LoadSucceededStatus){
var js = "document.querySelector('input[role=combobox]').value = 'hello world'"
webEngine.runJavaScript(js,y=>{})
}
}
}
не забудьте инициализировать движок в c ++, без него не получится: QtWebEngine::initialize();
и другие вещи, импортируемые plнам нужно добавить это в файл pro QT += webengine webengine-private webenginecore webenginecore-private
сейчас, если я использую метод таймера, который я хочу отложить в сторону, он должен выглядеть следующим образом:
Timer{
running : true
repeat : true
interval : 500
onTriggered:{
var js = "document.querySelector('input[role=combobox]').value"
webEngine.runJavaScript(js,y=>{console.log(y)});
// now i have to check y to see if its equals to hello world or what ever which is really bad idea to use a timer here
}
}
например, вы можете наблюдать изменения вВвод Google, как это:
var targetNode = document.querySelector('input[role=combobox]')
targetNode.oninput = function(e){this.setAttribute('value',targetNode.value)}
var config = { attributes: true, childList: true, subtree: true };
var callback = function(mutationsList, observer) {
for(var mutation of mutationsList) {
if (mutation.type == 'childList') {
console.log('A child node has been added or removed.');
}
else if (mutation.type == 'attributes') {
console.log('The ' + mutation.attributeName + ' attribute was modified.');
}
}
};
// Create an observer instance linked to the callback function
var observer = new MutationObserver(callback);
// Start observing the target node for configured mutations
observer.observe(targetNode, config);