JavaScript передающие данные из дочернего окна для порождения окна, ошибки IE?

Тип Message () является псевдонимом для следующей записи:

{ code : String
, body : ()
}

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

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

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

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

В этом случае нам нужно подумать, каким должен быть тип телосложения. Хотя мы могли бы использовать пустые String для сообщений с пропущенными телами, их было бы легко спутать с сообщениями с пустыми телами. Мы также могли бы использовать Bool, но тогда нам нужно было бы решить, хотим ли мы использовать True или False для пропущенного значения. Наконец, мы можем использовать пустой кортеж ; поскольку оно имеет только одно возможное значение, оно идеально для нас.

На самом деле есть еще одна возможность: мы могли бы создать type alias MessageWithoutBody = { code: String }. В некоторых случаях это чище (особенно если вам нужно пропустить больше полей), но может быть более подробным, поскольку вам нужно дублировать все поля, которые вы хотите сохранить.

7
задан mtourne 24 April 2009 в 00:34
поделиться

2 ответа

Не совсем точно знаю, что вы испытываете, но я успешно регулярно храню данные об открывателе из дочернего всплывающего окна в IE (6,7 и 8) в приложениях для разработки и производства.

У вас есть URL? или еще какой-нибудь исходный код, который вы можете предоставить?

в соответствующей заметке ... вы не пытаетесь определить тип объекта на открывателе ... из всплывающего окна, не так ли? - в этой области есть некоторые известные ошибки IE.

Обновление:

Вот краткий пример ...

<!--main window-->
<script>
  function getThing(id){
    url = 'http://mysite.com/...whatever...';
    features = 'locationbar=X,menubar=Y...';
    window['popup4'+id] = open(url, 'someNameWithoutSpaces', features);
  }
  function popupCallback(data){
    alert('I got data back! ' + data);
    document.getElementById('someID').innerHTML = '<b>' + data.label + ' (' + data.id + ')</b>';
    //close the popup (now that we have/are done with the data)
    window['popup4someID'].close();
  }
</script>
<div id="someID">{Nothing Selected Yet}</div>
<input type="button" value="Pick One" onclick="getThing('someID');"/>

<!--popup window-->
<script>
  function saveSelection(){
    //acquire data however you want/need
    var selData = {};
    selData.id = 123456;
    selData.label = 'iPod Touch (Jeff Atwood Edition)';
    //call callback on opener
    window.opener.popupCallback(selData);
  }
</script>

Обновление 2

При тестировании выясняется, что в IE7 IE8 (но не IE6) после закрытия всплывающего окна все справочные данные теряются (ссылки не захватить снимок), поэтому, если вам нужны данные после закрытия всплывающего окна, вам нужно будет их клонировать.

Я подумал, что если данные можно обернуть в массив, клонирование - это просто. Просто вызовите .slice (), чтобы скопировать его, , но ... это тоже не работает !

Я думаю, вам нужно сохранить нужные значения (либо для формирования элементы, или DOM), поскольку IE не выглядит так, как он позволяет вам использовать их после закрытия всплывающего окна. : - (

Похоже, это позволит вам использовать их после закрытия всплывающего окна. : - (

Похоже, это позволит вам использовать их после закрытия всплывающего окна. : - (

6
ответ дан 7 December 2019 в 05:30
поделиться

В итоге я сделал это путем json-кодирования сложного объекта, который я хотел передать родителю во всплывающем окне. Возвращаемые данные представляют собой простую строку, которую можно без проблем скопировать. На родительской стороне строка в кодировке json оценивается как объект Javascript.

2
ответ дан 7 December 2019 в 05:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: