Заголовок IE изменяется на <afterHash>, если страница имеет URL-адрес с '#', и в нем встроена flash/swf
Проблема в том, что если IE (6.0+) имеет встроенный в него флэш-контент, а в URL-адресе страницы есть где-то в нем, тогда, когда загружается содержимое флэш-памяти или если пользователь взаимодействует с ним, тогда название окна, изменяется на содержимое, которое помещается после хеша.
e.g http://adobeflashwebsite.com/index.html#somediv
Затем заголовок страницы изменяется на "somediv", когда пользователь нажимает на флэш-контент или много раз даже в момент загрузки флэш-контента.
Это происходит только в IE.
Это ниже очень конкретный случай, с которым я столкнулся:
Ниже приведена среда, с которой сталкиваются проблемы:
- Отключить движок, чтобы показать страницу, похожую на iGoogle
- Sammy.js
- Отображение гаджетов flash/swf
Проблема здесь, независимо от того, какой плагин я пытаюсь встроить в flash, у меня возникает следующая проблема
- Когда Flash полностью загружается, он добавляет что-то вроде # tab/xx, которое на самом деле является строкой, используемой sammy для хранения последней навигационной истории на странице
- Когда пользователь начинает взаимодействовать со вспышкой, заголовок полностью удаляется и в качестве заголовка остается только # tab/xx.
- Когда гаджет обновляется, даже тогда возникает проблема вроде # 2.
Может ли кто-нибудь предложить, в чем проблема?
Скорее всего, это связано с sammy.js, так как iGoogle не имеет этой проблемы.
Ответы
Ответ 1
Следующее обходное решение - единственный способ (до сих пор), который я получил ближе всего к решению проблемы:
var isIE11OrGreater = !!(navigator.userAgent.match(/Trident/) && !navigator.userAgent.match(/MSIE/));
if (!isIE11OrGreater) {
var originalTitle = document.title.split("#")[0];
document.attachEvent('onpropertychange', function (evt) {
if(evt.propertyName === 'title' && document.title !== originalTitle) {
setTimeout(function () {
document.title = originalTitle;
}, 1);
}
});
}
//Incase the developer wants to change the title manually, instead of directly using //document.title=newtitle, he will need to use changeTitle(newTitle)
function changeTitle(newTitle)
{
originalTitle = newTitle;
document.title = newtitle;
}
Ответ 2
Это ошибка IE:
Если вы используете метод sammy title
, вы можете немного задержать выполнение, чтобы заставить его вести себя в IE.
setTimeout(function() {
context.title('Some title');
}, 1000);
Это не решит это на самом деле, но я заметил, что небольшая задержка иногда помогает IE.
Ответ 3
Я не очень хорошо знаком с sammy.js, но:
1) объект Flash каким-то образом "получает право собственности" на свойство title.
ИЛИ
2) sammy.js очищает значение заголовка от HTML, теряя фокус, ака Flash получает его (меньше likley и не знает, почему кто-то это сделает)
Если 1) → определить свойство title в самом объекте Flash (не пользователь Flash, не знаю, если это можно сделать легко)
Если 2) → javascript сбрасывает значение переменной string, связанное с свойством title?
SUGGESTION:
Включите Flash-объект в новый элемент <div>
, назначив обработчик события <div>
.click(), который изменит свойство title документа. Попробуйте следующее:
$('title').text('YourTitleHere');
Ответ 4
Я немного опаздываю на вечеринку, но предпочитаю этот подход:
var originalTitle = document.title;
copyLinkClipboard = new ZeroClipboard(document.getElementById('copy-link-btn'));
copyLinkClipboard.on( 'ready', function () {
copyLinkClipboard.on( 'aftercopy', function (event) {
event.target.blur();
console.log('Successfully copied link to your clipboard!');
document.title = originalTitle; // sets the title back on successful copy
});
});
document.title = originalTitle; // sets title back when it changes on instantiation
Это специально изменяет заголовок в двух событиях, которые ZeroClipboard меняет, вместо того, чтобы регистрировать слушателя в событии document.onpropertychange.
Ответ 5
//some changes
if (browser.ie < 10) {
document.attachEvent('onpropertychange', function(evt) {
if (evt.propertyName === 'title' && document.title) {
setTimeout(function() {
var b=document.title.indexOf('#');
if(b!==-1){
document.title = document.title.slice(0,b);
}
}, 1);
}
});
}