В javascript существует ли способ прослушивания изменений в элементе title?
Как прослушивать изменения в элементе title?
Ответ 1
Через 5 лет мы, наконец, получили лучшее решение. Используйте MutationObserver!
Короче:
new MutationObserver(function(mutations) {
console.log(mutations[0].target.nodeValue);
}).observe(
document.querySelector('title'),
{ subtree: true, characterData: true }
);
С комментариями:
// 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);
Также Mutation Observer имеет потрясающую поддержку браузера:
Ответ 2
Вы можете сделать это с помощью событий в большинстве современных браузеров (примечательными исключениями являются все версии Opera и Firefox 2.0 и более ранние версии). В IE вы можете использовать событие propertychange
document
, а в последних браузерах Mozilla и WebKit вы можете использовать общее событие DOMSubtreeModified
. Для других браузеров вам придется вернуться к опросу document.title
.
Обратите внимание, что я не смог проверить это во всех браузерах, поэтому вы должны тщательно протестировать его, прежде чем использовать его.
ОБНОВЛЕНИЕ 9 АПРЕЛЯ 2015 ГОДА
Наблюдатели за мутацией - это способ пойти в большинстве браузеров в наши дни. См. Пример Владимира Старкова. Возможно, вы захотите, чтобы некоторые из нижеперечисленных были резервными для старых браузеров, таких как IE <= 10 и более старые браузеры Android.
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();
}
};
}
};
Ответ 3
Там нет встроенного события. Однако вы можете использовать setInterval
для выполнения этого:
var oldTitle = document.title;
window.setInterval(function()
{
if (document.title !== oldTitle)
{
//title has changed - do something
}
oldTitle = document.title;
}, 100); //check every 100ms
Ответ 4
Это мой способ, в закрытии и проверке при запуске
(function () {
var lastTitle = undefined;
function checkTitle() {
if (lastTitle != document.title) {
NotifyTitleChanged(document.title); // your implement
lastTitle = document.title;
}
setTimeout(checkTitle, 100);
};
checkTitle();
})();