Как насчет:
input.type = "text";
input.type = "file";
Мне все еще нужно понять, почему это не работает с webkit.
В любом случае, это работает с IE9>, Firefox и Opera. Ситуация с webkit заключается в том, что я, похоже, не могу изменить ее обратно в файл. В IE8 ситуация заключается в том, что она выдает исключение безопасности.
Изменить: для webkit, Opera и firefox это работает, хотя:
input.value = '';
(проверьте выше ответ с этим предложением)
Я посмотрю если я могу найти более чистый способ сделать этот кросс-браузер без необходимости использования GC.
Edit2:
try{
inputs[i].value = '';
if(inputs[i].value){
inputs[i].type = "text";
inputs[i].type = "file";
}
}catch(e){}
Работает с большинством браузеров. Не работает с IE & lt; 9, вот и все. Протестировано на firefox 20, chrome 24, opera 12, IE7, IE8, IE9 и IE10.
Попробуйте оператор удаления JavaScript:
function unloadObject(objId) {
var obj = document.getElementById(objId);
obj.parentNode.removeChild(obj);
delete obj;
}
Вызов unloadObject(targetActiveXTagId)
прежде, чем открыть Вашу вторую страницу.
Идеально, необходимо встроить механизм обновления в ActiveX сам. Я видел, что несколько платформ онлайн-игры делают это с хорошими результатами.
Одна вещь, которую можно попробовать, имеет вызов установщика CoFreeUnusedLibraries () , и затем ответьте S_OK в DllCanUnloadNow () в элементе управления ActiveX. Это могло бы разгрузить Вас, хотя интересно, может ли IE все еще попытаться перезвонить в Ваш разгруженный модуль. Достаточно простой попробовать.
Вы могли также просто записать тупиковый DLL, который реализует все Интерфейсы, у Вас есть тот сенсорный IE, и затем просто преобразовывает до Вашего реальный DLL, который на самом деле реализует функциональность. Тогда у Вас мог быть свой установщик, широковещательно передает сообщение, в котором говорится, "разгружают реальный DLL". Тогда Вы широковещательно передаете другое сообщение, когда Ваш сделанный и оно загружают новое. В то время как обновление происходит, Ваш тупик тянет, "Ожидайте, в то время как я обновляю..." сообщение.
Вы попытались использовать JavaScript для уничтожения элемента DOM, в котором живет элемент управления ActiveX? Если Вы сделаете это, то IE скажет управлению разгружаться, но необходимо удостовериться, что управление на самом деле разгрузится. Затем необходимо быть в состоянии поразить страницу более новой ссылкой на объект, которая запустит более новый объект....
Сбой, что, можно попытаться открыть всплывающее окно, которое направляет Вас к странице, которая никогда не загружает Ваш объект, и в то же время, с помощью именованной ссылки на основной браузер, перенаправьте его к странице, которая не ссылается объект, давая ему шанс разгрузиться, затем повторно ссылаясь обновленный ActiveX. Это должно загрузить Ваше более новое управление.
Это - липкая проблема, неважно, какой путь Вы идете, но можно быть в состоянии заставить это делать то, что Вы хотите.
, Если Ваше управление не ведет себя правильно, оно не может разгрузиться правильно, таким образом, это - что-то, которое необходимо не упустить.
Larry
Глупый ответ, извините. Я предполагаю, что перенаправление не работало, если у Вас все еще есть этот открытый вопрос. Если Вы не попробовали tho, просто создаете страницу, которая перенаправляет к Вашей обновленной странице ActiveX и ссылке там вместо этого.
middleman.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>blank page</title>
<meta http-equiv="REFRESH" content="0;url=http://www.newactivexcontrol.com"></HEAD>
<BODY>
</BODY>
</HTML>
Разве Вы не можете изменить рабочий процесс? Проверьте на обновление сначала и избегайте целой проблемы!
Безотносительно решения, которое Вы реализуете, браузером управляют клиент и любой (безопасность), обновления или новые версии могут повредить Вашу систему.
По-видимому, да и нет.
Это может произойти, но только если Вы "Взлом" это через уязвимость системы обеспечения безопасности. Так не посредством любого законного процесса, нет.
Вот статья, описывающая состояние уязвимости: http://www.juniper.net/security/auto/vulnerabilities/vuln16409.html
И вот является статьей об обсуждении Technet, как ActiveX DWORD уничтожает процесс http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q240797&sd=tech
, Это - кавычка от веб-сайта MSDN об элементах управления ActiveX:
"Пользователи не могут непосредственно взаимодействовать со средствами управления Microsoft ActiveX, загруженными АППЛЕТОМ, ВСТРОИТЬ или ВОЗРАЗИТЬ элементам. Пользователи могут взаимодействовать с такими средствами управления после активации их пользовательских интерфейсов". http://msdn.microsoft.com/en-us/library/ms537508.aspx
Хотя я не знаю способа заставить IE выгрузить DLL (он держит хэндл DLL-файла открытым -- я надеюсь, что он освобождает сами объекты корректно. ...) Одним из решений, которое я использую, является копирование DLL во временный файл (основанный на версии Assembly) перед его открытием, а затем явное нарушение IE/COM/какого бы то ни было кэширования. Таким образом, я могу загрузить "новую" версию, даже если старые дескрипторы DLL остаются открытыми.
Я смог нарушить кэширование только тогда, когда все из них встретились:
Я разрабатываю для Sidebar Gadget, так что я могу сделать это только с некоторыми привилегированными ActiveX компонентами, удобными для работы со сценариями, но компонент ActiveX с предустановленным (не обновленным) интерфейсом также может быть способен сделать эту работу.
Я полагаюсь на .NET/mscoree.dll для работы с COM-файлами, так что может быть более чистый метод, переходящий на более низкий уровень.
Различная "версионность" обрабатывается с временной нагрузкой в структуре HKCU\Software\Classes.
.