Вот этим навеяло habrahabr.ru/blogs/javascript/66242
Вопреки расхожему мнению ИЕ все таки умеет назначать аксессоры, правда только в VB, чего для некоторых задач вполне достаточно.
Другими словами аксессоры есть в VB, VB есть во всех IE и пространство имен VB и JS общее, можно пользовать.
Для моей задачи хватило вот такой обертки:
К сожалению не без ложки дегтя, присваиваемые значения могут быть только скалярными, любые объекты приведут к ошибке:
Вообще не знаток VB и тонкостей его реализации, возможно эту проблему можно как то обойти?
UPD: Присваиваемые значения могут быть не только скалярными, спасибо keksn, для этого Accessor должен быть объявлен следующим образом:
Вопреки расхожему мнению ИЕ все таки умеет назначать аксессоры, правда только в VB, чего для некоторых задач вполне достаточно.
<script language="vbscript">
' Объявляем класс, экземпляр которого в последствии будем использовать из яваскрипта
Class Accessor
Public Property Let hook(val) ' объявляем сеттер для свойства hook класса Accessor
MsgBox val
End Property
End Class
Dim access ' объявление переменных в VB обязательно
Set access = New Accessor ' создаем экземпляр класса Accessor
</script>
<script language="jscript">
// т.к. у VB и JS общее пространство имен, можно вполне использовать созданный ранее access
access.hook = 'ololo';
</script>
* This source code was highlighted with Source Code Highlighter.
Другими словами аксессоры есть в VB, VB есть во всех IE и пространство имен VB и JS общее, можно пользовать.
Для моей задачи хватило вот такой обертки:
<script>
// Если в документе первым будет идти блок VB, то все остальные скрипты без атрибута language IE будет обрабатывать как VB
</script>
<script language="vbscript">
Class Accessor
Public Property Let hook(val)
propset val ' при изменении свойства hook будет вызывать яваскриптовую функцию propset
End Property
End Class
Dim access
Set access = New Accessor
</script>
<script>
function propset(val) { // тут будем обрабатывать новые значения
alert(val);
}
if(/*@cc_on!@*/true) { // для остальных браузеров объявим аналог Accessor средствами javascript
access = {};
access.__defineSetter__('hook', function(val) {propset(val)})
}
access.hook = 'hi'; // и наконец проверяем работоспособность сеттера
</script>
* This source code was highlighted with Source Code Highlighter.
К сожалению не без ложки дегтя, присваиваемые значения могут быть только скалярными, любые объекты приведут к ошибке:
access.hook = {}; // Ошибка: Объект не поддерживает это свойство или метод
* This source code was highlighted with Source Code Highlighter.
Вообще не знаток VB и тонкостей его реализации, возможно эту проблему можно как то обойти?
UPD: Присваиваемые значения могут быть не только скалярными, спасибо keksn, для этого Accessor должен быть объявлен следующим образом:
Class Accessor
Public Property Let hook(val)
propset val
End Property
Public Property Set hook(val)
propset val
End Property
End Class
Dim access
Set access = New Accessor
* This source code was highlighted with Source Code Highlighter.