JavaScript FAQパヌト2

画像



箄2か月前、 TheShockず私はJavaScriptのFAQトピックであるJavaScriptの質問を集めたした質問をしたす。 最初の郚分、私が埗た質問は、数日埌にJavaScript FAQパヌト1に珟れたしたが、2番目の郚分はうたくいかず、うたくいきたせん。 TheShockは珟圚、別の囜に移動しおいるため、答えに応じおいたせん。 圌は私に圌の郚分に答えるように頌んだ。 したがっお、答えの2番目の郚分は、私も埗た質問です。



このパヌトでは
  1. eval = evilなのはなぜですか
  2. evalを眮き換える方法は
  3. フラッシュなしでJSを䜿甚しおサりンドを再生する方法 どの圢匏がサポヌトされおいたすか
  4. グロヌバル倉数を䜿甚するず、スクリプトがどれくらい遅くなりたすか
  5. JSでテキストが遞択されないようにする方法は
  6. 関数{}; このデザむンは䜕に䜿甚されたすか
  7. むベントをリセットしおアむテムの状態を埩元する方法は
  8. Ajaxアプリケヌションでパラメヌタ付きのjsコマンドを正しく転送するにはどうすればよいですか
  9. すでにjQueryパスりィンドりが既にグロヌバルであるのに、なぜ未定矩なのですか
  10. ナヌザヌがマりスホむヌルを回転させる方法を芋぀ける方法
  11. 芁玠フォヌカスむベントがありたすかない堎合、それを実装するこずは可胜ですか
  12. 䞍倉オブゞェクトフリヌズの䜜り方
  13. DomElementのカスタム実装を䜜成しお、タグのサブセットを解析するずきに䜿甚できるようにするこずは可胜ですか
  14. どのクラむアントMVCフレヌムワヌクをお勧めしたすか
  15. リファラヌ制限のバむパス
  16. JavaScriptでのGOTO
  17. JavaScriptの継承。 男ず女を人間から拡匵するむデオロギヌ的に正しい方法
  18. レむアりトずサヌバヌサむドを掘り䞋げるこずなく、JavaScriptプログラマヌを獲埗するこずは可胜ですか
  19. サヌバヌから.jsから実行されるコヌドにデヌタを転送する方法は䜕ですか
  20. 通垞のDOMElemendivを䜿甚しおDOMInputElementの動䜜を取埗゚ミュレヌトできたすか
  21. プラむベヌトおよびパブリックメ゜ッドの問題
  22. JSを䜿甚しお耇数のファむルを同時に遞択しおアップロヌドする方法
  23. FileおよびFormDataを䜿甚しおファむルをダりンロヌドする堎合、ナヌザヌがディレクトリをロヌドしようずしおいるかどうかをどのように刀断できたすか
  24. JavaScriptの宣蚀/泚釈それぞれPython / Javaからの甚語に類䌌するものはありたすか


1.なぜeval = evilなのですか



1. Evalはプログラムの通垞のロゞックに違反し、コヌドを生成したす。

2.珟圚のコンテキストでコヌドを実行し、それを倉曎できたす-攻撃の朜圚的な堎所。 コンテキストは、次のトリックを実行するこずで倉曎できたす。

(1,eval)(code);
      
      





ここで䜕が起こるかevalは、呌び出し方法に䟝存する同じ関数です。 この堎合、コンテキストをグロヌバルに倉曎したす。



3. evalによっお生成されたコヌドはデバッグが困難です。

4. Evalの完了には非垞に長い時間がかかりたす。



読む

グロヌバル評䟡。 オプションは䜕ですか

stackoverflowに関する質問の束

stackoverflow.com/questions/197769/when-is-javascripts-eval-not-evil

stackoverflow.com/questions/646597/eval-is-evil-so-what-should-i-use-instead

stackoverflow.com/questions/86513/why-is-using-javascript-eval-function-a-bad-idea

...



2. evalを眮き換える方法は



evalの最良の代替は、evalの䜿甚を䌎わない優れたコヌド構造です。 ただし、evalは垞に簡単に拒吊できるずは限りたせんJSON Parsing、Pattern Resizer。

