«Невозможно выполнить код из освобожденного скрипта» в IE8, используя Javascript с Prototype - PullRequest
3 голосов
/ 24 января 2011

Это мой первый вопрос, так что вот так ...

У меня есть проблема в IE8, где у меня есть всплывающая форма (window.showDialog()), используемая для редактирования информации о квитанции в системе учета.

Это работало нормально, пока мне не пришлось добавлять больше контента, добавляя динамически построенную таблицу полей ввода. Я получаю информацию обратно в массив, однако, там, где моя ошибка, кажется, происходит. var pinputs = []; - вот что, кажется, вызывает проблему.

функция js во всплывающей форме:

function saveForm() {
if($('user_id')){
    var user_id = $F('user_id');
} else {
    var user_id = 0;
}
var payments = $$('.payment');
var pinputs = [];
for(var i=0; i<payments.length; i++){
    pinputs.push($F(payments[i]));
}
window.returnValue = {received_of: $F('received_of'), user_id: user_id,
                    note: $F('note'), work_date: $F('work_date'), payment: pinputs};
window.close();
}

Функция js в родительском файле js:

function modifyReceiptInformation(id) {
return window.showModalDialog('mod.php?mod=receipts&mode=receipt_edit_popup&wrapper=no&receipt_id=' + id, 'Modify Receipt',"dialogWidth:600px;dialogHeight:500px");
}

Я уже обнаружил подобную ситуацию здесь, но это было связано с вызовом функций из дочерней формы, чего я здесь не делаю. Возможно я не понял решение? Я не эксперт по JS, поэтому любой вклад будет полезен.

- Edit -

Забыл также добавить сюда, что var payments = $$('.payment'); - это массив полей ввода в моем файле шаблона.

Ответы [ 2 ]

4 голосов
/ 19 марта 2011

У меня была такая же проблема, поэтому я написал эту удобную функцию, чтобы обойти эту проблему.

// The array problem is when modalDialogue return values are arrays.  The array functions
// such as slice, etc... are deallocated when the modal dialogue closes.  This is an IE bug.
// The easiest way to fix this is to clone yourself a new array out of the remnants of the old.
//
// @param[in] ary
//   The array, which has been passed back from a modal dialogue (and is broken) to clone
// @returns
//   A new, unbroken array.
function cloneArray(ary) {
    var i;
    var newAry = [];
    for(i=0; i<ary.length; i++){
        if(Object.prototype.toString.call(ary[i]) == '[object Array]') {
            newAry.push(cloneArray(ary[i]));
        } else{
            newAry.push(ary[i]);
        }
    }
    return newAry;
}

Тогда вы можете использовать его таким образом:

var selectedAry = window.showModalDialog("Window.jsp", inputAry, "dialogWidth:900px; dialogHeight:700px; center:yes; resizable: yes;");
var newAry = cloneArray(selectedAry);
4 голосов
/ 24 января 2011

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

Итак, у вас есть несколько вариантов:

  • not closeвсплывающее окно из скрипта всплывающего окна.Заставьте ваш родительский обработчик делать то, что ему нужно, с массивом (например, клонировать его в собственный массив, например, с помощью [].concat(popupArray)), а затем закрыть его.

  • преобразовать ваш массив в строку, чтобы пересечь границу popup / parent.JSON.stringify()/JSON.parse() будет хорошо работать, если вы не заботитесь о IE6 / 7.Таким образом, вы все равно можете закрыть всплывающее окно из скрипта всплывающего окна (очевидно, строковые объекты не имеют такой конкретной проблемы с IE.)

...