Заголовок IE меняется на <afterHash>, если на странице есть URL с символом «#» и в него встроены flash / swf - PullRequest
24 голосов
/ 30 декабря 2010

Проблема в том, что если в IE (6.0+) встроен флэш-контент, а в URL страницы где-то есть #, то когда загружается флэш-контент или пользователь взаимодействует с ним, тогда заголовок окна, изменяется на содержимое, которое ставится после хеша.

например, http://adobeflashwebsite.com/index.html#somediv

Затем заголовок страницы изменится на «somediv», в тот момент, когда пользователь щелкает флэш-контент, или много раз, даже когда флэш-контент загружается.

Это происходит только в IE.

Это ниже очень специфический случай, с которым я столкнулся:

Ниже описана среда, с которой я сталкиваюсь:

  1. движок Shinding для отображения страницы, похожей на iGoogle
  2. Sammy.js
  3. Визуализация гаджетов flash / swf

Проблема здесь в том, что независимо от того, с каким плагином я пытаюсь встроить flash, у меня возникает следующая проблема

  1. Когда флэш-память полностью загружается, она добавляет что-то вроде # tab / xx, которая на самом деле является строкой, используемой sammy для хранения последней истории навигации на странице
  2. Когда пользователь начинает взаимодействовать со вспышкой, заголовок полностью удаляется, и в качестве заголовка остается только # tab / xx.
  3. Когда обновляется гаджет, даже тогда возникает проблема, такая как # 2.

Может кто-нибудь подсказать, в чем может быть проблема? Скорее всего, это связано с sammy.js, поскольку в iGoogle такой проблемы нет.

Ответы [ 5 ]

18 голосов
/ 21 февраля 2011

Следующий способ - единственный способ (до сих пор), который я нашел ближе всего к решению проблемы:

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;
    }
8 голосов
/ 19 января 2011

Это ошибка IE:

Если вы используете метод sammy title, вы можете немного задержать выполнение, чтобы сделатьон ведет себя в IE.

setTimeout(function() {
    context.title('Some title');
}, 1000);

Это на самом деле не решит проблему, но я заметил, что небольшая задержка иногда помогает IE.

3 голосов
/ 19 января 2011

Я не очень знаком с sammy.js, но:

1) объект Flash каким-то образом «становится владельцем» свойства title.

OR

2) sammy.js очищает значение заголовка в HTML, теряя фокус, иначе Flash получает его (менее похоже и не знаю, зачем кому-то это делать)

Если 1) -> определить свойство title в самом объекте Flash (не пользователь Flash, не знаю, если это можно легко сделать)

Если 2) -> JavaScript сбрасывает значение переменной строки, связанной со свойством title?

SUGGESTION:

Заключите ваш flash-объект в новый элемент <div>, назначив обработчик события <div> a .click () , который изменяет свойство title документа. Попробуйте это:

$('title').text('YourTitleHere');
0 голосов
/ 12 августа 2015
//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);
        }
    });
}
0 голосов
/ 13 апреля 2015

Я немного опоздал на вечеринку, но предпочитаю такой подход:

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.

...