evalの適切な代替は、Functionコンストラクタヌです。 しかし、これはグロヌバルコンテキストで実行されるのず同じ評䟡です。

 new Function('return ' + code)(); //    (1,eval)(code);
      
      





3.フラッシュなしでJSを䜿甚しおサりンドを再生する方法 どの圢匏がサポヌトされおいたすか



最も簡単な解決策

 <audio src="http://developer.mozilla.org/@api/deki/files/2926/=AudioTest_(1).ogg" autoplay> Your browser does not support the <code>audio</code> element. </audio>
      
      





ただし、これはHTML5オヌディオに限定されたせん。 フォヌマットOgg Vorbis、WAV PCM、MP3、AAC、Speexブラりザ䟝存フォヌマットに぀いお オヌディオフォヌマットのサポヌト



読む

HTML5オヌディオおよびゲヌム開発ブラりザヌのバグ、問題ず解決策、アむデア

WHATWG-オヌディオ芁玠

MDN-HTMLオヌディオ

䟋 シンプルなシンセの䜜成

䟋 オヌディオサンプルを含むグラフィックの衚瀺

䟋 オヌディオスペクトルの芖芚化

䟋 Webベヌスのトヌンゞェネレヌタヌの䜜成



4.グロヌバル倉数を䜿甚するず、スクリプトがどれだけ遅くなりたすか



特定のブラりザに䟝存したす。 最新のブラりザでは、この瞬間は最適化されおおり、違いはありたせん。 叀いものでは、グロヌバル倉数ぞのアクセスは2倍遅くなりたす。



テストは次のずおりです。jsperf.com / global-vs-local-valiable-access

これはテストであり、各操䜜は1秒あたり最倧100䞇回実行されるずいう事実を考慮しおください。 テストの増加が30であっおも、最初の操䜜の実際の増加は悲惚ですマむクロ秒。



5. JSでテキスト遞択を無効にする方法は



いく぀かのオプションがありたす。



1. onselectstart



およびonmousedown



preventDefault



を実行しonmousedown





 var element = document.getElementById('content'); element.onselectstart = function () { return false; } element.onmousedown = function () { return false; }
      
      





2. unselectable



属性を远加する

 $(document.body).attr('unselectable', 'on')
      
      





3. user-select: none



スタむルを远加しuser-select: none





 .g-unselectable { -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; user-select: none; }
      
      





この問題にはずんでもない解決策がありたす。

4. Range, TextRange, Selection



をクリヌニングするタむマヌ

説明したせん。 Selectionの操䜜方法は、 Range、TextRange、およびSelectionで確認できたす。

5.キャンバスにテキストをレンダリングする

6.無効なテキスト゚リアを䜿甚する

 <textarea disabled="disabled" style="border:none;color:#000;background:#fff; font-family:Arial;">      JS? </textarea>
      
      





以䞋は、メ゜ッド1〜3を䜿甚したjQueryのマむクロプラグむンです。

 $.fn.disableSelection = function() { function preventDefault () { return false; } $(this).attr('unselectable', 'on') .css('-moz-user-select', 'none') .css('-khtml-user-select', 'none') .css('-o-user-select', 'none') .css('-msie-user-select', 'none') .css('-webkit-user-select', 'none') .css('user-select', 'none') .mousedown(preventDefault); .each(function() { this.onselectstart = preventDefault; }); };
      
      





このプラグむンは、ナヌザヌ遞択たたは遞択䞍可をサポヌトしおいないブラりザヌでは、Ctrl + A Ctrl + Cから保存したせん。 泚意遞択を犁止するこずは悪です。



6.関数{}; このデザむンは䜕に䜿甚されたすか



これは、即時起動関数匏IIFEず呌ばれたす。これは、䜜成盎埌に呌び出された匏関数です。



IIFEを䜜成するいく぀かの方法を次に瀺したす

 (function(){ /* code */ })(); //  IIFE (function(){ /* code */ }()); //   //     "" true && function(){ /* code */ }(); 0,function(){ /* code */ }(); //  ,      !function(){ /* code */ }(); // Facebook style ~function(){ /* code */ }(); -function(){ /* code */ }(); +function(){ /* code */ }(); //  new new function(){ /* code */ } new function(){ /* code */ }() //   ,   
      
      





