jak słuchać zmian w elemencie tytułowym?
W javascript, czy istnieje technika, aby słuchać zmian w tytule elementu?
4 answers
5 lat później w końcu mamy lepsze rozwiązanie. Użyj MutationObserver !
W skrócie:
new MutationObserver(function(mutations) {
console.log(mutations[0].target.nodeValue);
}).observe(
document.querySelector('title'),
{ subtree: true, characterData: true }
);
Z komentarzami:
// select the target node
var target = document.querySelector('title');
// create an observer instance
var observer = new MutationObserver(function(mutations) {
// We need only first event and only new value of the title
console.log(mutations[0].target.nodeValue);
});
// configuration of the observer:
var config = { subtree: true, characterData: true };
// pass in the target node, as well as the observer options
observer.observe(target, config);
Również Mutation Observer ma niesamowitą obsługę przeglądarki :
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-15 19:42:15
Można to zrobić ze zdarzeniami w większości nowoczesnych przeglądarek(wyjątkami są wszystkie wersje Opery i Firefoksa 2.0 i wcześniejsze). W IE można użyć zdarzenia propertychange
z document
, a w najnowszych przeglądarkach Mozilla i WebKit można użyć ogólnego zdarzenia DOMSubtreeModified
. W przypadku innych przeglądarek będziesz musiał wrócić do polling document.title
.
Zauważ, że nie byłem w stanie przetestować tego we wszystkich przeglądarkach, więc powinieneś to dokładnie przetestować przed użyciem.
AKTUALIZACJA 9 KWIETNIA 2015
Mutacja Obserwatorzy są sposobem, aby przejść w większości przeglądarek tych dni. Zobacz odpowiedź Władimira Starkowa na przykład. Możesz również chcieć niektóre z poniższych jako awaryjne dla starszych przeglądarek, takich jak IE
function titleModified() {
window.alert("Title modifed");
}
window.onload = function() {
var titleEl = document.getElementsByTagName("title")[0];
var docEl = document.documentElement;
if (docEl && docEl.addEventListener) {
docEl.addEventListener("DOMSubtreeModified", function(evt) {
var t = evt.target;
if (t === titleEl || (t.parentNode && t.parentNode === titleEl)) {
titleModified();
}
}, false);
} else {
document.onpropertychange = function() {
if (window.event.propertyName == "title") {
titleModified();
}
};
}
};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-09 16:43:46
Nie ma wbudowanego zdarzenia. Jednak możesz użyć setInterval
, aby to osiągnąć:
var oldTitle = document.title;
window.setInterval(function()
{
if (document.title !== oldTitle)
{
//title has changed - do something
}
oldTitle = document.title;
}, 100); //check every 100ms
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-23 02:35:32
This ' s my way, in a closure and check in startup
(function () {
var lastTitle = undefined;
function checkTitle() {
if (lastTitle != document.title) {
NotifyTitleChanged(document.title); // your implement
lastTitle = document.title;
}
setTimeout(checkTitle, 100);
};
checkTitle();
})();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-27 18:53:59