Исключение JavaScript «Вызванный объект отключился от своих клиентов».на window.open (...) - PullRequest
2 голосов
/ 12 марта 2012

У меня есть файл JavaScript, прикрепленный к веб-странице с именем «navigate.js». Он содержит коллекцию методов, которые выглядят следующим образом:

var ContractWindow;
function showContract(ContractID){
    try{
         if(ContractWindow){
            if(!ContractWindow.closed){
               ContractWindow.close;
            }
         }

        ContractWindow = window.open(contract.aspx?contractid=" + ContractID, "ContractEditor",
        "toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=1,width=780,height=615");
        }
    }catch(exc){
    alert(exc.message);
    }
}

(существуют аналогичные функции для открытия страниц для редактирования категорий продуктов, продукты, регионы и т. д.)

Каждая из нескольких функций открывает отдельную страницу редактора в своем собственном окне с целью создания только одного окна любого данного типа (гдеtype = "ContractEditor") должен быть открыт в любой момент времени.

Если редактор (в данном случае Редактор контракта) используется повторно, мы сначала хотим закрыть предыдущее окно, чтобы последующее window.open вызвалоновое окно, которое появляется перед любыми окнами (имейте фокус).

Все работает как положено , пока страница не будет простаивать в течение приблизительно 10 минут.После чего предупреждающее сообщение гласит: Вызванный объект отключился от своих клиентов

Различные тесты показали, что исключение происходит из-за присвоения возвращаемого значения window.open переменной ContractWindow,Если я пропущу ContractWindow = и просто позвоню window.open, оно будет работать, но окно не «выскочит» на передний план, что является обязательным требованием.(window.open повторно использует существующее окно с именем «ContractEditor», но не переносит его из стека открытых окон.)

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Несмотря на то, что лучшие ответы, безусловно, приветствуются, я пришел к «обходному пути», который послужит для того, чтобы вывести эту функцию «за дверь», хотя я хотел бы лучше понять причину этого исключения и «лучшее решение»'если он существует.

Определив, что проблема возникает из-за попытки присвоить возвращаемое значение window.open для var ContractWindow, я ввел слой неправильного направления следующим образом:

var ContractWindow;
function showContract(ContractID){
    try{
         if(ContractWindow){
            if(!ContractWindow.closed){
               ContractWindow.close;
            }
         }
        // assign the return of window.open to a 'guaranteed new' variable...
        var newWindow = window.open(contract.aspx?contractid=" + ContractID, "ContractEditor",
        "toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=1,width=780,height=615");
        // then re-assign to the global var ContractWindow.
        ContractWindow = newWindow;
        }
    }catch(exc){
    alert(exc.message);
    }
}

Я думаю, что должно быть что-то другое в том, как JavaScript управляет указателями объектов ... То, что я сделал, «работает», но это не то, что я бы назвал «хорошим» ... Опять же, всегда есть следствие Закон Мерфи :

Если это глупо, но работает, это не глупо.

0 голосов
/ 31 марта 2014

У меня была такая же проблема с моим кодом, попробуйте colne то, что вы получите от window.open, потому что он находится в состоянии open.window.

я использовал jQuery.extend(true, {}, data); для клонирования данных, которые я получаю из window.open. это может работать для вас.

...