Uncaught TypeError: Не удается прочитать свойство 'fancybox' из неопределенного - ошибка только в Google Chrome? - PullRequest
1 голос
/ 28 октября 2011

Я использую fancybox для отображения iframe и закрытия его при нажатии кнопки. Это только для целей тестирования. Функция закрытия работает в IE и FF, но не в Chrome.

    <title>Test</title>

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    <script type="text/javascript" src="fancybox/jquery.fancybox-1.3.4.pack.js"></script>
    <link rel="stylesheet" href="fancybox/jquery.fancybox-1.3.4.css" type="text/css" media="screen" />

    <link rel="stylesheet" type="text/css" href="default.css" />
    <link rel="stylesheet" type="text/css" href="default2.css" />

</head>
<body id="editadd">
    <h1>Create</h1>
    <div class="centered">
        <fieldset>
        <legend>Details</legend>
            <p>Name:    <input type="text" /></p>
        </fieldset>
        <fieldset>
            <legend>Add Assignments</legend>
            <p>stuff</p>
                        <input type="text" value="stuff" />

            <br />
        </fieldset>
        <br />
        <input type="submit" OnClick="parent.$.fancybox.close();" value="Save"/>
        <input type="submit" OnClick="parent.$.fancybox.close();" value="Cancel"/>
    </div>
</body>

После нажатия кнопки «Сохранить» или «Отмена» ничего не происходит (оно закрывается в FF и IE и возвращает фокус на предыдущую страницу). Я посмотрел на консоль Javascript в Chrome, чтобы увидеть, что происходит, и ошибка:

Uncaught TypeError: Невозможно прочитать свойство 'fancybox' из неопределенного (анонимная функция) OnClick

Я также пробовал "javascript: window.parent. $. Fancybox.close ();" вместо. Я не могу спросить в группах Google (где находится форум fancybox), потому что по какой-то причине он заблокирован в кампусе.

Ответы [ 2 ]

2 голосов
/ 28 октября 2011

У вас проблемы с Одинаковой политикой происхождения : страница в рамке обслуживается на другом хосте, чем родительское окно. Мой ответ состоит из двух решений:

  1. Присоединение и обработка события onload в <iframe>, http://jsfiddle.net/BYssk/1/
  2. Использование window.postMessage (см. Нижнюю часть ответа, рекомендуется) , http://jsfiddle.net/5fGRj/1/

Чтобы справиться с этим, вы можете использовать один из следующих методов. Оба метода требуют перезагрузки страницы во фрейме, когда она должна быть закрыта. Это может быть достигнуто путем отправки формы. Нет обработчиков onclick. Предварительный просмотр обоих методов: http://jsfiddle.net/BYssk/1/

1. Если ваш iFrame встроен в страницу:

<script>
var fancyboxClose = (function(){ //Define a function
    var loaded = 0;    //Define a local, "PRIVATE" counter
    return function(){ //Define a public method 
        // Increases the counter by one, modulo 2:
        //   Every "first" time, the "loaded++" returns an even number -> false
        //   When the page reloads again, the fancybox is submitted. The counter
        //      increases again -> odd number => modulo 2 = 1 => true
        if(loaded++ % 2) $.fancybox.close();
    }
})();
</script>
<iframe src=".." onload="fancyboxClose()"></iframe>

2. Если ваш iFrame создается динамически:

//The code below is executed inside some function. Definitely NOT globally
var loaded = 0;
$("<iframe>")                // Create frame
    .load(function(){        // Bind onload event
        if(loaded++ % 2) $.fancybox.close();
    })
    .attr("src", "...")      // Set src attribute
    .appendTo("body");       // Append the iframe, anywhere. For example: <body>

Двигатель этого метода:

  1. Когда содержимое фрейма загружено, запускается событие onload (1).
  2. Когда пользователь отправляет форму или покидает страницу внутри фрейма, запускается другое событие onload (2).
  3. Скрипт ничего не делает на первом onload событии. Однако во втором событии onload скрипт вызывает метод $.fancybox.close().

<ч />

Альтернативный метод

Другой метод состоит в использовании современного метода window.postMessage. Это намного надежнее, чем предыдущий метод, и поддерживается во всех современных браузерах. Скрипка: http://jsfiddle.net/5fGRj/1/

Скрипт в главном окне:

function closeFancyBox(){
    $.fancybox.close();
}
window.addEventListener("message", closeFancyBox, false);

Необходимый код внутри оформленной страницы:

<script>
function initiateClose(){
    parent.postMessage("Close fancybox please.", "*");
    // * should be more specific, for security reasons
    // See https://developer.mozilla.org/en/DOM/window.postMessage
}
</script>
PostMessage method<br />

<input type="submit" value="Inititate 'close'" onclick="initiateClose()">
0 голосов
/ 05 июня 2013

Проблема в jquery 1.9.1 и старом fancybox. либо используйте fancybox 1.3.xx с jquery 1.8.x

или просто обновите последнюю версию fancybox 2.1.x http://www.fancyapps.com/fancybox/#license

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...