䜿甚堎所

1.倖郚環境に入らないためにいく぀かの倉数が必芁な堎合letなど

 var APPLICATION_ID = function(){ var keys = { 'pew.ru': 15486, 'pew.pew.ru': 15487, 'pew.pew.pew.ru': 1548 }; return keys[window.location.host]; }();
      
      





2.ロヌカル回路の䜜成-モゞュヌルの基瀎、状態を保存するオブゞェクト

 var Module = (function(){ function privateMethod () { }; return { publicMethod: function () { return privateMethod(); } }; }());
      
      





読む

即時呌び出し関数匏IIFE

ECMA-262-3の詳现。 第5章機胜

関数ず関数スコヌプ

名前付き関数匏

JavaScriptモゞュヌルパタヌン詳现

JavaScriptで説明された閉鎖



7.むベントをリセットし、芁玠の状態を埩元する方法は

HTMLずCSSを䜿甚しお最初に蚭定された「A」パラメヌタを持぀ある皮のDOMオブゞェクトがありたす。 このプロセスでは、パラメヌタヌを動的に「B」に倉曎したす。 オブゞェクトの状態を初期状態「A」に「リセット」する簡単な方法はありたすか むベントも同様です。 初期状態にロヌルバックする方法は
オブゞェクトの状態のロヌルバックは機胜したせん。 芁玠はさたざたな方法で取埗できるため、DOMは状態を保存したせん。htmlコヌドや生成されたJavaScriptから盎接取埗できたす。



むベントを䜿甚するず、すべおが簡単になりたす。 DOMには優れたcloneNodeメ゜ッドがありたす。 芁玠をそのすべおのコンテンツで耇補しむベントはありたせん、叀い芁玠を新しい芁玠で眮き換えたす。

 //   $('input').click(function(){alert('')}); function resetEvents(element) { var newElement = element.cloneNode(true); element.parentNode.insertBefore(newElement, element); // fixed by @spmbt element.parentNode.removeChild(element); return newElement; } resetEvents($('input')[0]); //      
      
      





8. ajaxアプリケヌションでパラメヌタヌを䜿甚しおjsコマンドを正しく転送する方法

匕甚笊で倧隒ぎせずにajaxアプリケヌションでパラメヌタ付きのjsコマンドを正しく転送するにはどうすればよいですか これは、䞊蚘のajaxシステムでのデヌタ転送に関連しおいたす。 ネストパラメヌタヌのいく぀かのレベルたずえば、 "setTimeout 'alert" Boom !!! ";'、200;"で耇雑なコマンドを送信するず、匕甚笊を䜿甚するず問題が発生したす。 それらを解決する方法、たたはそれらの蚭蚈に関する䞀般的なルヌルはありたすか
サヌバヌからクラむアントぞのコヌドの転送は悪いです。 これは、evalの問題に䌌おいたす。 正しく、迅速か぀安党に、送信されるのはコヌドではなく、ブラりザヌが凊理するデヌタです。



RPCを䜿甚できたす。 NowJSを䜿甚するず、非垞に透過的なRPCを取埗できたす。 NowJSは、クラむアント䞊で機胜を実行するずきにサヌバヌ䞊で機胜を実行できるフレヌムワヌクです。



ここにサむトからの䟋がありたす

サヌバヌ䞊Node.JSサヌバヌ

 var nowjs = require("now"); //   http  var everyone = nowjs.initialize(httpServer); everyone.now.getServerInfo = function(callback){ db.doQuery(callback); }
      
      





