Нужна помощь со сценарием всплывающего окна jquery/javascript - появляется странная ошибка в Internet Explorer

Я пытаюсь создать сценарий jquery, который откроет новое окно браузера (всплывающее окно) для почтового приложения (пользователь может дважды щелкнуть по почте, и они откроются в новом окне).

Это не особенно сложно. Моя проблема в том, что я хочу отслеживать открытые окна, чтобы, если пользователь дважды щелкнул один и тот же почтовый элемент во второй раз, он просто установил фокус на уже открытом всплывающем окне и не перезагружал его.

У меня он работает в Firefox, но Internet Explorer возвращает следующую ошибку:

Line: 51
Error: The interface is unknown.

В частности, это происходит, когда пользователи закрыли всплывающее окно, а затем дважды щелкнули по почтовому элементу, чтобы открыть его снова.

Мои навыки javascript/jquery в лучшем случае рудиментарны, поэтому я надеюсь, что кто-нибудь здесь может помочь. Вот код скрипта.

(function($)
{
    var _popupTracker = {}
    var _popupCounter = 0;
    $.fn.openPopupWindow = function(options)
    {
        var defaults = {
            height: 600, // sets the height in pixels of the window.
            width: 600, // sets the width in pixels of the window.
            toolbar: 0, // determines whether a toolbar (includes the forward and back buttons) is displayed {1 (YES) or 0 (NO)}.
            scrollbars: 0, // determines whether scrollbars appear on the window {1 (YES) or 0 (NO)}.
            status: 0, // whether a status line appears at the bottom of the window {1 (YES) or 0 (NO)}.
            resizable: 1, // whether the window can be resized {1 (YES) or 0 (NO)}. Can also be overloaded using resizable.
            left: 0, // left position when the window appears.
            top: 0, // top position when the window appears.
            center: 0, // should we center the window? {1 (YES) or 0 (NO)}. overrides top and left
            createnew: 0, // should we create a new window for each occurance {1 (YES) or 0 (NO)}.
            location: 0, // determines whether the address bar is displayed {1 (YES) or 0 (NO)}.
            menubar: 0 // determines whether the menu bar is displayed {1 (YES) or 0 (NO)}.
        };

        var options = $.extend(defaults, options);

        var obj = this;

        // center the window
        if (options.center == 1)
        {
            options.top = (screen.height - (options.height + 110)) / 2;
            options.left = (screen.width - options.width) / 2;
        }

        var parameters = "location=" + options.location +
                         ",menubar=" + options.menubar +
                         ",height=" + options.height +
                         ",width=" + options.width +
                         ",toolbar=" + options.toolbar +
                         ",scrollbars=" + options.scrollbars +
                         ",status=" + options.status +
                         ",resizable=" + options.resizable +
                         ",left=" + options.left +
                         ",screenX=" + options.left +
                         ",top=" + options.top +
                         ",screenY=" + options.top;

        // target url
        var target = obj.attr("href");       

        // test if popup window is already open, if it is, just give it fokus.        
        var popup = _popupTracker[target];
        if (options.createnew == 0 && popup !== undefined && !popup.closed)
        {            
            popup.focus();
        } 
        else
        {
            var name = "PopupWindow" + _popupCounter;
            _popupCounter++;

            // open window
            popup = window.open(target, name, parameters);            
            _popupTracker[target] = popup;
            _popupTracker[target].focus();
        }

        return false;
    };        
})(jQuery);

Строка кода, которая дает мне ошибку:

if (options.createnew == 0 && popup !== undefined && !popup.closed)

Спасибо, Эгиль.

ОБНОВЛЕНИЕ: оказалось, что на самом деле это особенность IE8, по крайней мере, версии в бета-версии Windows 7. Я создал тестовую страницу (http://egil.dk/popuptest/popup-source.htm) и, похоже, работает так, как ожидалось от моих коллег в IE7. Га, время потрачено впустую!

ОБНОВЛЕНИЕ 2: я, вероятно, должен сказать, как воспроизвести ошибку. Перейдите на страницу http://egil.dk/popuptest/popup-source.htm, нажмите на одну из ссылок, т.е. «что-то 1», после завершения загрузки всплывающего окна, вернитесь к родительскому окну и снова нажмите на ту же ссылку. На этот раз всплывающее окно просто снова получит фокус, а НЕ перезагрузится (это намеренно и то, что я хочу). Теперь закройте всплывающее окно, а затем снова нажмите на ту же ссылку. Это приводит к ошибке в бета-версии IE8. В Firefox он корректно переоткрывается.


person Egil Hansen    schedule 03.02.2009    source источник
comment
+1 за этот милый маленький плагин. Ваше здоровье.   -  person karim79    schedule 16.03.2010


Ответы (3)


Единственное, что я заметил, это то, что у вас есть лишняя запятая после строки меню по умолчанию. После удаления последней запятой у меня все заработало в IE7. Какая версия, если IE дает вам эту проблему?

person bendewey    schedule 03.02.2009
comment
Да, я думаю, что IE сходит с ума от этой дополнительной запятой. - person Chetan S; 03.02.2009
comment
О, и, кстати, я использую версию IE8, которая есть в Windows 7. - person Egil Hansen; 04.02.2009
comment
У меня дома Win7 и IE 8 посмотрю по ссылке. Я определенно пропустил эти запятые в прошлом, потратил много времени впустую, так что не расстраивайтесь. - person bendewey; 04.02.2009
comment
Я не думаю, что это проблема с запятой. Я все еще получаю ошибку без запятой, но только в IE8 (версия 8.0.7000.0). Печально то, что Microsoft не позволяет нам на Windows 7 получить только что выпущенную версию RC1. Спасибо за вашу помощь. - person Egil Hansen; 04.02.2009

Следующее, кажется, работает для меня. Если кто-то может улучшить его, пожалуйста!

В Firefox всплывающее окно просто получает фокус, если оно открыто. В IE8 перехватывается ошибка «интерфейс неизвестен», и вместо этого всплывающее окно закрывается и снова открывается. Во всех случаях строка window.open загружает текущую «страницу» во всплывающее окно.

var bigimg;  // set this variable outside the function so the first time 
             // the popup opens, bigimg is a defined variable and the if's don't choke.

function popupbigpic(page) 
  {
  try
    {
    if(window.focus && bigimg) bigimg.focus(); 
    }
  catch(err)
    {
    if(bigimg) bigimg.close();
    }
  bigimg = window.open(page,"popup","width=670,height=665,toolbar=no");
  }
person Lisa    schedule 26.08.2010

У меня была проблема с IE 8, из-за которой window.open не работал, я просто заменил имя окна на null, я получил идею от http://msdn.microsoft.com/en-us/library/ms536651.aspx

window.open ("Sample.htm", null, "высота = 200, ширина = 400, статус = да, панель инструментов = нет, панель меню = нет, местоположение = нет");

person Community    schedule 03.04.2009