Как определить, может ли браузер открывать сетевую папку внутри iframe?

Мне нужно предупредить пользователей, просматривающих Chrome, что им нужно открыть страницу с помощью IE, так как это позволяет открывать сетевую папку внутри iframe.

Но я не хочу определять браузер, есть ли способ обнаружить эту функцию?

1 ответ

Решение

Нет, вы не можете обнаружить эту функцию (если вы можете назвать ее так, разрешить веб-страницам отображать локальные папки во фрейме - очень плохая идея). Политика того же происхождения не позволяет вам узнать, что было загружено во фрейм, поэтому вы не можете отличить сетевую папку от страницы ошибки. Лучше всего проверить, сколько времени занимает загрузка кадра:

var start = new Date().getTime();
var frame = document.createElement("iframe");
frame.addEventListener("load", function()
{
  if (new Date().getTime() - start < 100)
    alert("Looks like the network folder didn't load, try using a less secure browser?");
}, false);
frame.src = "file://mynetworkpath/folder";
document.body.appendChild(frame);

В моих тестах Chrome потребовалось около 30 миллисекунд для загрузки страницы с ошибкой, приведенный выше код устанавливает 100 миллисекунд в качестве порога, чтобы быть уверенным. Загрузка сетевой папки всегда должна занимать значительно больше времени. Этот код не работал в Firefox 30, по некоторым причинам load событие там не состоялось. Это может быть мерой безопасности, но я не знаю этого.

Кроме того, вы можете попробовать загрузить изображение, о котором известно, что оно существует:

var img = new Image();
img.onload = function()
{
  // Can display the frame
};
img.onerror = function()
{
    alert("Try using a less secure browser?");
};
img.src = "file://mynetworkpath/folder/pixel.gif";

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