Краткий ответ: вы не можете и все еще не зависеть от платформы. Большинство браузеров просто не позволяют javascript манипулировать файловой системой.
Тем не менее, вы можете избежать неприятностей, связанных с платформой. Например, IE предлагает функцию execCommand, которую вы можете использовать для вызова SaveAs. Если вы сделали это в IFrame, в котором были данные, которые вы хотели сохранить, вы могли бы заставить их работать - но только в IE. Другие варианты (опять же, я собираюсь использовать Microsoft здесь) включают этот взлом Silverlight или элементы управления ActiveX.
Я думаю, что для полной совместимости с платформой вам просто придется смириться с этим и предоставить возможность загрузки на стороне сервера.
[Изменить]
Упс! Я не проявил должной осмотрительности, когда пошел на поиски ссылок. Оказывается, хак Silverlight, с которым я связан, имеет компонент на стороне сервера. Похоже, ты симпатичный SOL.
[Edit2]
Я нашел хороший обзор совместимости браузера для execCommand здесь . Хотя в нем перечислены вопросительные знаки для команды «saveas», возможно, в конце концов это может быть хорошим способом для вас. Возможно, стоит попробовать?
[Edit3]
Ну, я решил проверить концепцию предложенного мною подхода, и у меня получилось нечто довольно простое в IE. К сожалению, в процессе я доказал, что этот подход не будет работать для Firefox и, похоже, не работает в Chrome / Safari. Так что это очень зависит от платформы. Но это работает! Вот полная рабочая страница:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Javascript File Saver</title>
<script type="text/javascript">
function PageLoad() {
var fdoc = window.frames["Frame"].document;
fdoc.body.appendChild(fdoc.createTextNode("foo,bar,baz"));
}
function Save() {
var fdoc = window.frames["Frame"].document;
fdoc.execCommand("SaveAs", true);
}
</script>
</head>
<body onload="PageLoad();">
<h2>Javascript File Saver</h2>
<iframe id="Frame" style="width: 400px;">Noframe</iframe><br />
<button onclick="Save();">Save</button>
</body>
</html>