セキュリティ上の理由から、Javascriptがファイルシステムにデータを書き込めないことは知っています。 Javascriptでデータをローカルに保存する唯一の方法はcookieまたはlocalStorage
であるとよく読んでいます。
ただし、ファイルにアクセスする非常に特殊なケースでは、、データを書き込むためにlocally(インターネット経由ではない) locally? (サーバー言語なし、サーバーなしでも... HTMLファイルのローカルブラウジングのみ)
たとえば、[〜#〜] save [〜#〜] here on this page ...
... HTMLファイルが新しいコンテンツで上書きされること(つまり、localHTMLファイルは、[〜#〜] save [〜#〜]が押されたときに更新する必要があります)。
これは、HTMLページにアクセスするときにJavascriptのおかげでファイルを保存することは可能ですか?locally?(
注:静かに保存できるようにしたい、ユーザーがどこで選択するかを選択するダウンロード/保存ダイアログボックスを提案しないダウンロードしてから、「上書きしてもよろしいですか」など
[〜#〜] edit [〜#〜]:なぜこの質問ですか?サーバーなしでローカルに実行できるHTML/JSメモ帳を実行できるようにしたいです(Apache、PHPなし)。 「どこでファイルをダウンロードしますか?」というダイアログボックスに対処することなく、簡単に保存できる必要があります。
W3CファイルAPI標準からの正解:
ユーザーエージェントは、上記の機能を公開するスクリプトに公開されるAPIを提供する必要があります。ユーザーは、ファイルシステムとの対話が発生するたびにUIによって通知され、ユーザーはトランザクションをキャンセルまたは中止できます。ユーザーにはファイルの選択が通知され、これらをキャンセルできます。これらのAPIへの呼び出しは、ユーザーの介入なしにサイレントに発生しません。
基本的に、セキュリティ設定により、ファイルをダウンロードするたびに、ブラウザはユーザーが実際にファイルを保存することを確認します。ブラウザは、コンピューター上のJavaScriptとWebサーバーのJavaScriptを実際に区別しません。唯一の違いは、ブラウザがファイルにアクセスする方法です。したがって、ページをローカルに保存しても違いはありません。
回避策:ただし、<div>
クッキー内。ユーザーが戻ってきたら、Cookieから読み込むことができます。ファイルをユーザーのコンピューターに正確に保存するわけではありませんが、ファイルを上書きするのと同じ効果があります。ユーザーが戻ると、最後に入力した内容が表示されます。欠点は、ユーザーがWebサイトのデータを消去すると、情報が失われることです。ローカルストレージをクリアするというユーザーのリクエストを無視することはalsoセキュリティ上の問題なので、実際に回避する方法はありません。
ただし、次のこともできます。
Cookieの使用:あなたはcanローカルページでJavaScript Cookieを使用します。これをファイルに入れてブラウザで開きます:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<p id="timesVisited"></p>
<script type="text/javascript">
var timesVisited = parseInt(document.cookie.split("=")[1]);
if (isNaN(timesVisited)) timesVisited = 0;
timesVisited++;
document.cookie = "timesVisited=" + timesVisited;
document.getElementById("timesVisited").innerHTML = "You ran this snippet " + timesVisited + " times.";
</script>
</body>
</html>
Blob関数を使用するだけです:
function save() {
var htmlContent = ["your-content-here"];
var bl = new Blob(htmlContent, {type: "text/html"});
var a = document.createElement("a");
a.href = URL.createObjectURL(bl);
a.download = "your-download-name-here.html";
a.hidden = true;
document.body.appendChild(a);
a.innerHTML = "something random - nobody will see this, it doesn't matter what you put here";
a.click();
}
ファイルが保存されます。
はい、可能です。
あなたの例では、すでに ContentEditable を使用しています。その属性のチュートリアルのほとんどには、何らかのlocalStrorageの例があります。 http://www.html5tuts.co.uk/demos/localstorage/
ページのロード時に、スクリプトはlocalStorageでデータをチェックし、trueの場合は要素を設定する必要があります。コンテンツの変更は、保存ボタンをクリックするとlocalStorageに保存できます(リンクされた例では、ぼかしとフォーカスを使用して自動的に)。さらに、このスニペットを使用して、天気ユーザーがオンラインかオフラインかを確認し、状態に基づいてロジックを変更できます。
// check if online/offline
// http://www.kirupa.com/html5/check_if_internet_connection_exists_in_javascript.htm
function doesConnectionExist() {
var xhr = new XMLHttpRequest();
var file = "http://www.yoursite.com/somefile.png";
var randomNum = Math.round(Math.random() * 10000);
xhr.open('HEAD', file + "?rand=" + randomNum, false);
try {
xhr.send();
if (xhr.status >= 200 && xhr.status < 304) {
return true;
} else {
return false;
}
} catch (e) {
return false;
}
}
EDIT:localStorageのより高度なバージョンはMozillaです localForage これは文字列以外の他のタイプのデータを保存できます。
ファイルを保存し、FileSystem-APIとwebkitを使用して永続化することができます。 chromeブラウザーを使用する必要があります。これは標準テクノロジーではありませんが、ユーザーが望んでいるとおりに機能すると思います。 http://www.noupe.com/design/html5-filesystem-api-create-files-store-locally-using-javascript-webkit.html
そして、そのトピックを示すために、ファイルを永続的に保存する方法を示すことから始めます...
window.webkitRequestFileSystem(window.PERSISTENT , 1024*1024, SaveDatFileBro);
HTMLコンテンツをデータURI文字列に変換し、アンカー要素のhref
属性として設定します。 download
属性としてファイル名を指定することを忘れないでください。
以下に簡単な例を示します。
<a>click to download</a>
<script>
var anchor = document.querySelector('a');
anchor.setAttribute('download', 'example.html');
anchor.setAttribute('href', 'data:text/html;charset=UTF-8,<p>asdf</p>');
</script>
ブラウザで試してみてください。サーバーは必要ありません。
https://github.com/firebase/firepad を使用するだけです— 実際の動作を見る
これは、コンピューターにサーバーを必要とせず、データをリモートで保存して保存します。
このコンテキストでサーバーとクライアントの違いを明確にすることが重要だと思います。
クライアント/サーバーは、あるプログラム(クライアント)が別のプログラム(サーバー)からサービスまたはリソースを要求するプログラム関係です。
ソース: http://searchnetworking.techtarget.com/definition/client-server
少なくとも1つのサーバー/クライアント関係を持たない高度なアプリケーションがあまりにも多く見つかるかどうかはわかりません。 プログラムが別のプログラムと話すときは常にクライアント/サーバー関係であるため、サーバーなしでこれを達成するように依頼するのはやや誤解を招く可能性があります、リクエスターはクライアントであり、応答はサーバーから送信されます。これは、ローカルで作業している場合でも同様です。ブラウザの範囲外で何かをしたい場合は、サーバーにフックが必要です。
さて、それはサーバー側の特定の言語なしではこれを達成できないという意味ではありません。たとえば、 このソリューション は、サーバーにNodeJSを使用します。 WinJSにはWinJS.xhrがあり、これは XmlHttpRequest を使用してサーバーにデータを提供します。
AJAXは、同じ種類の機能を提供しようとしています。ここでのポイントは、「save file」などのコマンドを発行すると、プログラムがあるか、何らかのフックが事前に構築されているか、ファイルは実際に保存されます。サーバー側の言語であろうと他のものであろうと、ファイルを解析するプログラムが反対側にあります。つまり、リクエストを受信するサーバーなしではこの関数のようなものを持つことはできないでしょう。
これをご覧ください:) Javascript/jQueryを使用してファイルをダウンロード 必要なものはすべて揃っているはずです。それでも助けが必要な場合、またはそれが必要な解決策ではない場合は、教えてください;)
JsPDFを使用-> https://github.com/MrRio/jsPDF
<div id="content">
<h3>Hello, this is a H3 tag</h3>
<p>a pararaph</p>
</div>
<div id="editor"></div>
<button id="cmd">generate PDF</button>
Javascript
var doc = new jsPDF();
var specialElementHandlers = {
'#editor': function (element, renderer) {
return true;
}
};
$('#cmd').click(function () {
doc.fromHTML($('#content').html(), 15, 15, {
'width': 170,
'elementHandlers': specialElementHandlers
});
doc.save('sample-file.pdf');
});
はい、可能です。例による証明:
TiddlyFox:は、アドオンを介してローカルファイルを変更できます。 ( ソースコード )( 拡張ページ ):
TiddlyFoxは、Mozilla Firefoxの拡張機能で、TiddlyWikiがファイルシステムに変更を直接保存できるようにします。
Todo.html:編集を自分自身に保存するHTMLファイル。現在、Internet Explorerでのみ機能し、最初にファイルを開くときにいくつかのセキュリティダイアログを確認する必要があります。 ( ソースコード )( 機能デモ )。
Todo.htmlが実際に変更をローカルに保存することを確認する手順:
todo add TEST
(todo.htmlは todo.txt-CLI のコマンドラインインターフェイスをエミュレートします)警告:クロスプラットフォームの方法はありません。これらのメソッドがどれくらい長く存在するかはわかりません。最初にtodo.htmlプロジェクトを開始したとき、 twFile というjQueryプラグインがあり、4つの異なるメソッド(ActiveX、Mozilla XUL、Javaアプレット、Java Live Connect)。ActiveXを除き、ブラウザはセキュリティ上の懸念からこれらすべてのメソッドを許可していません。