Ошибка Javascript в браузере webkit, перемещающемся по контенту из iframe - PullRequest
0 голосов
/ 28 июня 2011

У нас есть это решение, работающее в браузерах IE и Firefox, которые вы можете продемонстрировать ниже, но если вы нажмете на демонстрационные ссылки, используя Chrome или Safari, контент будет постоянно зацикливаться на шаблоне в источнике iframe, где мне и нужнопомощь в решении проблемы Chrome / Safari.

Нам нужно было решение, чтобы наши пользователи имели прямой доступ к нашей странице с фреймом, а при доступе к странице она оборачивала бы страницу соответствующим фреймом.шаблон.Как упоминалось выше, решение работает в IE / Firefox, но не в Chrome и Safari.

Обе эти страницы имеют одинаковое содержимое, но разные шаблоны iframed.

Например, нажав эту ссылкупереместит пользователя к содержимому Признания наград и обернет шаблон AMU вокруг той же страницы с #AMU, добавленным к URL http://www.apus.edu/alumni/awards-recognition/index.htm#AMU

Это точно такой же контент, но он обернет шаблон APU вокругта же страница, поскольку #APU добавлен к URL http://www.apus.edu/alumni/awards-recognition/index.htm#APU


Ниже приведен javascript, который идет в родительском iframe: http://www.apu.apus.edu/community/alumni/index.htm

<script type="text/javascript">
function gup( name ) {
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)"; 
    var regex = new RegExp( regexS );
    var results = regex.exec( window.location.href );
    if( results == null )
        return "";
    else
        return results[1];
}
var ifSrc = gup("forward");
$(function(){ 
    if(ifSrc)
        $("#iframe").attr('src', ifSrc);
});
</script>

Ниже приведен код, которыйпредназначен для исходного контента и страницы, на которой он будет идти: http://www.apus.edu/alumni/awards-recognition/index.htm

<script type="text/javascript">
function fnGetDomain(url) {
    if(url)
        return url.match(/:\/\/(.[^/]+)/)[1];
    else
        return "";
}
var curDomain = fnGetDomain(document.referrer);
var curHash = document.location.hash.toLowerCase();
try { frameEl = window.frameElement; }
catch(e) { frameEl = 1; }
if(!frameEl) {
//if (frameElement == null) {
    if(!curDomain)              curDomain = "www.apu.apus.edu";
    if(curHash == "#apu")       curDomain = "www.apu.apus.edu";
    else if(curHash == "#amu")  curDomain = "www.amu.apus.edu";
    //change location or close
    window.location = "http://" + curDomain + "/community/alumni/index.htm?forward=" + document.location.href;
    // or window.close();
}
</script>

Ответы [ 3 ]

1 голос
/ 28 июня 2011

Это раньше, если (frameEl) {

if ($.browser.webkit) {
    if(top === self) frameEl = 0;
    else frameEl = 1;
}
0 голосов
/ 28 июня 2011

может быть попробовать:

if (top === self) { 
  frameEl = 1;
}

для Chrome

0 голосов
/ 28 июня 2011

Похоже, что при изменении iframe $(document).ready() срабатывает снова и снова.Вы пытались изменить это с вызова jQuery на документ, готовый к немедленной функции?

<script type="text/javascript">
function gup( name ) {
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)"; 
    var regex = new RegExp( regexS );
    var results = regex.exec( window.location.href );
    if( results == null )
        return "";
    else
        return results[1];
}
var ifSrc = gup("forward");

// edit: notice no $ in front, and () at the end.
(function(){ 
    if(ifSrc) {
     var iframe = document.getElementById('iframe');
     iframe.src = ifSrc;
    }
})();

</script>

Поместите это в конец документа, и оно должно работать так, как вы ожидаете.Еще одна вещь, которую вы, возможно, захотите попробовать - вместо вызова этой функции для документа ready, сделайте это для функции #iframe ready:

$('#iframe').ready(function(){ 
    if(ifSrc)
        $("#iframe").attr('src', ifSrc);
});
...