FileReader.js nothing happens in IE9

匿名 (未验证) 提交于 2019-12-03 08:48:34

问题:

I need help setting up Jadriens FileReader.js. I have set up everything as I think this polyfill works. But the callback that fires when everything is initiated doesn't fire in IE9. This is my markup:

<body> <div class="main">     <canvas id="mainCanvas" width="600" height="600"></canvas><br />     <div id="fileReaderSWFObject"></div>     <input type="file" id="imageLoader" name="imageLoader" /><br />     <input id="text" type="text" placeholder="some text..."> </div>  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script> <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.8.1.min.js"><\/script>')</script> <!--[if lt IE 10]>     <script src="https://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>     <script src="js/vendor/jquery-ui-1.8.23.custom.min.js"></script>     <script src="js/vendor/jquery.FileReader.min.js"></script> <![endif]--> <script src="js/plugins.js"></script> <script src="js/main.js"></script> </body> 

And this is main.js:

$(function () { // Variables var canvas = document.getElementById('mainCanvas'); var context = canvas.getContext('2d'); var canvasCenter = canvas.width / 2; var img = ''; var newImageHeight = 0; var logoX = 0; var padding = 50;  // Functions var flushCanvas = function () {     context.fillStyle = '#000';     context.fillRect(0, 0, canvas.width, canvas.width + padding);     if (img !== '') {         context.drawImage(img, padding, padding, canvas.width - (padding * 2), newImageHeight - (padding * 2));     }     setText(); }; var setText = function () {     context.textAlign = 'center';     context.fillStyle = '#fff';     context.font = '22px sans-serif';     context.textBaseline = 'bottom';     context.fillText($('#text').val(), canvasCenter, canvas.height - 40); };  // Init if ($.browser.msie && $.browser.version <= 9) {     swfobject.embedSWF('filereader.swf', 'fileReaderSWFObject', '100%', '100%', '10', 'expressinstall.swf');     $('#imageLoader').fileReader({         id: 'fileReaderSWFObject',         filereader: 'filereader.swf',         expressInstall: 'expressInstall.swf',         debugMode: true,         callback: function () { console.log('filereader ready'); }     }); } $('#imageLoader').change(function (e) {     if ($.browser.msie && $.browser.version <= 9) {         console.log(e.target.files[0].name);     } else {         var reader = new FileReader();         reader.onload = function (event) {             img = new Image();             img.onload = function () {                 newImageHeight = (img.height / img.width) * (canvas.width);                 canvas.height = newImageHeight + padding;                 flushCanvas();              }             img.src = event.target.result;         }         reader.readAsDataURL(e.target.files[0]);     } }); $('#text').keyup(function (e) {     flushCanvas(); }); }); 

A lot of code but i thought a context might help. The important lines are just below the Init comment. The callback-function in the .fileReader init options never fires. It does fire in other modern browsers though (if you remove the if statement).

回答1:

There are a combination of mistakes here.

  • Jahdriens filereader takes care of the embedding of flash. Just include the swfObject library.
  • Browser sniffing = bad idea. Modernizr = good idea.
  • Make sure you have flash for IE installed :(

My final code looks like this and it works perfect. HTML:

<canvas id="mainCanvas" width="600" height="600"></canvas><br /> <a id="imageLoaderButton" class="button upload">load image</a> <input type="file" id="imageLoader" class="hidden" name="imageLoader" /> <input id="text" type="text" placeholder="some text..."> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script> <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.8.1.min.js"><\/script>')</script> <script src="js/main.js"></script> 

+ link in a custom build of modernizr in the head. (click "non core detects" -> "file-api" when creating you custom build)

And my JS:

$(function () {     Modernizr.load({         test: Modernizr.filereader,         nope: ['js/vendor/swfobject.js', 'js/vendor/jquery-ui-1.8.23.custom.min.js', 'js/vendor/jquery.FileReader.min.js'],         complete: function () {              if (!Modernizr.filereader) {                 $('#imageLoaderButton').fileReader({                     id: 'fileReaderSWFObject',                     filereader: 'filereader.swf',                     expressInstall: 'expressInstall.swf',                     debugMode: true,                     callback: function () {                          $('#imageLoaderButton').show().on('change', read);                     }                 });             } else {                 $('#imageLoaderButton').show().on('click', function () {                     $('#imageLoader').trigger('click').on('change', read);                 });             }          }     });     // Variables     var canvas = document.getElementById('mainCanvas');     var context = canvas.getContext('2d');     var canvasCenter = canvas.width / 2;     var img = '';     var padding = 50;      // Functions     var flushCanvas = function () {         context.fillStyle = '#000';         context.fillRect(0, 0, canvas.width, canvas.width + padding);         if (img !== '') {             context.drawImage(img, padding, padding, canvas.width - (padding * 2), newImageHeight - (padding * 2));         }         setText();     };     var setText = function () {         context.textAlign = 'center';         context.fillStyle = '#fff';         context.font = '22px sans-serif';         context.textBaseline = 'bottom';         context.fillText($('#text').val(), canvasCenter, canvas.height - 40);     };     var read = function (e) {         if (typeof FileReader !== 'undefined') {             var reader = new FileReader();             reader.onload = function (event) {                 img = new Image();                 img.onload = function () {                     newImageHeight = (img.height / img.width) * (canvas.width);                     canvas.height = newImageHeight + padding;                     flushCanvas();                 }                 img.src = event.target.result;             }             reader.readAsDataURL(e.target.files[0]);          }     };      $('#text').keyup(function (e) {         flushCanvas();     }); }); 


回答2:

The problem with IE9 is you need flash player to be installed first also there are many features not supported by IE9



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!