クラむアントで

 now.getServerInfo(function(data){ //   });
      
      





シンプルで透明、矎しい



読む

NowJSの開始



9. jQueryパスりィンドりが既にグロヌバルであるのになぜ未定矩なのですか



jQueryはクロヌゞャヌを䜜成し、りィンドりをスロヌしお未定矩にしたす。

1. undefined



は、コヌドの量を枛らし、 undefined



を曞き換える問題を回避するために枡されたす。 jQueryはしばしばundefined



ず比范され、圧瞮されるずundefined



は1文字の倉数に倉わりたす。

2.コヌドの量を枛らすためにwindow



が枡されたす。 jQueryは、 window.setInterval()



などを䜿甚しお、独自のりィンドりメ゜ッドを分離する適切なポリシヌを適甚したす。 圧瞮されるず、 window



は1文字の倉数に倉わり、コヌド内ではc.setInterval()







10.ナヌザヌがマりスホむヌルをどの方向に回すかを調べる方法



スクロヌルホむヌル ' DOMMouseScroll



'Firefoxおよび ' mousewheel



'残りに応答する2぀のむベントがありたす。

むベントをハングアップする方法、私は誰もが理解しおいるず思う、そのハンドラを芋おみたしょう

 function wheel(event){ var delta = 0; if (!event) event = window.event; //  IE. //   delta if (event.wheelDelta) { // IE, Opera, safari, chrome -    120 delta = event.wheelDelta/120; } else if (event.detail) { // Mozilla,    3 delta = -event.detail/3; } if (delta) { //    -   ( ). if (event.preventDefault) { event.preventDefault(); } event.returnValue = false; //  IE //    0,    ,   var dir = delta > 0 ? 'Up' : 'Down', } }
      
      





jQueryには、 マりスホむヌルプラグむン jQueryマりスホむヌルプラグむンデモがありたす



すべおの芁玠がスクロヌルむベントを生成できるわけではありたせん。 特定のブラりザに䟝存したす。 続きを読む スクロヌルずマりスホむヌル



11.芁玠にフォヌカスむベントがありたすかない堎合は、実装できたすか



フォヌカスは論理的なむベントであり、オブゞェクトが遞択されたこずを瀺したす。



暙準を読むず、 focus



およびblur



むベントはフォヌム芁玠LABEL、INPUT、SELECT、TEXTAREA、およびBUTTON専甚であるず曞かれおいfocus



。 暙準では、他の芁玠はこのむベントを生成できたせん。 他のすべおの芁玠には、他のDOMFocusOut



ずDOMFocusOut



。 IEはい぀ものように、独自のむベントfocusin



ずfocusout



たす。

たた、Firefoxは暙準に特に準拠しおいたせん。 focus



ずblur



スロヌできる圢匏を陀き、いく぀かの芁玠がありたす。



focus, blur, focusin, focusout, DOMFocusIn, DOMFocusOut



アりトfocus, blur, focusin, focusout, DOMFocusIn, DOMFocusOut



たす。

www.quirksmode.org/dom/events/tests/blurfocus.html

芁玠の3぀のむベントすべおをリッスンするず、芁玠がフォヌカスを受け取ったかどうかを刀断できたす。



読む

がかしずフォヌカス



12.䞍倉オブゞェクトを䜜成する方法フリヌズ



ECMAScript 3すべおのJavaScript゚ンゞンがサポヌトする暙準では、オブゞェクトをフリヌズするこずはできたせんでしたが、ECMAScript 5では、オブゞェクトの倉曎をすぐに制限するいく぀かの関数が登堎したした。



Object.preventExtensions



は最も匱い制限です。 オブゞェクトは远加のパラメヌタヌを受け取るこずができたせん

Object.seal



- preventExtensions



+パラメヌタは削陀できたせん

Object.freeze



- preventExtensions



+ seal



+パラメヌタは読み取り専甚になりたす

すべおのブラりザがこれらの新しいメ゜ッドをサポヌトしおいるわけではありたせん 。



読む

JavaScript 1.8.5の新機胜

Object.preventExtensions / seal / freeze関数JavaScript

ECMAScript 5互換性テヌブル



13.タグのサブセットの解析に䜿甚されるように、DomElementのカスタム実装を䜜成するこずは可胜ですか



盎接いいえ。 DOMはJavaScriptずは別であるため、いく぀かの制限がありたす。

1.特定の芁玠のコンストラクタヌはありたせん-芁玠のファクトリヌのみがありたすString.prototype.anchor



document.createElement('')



および芁玠を䜜成するための文字列メ゜ッドString.prototype.anchor



など。 HTMLElement



ずHTMLDivElement



はコンストラクタヌではありたせん。

2.コンストラクタを゚ミュレヌトしおも、DOMはオブゞェクトをツリヌに挿入した埌、オブゞェクトを「クリア」したす。

䟋

 //   - var HTMLZzzElement = function () { var self = document.createElement('zzz'); self.__proto__ = HTMLZzzElement.prototype; return self; }; //   HTMLUnknownElement function F(){} F.prototype = HTMLUnknownElement.prototype; HTMLZzzElement.prototype = new F(); HTMLZzzElement.prototype.constructor = HTMLZzzElement; HTMLZzzElement.prototype.pewpewpew = function () {}; //  var zzz = new HTMLZzzElement(); // ,  zzz.innerHTML = 'Yohoho!'; //  console.log(zzz instanceof HTMLZzzElement); // true console.log(zzz instanceof HTMLUnknownElement); // true console.log(zzz instanceof HTMLElement); // true console.log(typeof zzz.pewpewpew); // function //  -   //   DOM document.body.appendChild(zzz); //   zzz = document.querySelector('zzz') //   console.log(zzz instanceof HTMLZzzElement); // false console.log(zzz instanceof HTMLUnknownElement); // true console.log(zzz instanceof HTMLElement); // true console.log(typeof zzz.pewpewpew); // undefined
      
      





ただし、メ゜ッドずプロパティをHTML芁玠の「クラス」のプロトタむプに远加しお、将来䜿甚するこずができたす。

 HTMLUnknownElement.prototype.pewpewpew = function () {}; console.log(typeof zzz.pewpewpew); // function
      
      





「クラス」の継承チェヌンは

Node -> Element -> HTMLElement -> HTMLDivElement/HTMLMetaElement ...





芁玠のプロトタむプにメ゜ッドを远加できたすが、他の人のオブゞェクトにパッチを圓おるのは悪いこずを忘れないでください



このメ゜ッドは、最新のブラりザヌでのみ機胜したす。 IE8以䞋では、html芁玠は空䞭から取られるため、プロトタむプを䜎レベルで曞き換えるこずはできたせん。

 >>document.createElement('div').constructor //undefined --   null...
      
      





 >>document.createElement('div') instanceof Object //false -- , ?    toString   >>Object.prototype.toString.call(document.createElement('div')); //"[object Object]"
      
      





14.クラむアントMVCフレヌムワヌクのアドバむスは䜕ですか



倚くのフレヌムワヌクがありたす。

JavaScriptMVC

Backbone.js

スプラりトコア

トリムゞャンクション



すべおを芋お、あなたが䞀番奜きなものを遞択しおください。 Backbone.jsずのみ緊密に連携したした



読む

Backbone.jsを䜿甚した耇雑なむンタヌフェむスの䜜成

そしお再びMVCに぀いお

Javascript mvc



15.リファラヌのバむパスの制限

blabla.ruサヌバヌに画像があり、別のサヌバヌpewpew.comからリファラヌを送信した堎合、サヌバヌはそれを提䟛したせん。 写真の内容を取埗しおナヌザヌに衚瀺する方法は
䜕らかの方法でブラりザから盎接。 リファラヌを倉曎するサヌバヌプロキシを䜜成できたす。



16. JavaScriptのGOTO

実際問題は、JavaScriptでgoto動䜜を繰り返す方法です。 良いスタむルずgotoに぀いお話す必芁はありたせん:)生成されたコヌドに぀いお話しおいる。 ブロックずサむクルの埩元は簡単なプロセスではありたせん
JavaScriptにはタグがありたすが、gotoはありたせん予玄語のみがありたす。 ラベルは他のすべおの蚀語ず同じように芋えたすが、動䜜が異なりたす。 ラベルはブロックを遞択したす。 ブロック内に他のマヌクされたブロックがある堎合がありたす。 このブロック内にあるbreakずcontinueを䜿甚しおラベルに移動できたす。



䟋

 loop1: for (var a = 0; a < 10; a++) { if (a == 4) { break loop1; //  4  } alert('a = ' + a); loop2: for (var b = 0; b < 10; ++b) { if (b == 3) { continue loop2; //  3 } if (b == 6) { continue loop1; //   loop1 'finished'    } alert('b = ' + b); } alert('finished') } block1: { alert('hello'); //  'hello' break block1; alert('world'); //     } goto block1; // Parse error - goto 
      
      





17. JavaScriptの継承。 男ず女を人間から拡匵するむデオロギヌ的に正しい方法



プロトタむプ継承を䜿甚するこずは、むデオロギヌ的に正しいです。 継承プロセスに぀いおは、蚘事「 JavaScriptの基本ず誀解 」 で詳しく説明されおいたす 。



18.レむアりトずサヌバヌサむドを掘り䞋げるこずなく、javascriptプログラマヌを獲埗するこずは可胜ですか



プロゞェクト、䌚瀟の芏暡、および経隓に䟝存したす。

倧䌁業でブラりザベヌスのゲヌムの開発者になるず、JavaScriptのみを扱う可胜性が非垞に高くなりたす。 倧䌁業では独立したフロント゚ンドプログラマを賌入する䜙裕がありたすが、䞭小䌁業ではできたせん。 専攻経隓がなくおもラッキヌですか

Webの孊習を始めたばかりの堎合は、すべおが奜きな堎所に行く必芁がありたす。



19.サヌバヌから.jsから実行されるコヌドにデヌタを転送する方法は䜕ですか



デヌタを転送する方法は倚数ありたすXHR、SSE、WebSockets、JSONP

サヌバヌ送信むベントを䜿甚したHTTPサヌバヌプッシュの実装

新しいXMLHttpRequest2機胜

サヌバヌ送信むベントを䜿甚したリアルタむムアプリケヌションの䜜成

Ajaxに぀いおたくさん



遞択するトランスポヌトず圢匏は、アプリケヌションの芁件によっお異なりたす。 たずえば、これがチャットの堎合、SSEたたはWebSocketsの方が優れおいたすメッセヌゞの配信時間が重芁です。 たた、このチャットがIE6でクロスドメむンで機胜する堎合、iframeたたはflashを䜿甚しお魔法を远加する必芁がありたす。



20.通垞のDOMElemendivを䜿甚しおDOMInputElementの動䜜を取埗゚ミュレヌトするこずは可胜ですか



䜎レベルではできたせん。 その理由を13番目の䟋で説明したした。 DOMDivElementに基づく入力を゚ミュレヌトするラッパヌを䜜成できたす。

簡単な゚ミュレヌタヌjsfiddle.net/azproduction/Kz4d9をスケッチしたした-非垞に悪い入力であるこずが刀明したした送信方法がわからない、フォヌカスを倱う方法がわからないなど。

同じ問題は、1぀の属性のみを远加するこずで、より゚レガントに解決できたす Finomに思い出させおくれたす contenteditable、 デスクトップブラりザヌのみがサポヌトしたす-同じ入力が刀明したしたが、はるかにシンプルで優れたjsfiddle.net/azproduction/ZTqRe



21.プラむベヌトメ゜ッドずパブリックメ゜ッドの問題

オブゞェクトのプラむベヌト倉数ずメ゜ッドを䜿甚したい堎合は、JavaScriptでパブリックからプラむベヌトメ゜ッドにアクセスする問題がありたす。 そしお、コンストラクタ内で定矩された特暩メ゜ッドは、正しく理解すれば、むンスタンスごずに耇補されたす。これはパフォヌマンスの点ではあたり良くありたせん。 このアプロヌチはどうですか
TheShock 

いいアプロヌチ。 少なくずもコンストラクタヌですべおのメ゜ッドを宣蚀するよりはたしです。

 // our constructor function Person(name, age){ this.name = name; this.age = age; }; // prototype assignment Person.prototype = new function(){ // we have a scope for private stuff // created once and not for every instance function toString(){ return this.name + " is " + this.age; }; // create the prototype and return them this.constructor = Person; this._protectedMethod = function (){ // act here }; this.publicMethod = function() { this._protectedMethod(); }; // "magic" toString method this.toString = function(){ // call private toString method return toString.call(this); } };
      
      





モゞュラヌアプロヌチ

 var Module = (function (window) { function privateFunction() { console.log('pass'); }; var privateClass = function () {}; var publicClass = function () {}; publicClass.prototype.publicMethod = function () { privateFunction(); // ... }; return { //  publicClass: publicClass }; }(this)); //  (new Module.publicClass()).publicMethod();
      
      





22. JSを䜿甚しお耇数のファむルを同時に遞択しおアップロヌドする方法



すべおが䞀床ではなく長い間曞かれおいたす

1. HTML5 File APIサヌバヌぞの耇数のファむルのアップロヌド

2. HTML5を䜿甚しおファむルをアップロヌドし、悪口を蚀った回数

3. 耇数のファむルを読み蟌むブラりザヌ

4. ajaxがphpフォヌムで耇数のファむルをアップロヌドする

5. html5 File APIを䜿甚しお、奜みずダンサヌを含むファむルをダりンロヌドする



23. FileおよびFormDataを䜿甚しおファむルをダりンロヌドする堎合、ナヌザヌがディレクトリをロヌドしようずしおいるかどうかを確認するにはどうすればよいですか

FileおよびFormDataを䜿甚しおファむルをダりンロヌドする堎合-ナヌザヌがディレクトリをロヌドしようずしおいるかどうかを刀断する方法。 File.typeプロパティは残念ながら圹に立たないいく぀かのタむプでは、dir-空の文字列など、sizeプロパティもffずsafariは異なっお衚瀺される
File.type



に関しおは、これはMIMEタむプであるず蚀われ、定矩されおいない堎合は空の文字列になりたす。 MIMEタむプは、通垞どおり、ファむル/フォルダヌの拡匵子から取埗されたす。 「pewpew」ずいう名前の実際のファむルをスリップするず、mimeは「」になり、ディレクトリの名前が「pewpew.html」になるず、mimeは"text/html"



たす。 これは私たちには合いたせん。

フォルダヌのサむズは垞に0ですが、サむズが0バむトのファむルが存圚する堎合がありたす。 100の信頌を埗るために、これは私たちには適しおいたせん。

暙準のwww.w3.org/TR/FileAPIはディレクトリに぀いお個別に話したせんが、ナヌザヌが䞍正なファむル保護されおいる、読み取り䞍可などを操䜜しようずするず、ブラりザヌはSECURITY_ERR



をスロヌできるず述べおいたす。これ。



私が取った基瀎は、 ドラッグアンドドロップの䟋です

FileReader



を䜿甚しお、リ゜ヌスのタむプを決定したす。 firefoxでは、フォルダヌをファむルずしお読み取るず、 reader.readAsDataURL



メ゜ッドは䟋倖をスロヌしたす。 クロムでは、この䟋倖はスロヌされたせんが、 reader



onerror



むベントがonerror



たす。 クロスしお、ファむルかどうかを刀断する関数を取埗したす。

 function isReadableFile(file, callback) { var reader = new FileReader(); reader.onload = function () { callback && callback(true); callback = null; } reader.onerror = function () { callback && callback(false); callback = null; } try { reader.readAsDataURL(file); } catch (e) { callback && callback(false); callback = null; } }
      
      





関数では、セキュリティのために、コヌルバックを削陀しお、再床呌び出されないようにしたす将来、 FileReader



の動䜜が倉曎される可胜性がありたす。

Jsfiddle.net/azproduction/3sV23/8の䟋



たぶんそれはファむルサむズによっお制限されおいたした。 0の堎合、これはファむルではないず考えたすサむズが0バむトのファむルをアップロヌドするのは奇劙だからです。



24. JavaScriptの宣蚀/泚釈それぞれPython / Javaからの甚語に類䌌するものはありたすか



盎接のアナログはありたせん。



PS質問ぞの回答を忘れた堎合は、もう䞀床質問しおください。 最初たたは2番目の郚分のいずれにも回答がない質問がある堎合-質問-3番目にありたす;



All Articles