【问题标题】:Getting IE8 compatibility with EaselJS and ExplorerCanvas获得 IE8 与 EaselJS 和 ExplorerCanvas 的兼容性
【发布时间】:2012-09-25 07:41:08
【问题描述】:

我正在使用 EaselJS,并希望允许与 ExplorerCanvas 向后兼容。

这应该可以使用以下代码(参见here):

createjs.createCanvas = function () { ... return canvas implementation here ... }

但是,如果我在此函数中添加警报并运行代码,则该函数永远不会运行。

我该如何让它发挥作用?

编辑:

这是我正在使用的代码的简化示例:

<!DOCTYPE html>
<html lang='en'>
<head>
    <meta charset='utf-8' />
    <script src='/Scripts/jquery-1.7.1.js'></script>
    <script src="/Scripts/excanvas/excanvas.compiled.js"></script>
    <script src="/Scripts/easeljs/lib/easeljs-0.5.0.min.js"></script>
    <script src='/Scripts/core/jquery.mousewheel.js'></script>
    <style>
        canvas
        {
            border: 1px solid #ccc;
        }
    </style>
    <script type='text/javascript'>
        $(document).ready(function () {
            // Variables
            var img;
            var stage;
            var bmp;

            // Bindings
            $('#load').click(function () { initialize() }); // DELETE

            // Functions

            function initialize() {
                img = new Image();
                img.onload = imageLoadedEvent;
                img.src = '/Scripts/viewer/June.jpg';
            }

            function imageLoadedEvent() {
                var canvasElement = generateContext('testCanvas', 400, 400);

                stage = new createjs.Stage('testCanvas');
                bmp = new createjs.Bitmap(img);

                stage.autoClear = true;
                stage.addChild(bmp);
                stage.update();
            }

            function generateContext(canvasID, width, height) {
                var canvasElement = document.createElement('canvas');

                if (typeof (G_vmlCanvasManager) != 'undefined')
                    canvasElement = G_vmlCanvasManager.initElement(canvasElement);

                canvasElement.setAttribute("width", width);
                canvasElement.setAttribute("height", height);
                canvasElement.setAttribute("id", canvasID);

                document.getElementById('viewer').appendChild(canvasElement);
            }
        });
    </script>
</head>
<body>
    <div id='viewer'>
        <button id='load'>load</button>
    </div>

</body>
</html>

此示例将在 Chrome 和 IE9 中运行,因为创建并使用了原生画布元素。但是在 IE8 中它失败了。

【问题讨论】:

    标签: javascript internet-explorer canvas internet-explorer-8 easeljs


    【解决方案1】:

    我也遇到了这个问题,试图让 ExCanvas 与 EaselJS 配合得很好。这是我如何让它工作的。希望这对您的图像问题有所帮助。

    • 获取 EaselJS 的源代码:https://github.com/gskinner/EaselJS.git。这会将所有 javascript 文件分成各自的部分。
    • 将所有这些文件复制到项目目录中的“画架”文件夹中。
    • 加载文件的顺序很重要,请参阅下文了解如何执行此操作。
    • EaselJS 有一个选项来覆盖 createCanvas 方法,这是使用 ExCanvas 所必需的。这发生在加载 SpriteSheet.js 文件之后,以及加载 Graphics.js、DisplayObject.js、Container.js 等之前。在下面的代码中,我使用 jQuery 加载了easelJs 所需的其余 js 文件。这一切都发生在 $(document).ready() 函数中。
    • 如果操作正确,您应该会在 IE 中看到一个 700 x 700 的画布,从左上角到右下角有一条红线(在 8 中测试)。

      头>

              <!--
                  Load ExCanvas first, and jquery
              -->
              <script type='text/javascript' src='./javascript/excanvas.js'></script>
              <script type='text/javascript' src='./javascript/jquery-1.8.2.min.js'></script>
      
              <!--
                  Have to load Easel js files in a certain order, and override the createCanvas
                  function in order for it to work in < IE9.
              -->
              <script type='text/javascript' src='./javascript/easel/UID.js'></script>
              <script type='text/javascript' src='./javascript/easel/Ticker.js'></script>
              <script type='text/javascript' src='./javascript/easel/EventDispatcher.js'></script>
              <script type='text/javascript' src='./javascript/easel/MouseEvent.js'></script>
              <script type='text/javascript' src='./javascript/easel/Matrix2D.js'></script>
              <script type='text/javascript' src='./javascript/easel/Point.js'></script>
              <script type='text/javascript' src='./javascript/easel/Rectangle.js'></script>
              <script type='text/javascript' src='./javascript/easel/Shadow.js'></script>
              <script type='text/javascript' src='./javascript/easel/SpriteSheet.js'></script>
      
              <script type='text/javascript'>
                  var canvas, stage;
      
                  createjs.createCanvas = function () { return getCanvas(); };
      
                  function getCanvas() {
                      // This is needed, otherwise it will keep adding canvases, but it only use the last one it creates.
                      canvas = document.getElementById("myCanvas");
                      if (canvas != null) {
                          document.getElementById("container").removeChild(canvas);
                      }
                      canvas = document.createElement("canvas");
                      document.getElementById("container").appendChild(canvas);
                      if (typeof (G_vmlCanvasManager) != 'undefined') {
                          canvas = G_vmlCanvasManager.initElement(canvas);
                          canvas.setAttribute("height", "700");
                          canvas.setAttribute("width", "700");
                          canvas.setAttribute("style", "height:700px; width:700px;");
                          canvas.setAttribute("id", "myCanvas");
                      }
                      return canvas;
                  }
              </script>
      
              <script type="text/javascript">
                  $(document).ready(function () {
                      loadOtherScripts();
                      stage = new createjs.Stage(canvas);
      
                      // Draw a red line from top left to bottom right
                      var line = new createjs.Shape();
                      line.graphics.clear();
                      line.graphics.setStrokeStyle(2);
                      line.graphics.beginStroke("#FF0000");
                      line.graphics.moveTo(0, 0);
                      line.graphics.lineTo(700, 700);
                      stage.addChild(line);
      
                      stage.update();
                  });
      
                  function loadOtherScripts() {
                      var jsAr = new Array(13);
      
                      jsAr[0] = './javascript/easel/Graphics.js';
                      jsAr[1] = './javascript/easel/DisplayObject.js';
                      jsAr[2] = './javascript/easel/Container.js';
                      jsAr[3] = './javascript/easel/Stage.js';
                      jsAr[4] = './javascript/easel/Bitmap.js';
                      jsAr[5] = './javascript/easel/BitmapAnimation.js';
                      jsAr[6] = './javascript/easel/Shape.js';
                      jsAr[7] = './javascript/easel/Text.js';
                      jsAr[8] = './javascript/easel/SpriteSheetUtils.js';
                      jsAr[9] = './javascript/easel/SpriteSheetBuilder.js';
                      jsAr[10] = './javascript/easel/DOMElement.js';
                      jsAr[11] = './javascript/easel/Filter.js';
                      jsAr[12] = './javascript/easel/Touch.js';
      
                      for (var i = 0; i < jsAr.length; i++) {
                          var js = jsAr[i];
                          $.ajax({
                              async: false,
                              type: "GET",
                              url: js,
                              data: null,
                              dataType: 'script'
                          });
                      }
                  }
          </head>
          <body>
              <div id="container"></div>
          </body>
      </html>
      

    【讨论】:

    • 我想知道这个 hack 有多稳定?它是否保留了 IE8 上的全部功能?
    • 我没有彻底测试过,所以我不能说它是否稳定。不过我找不到其他选择。
    【解决方案2】:

    您应该通过引用项目页面example上提供的原始画布源来实例化准canvas元素:

    <head>
    <!--[if lt IE 9]><script src="excanvas.js"></script><![endif]-->
    </head>
    
    var el = document.createElement('canvas');
    G_vmlCanvasManager.initElement(el);
    var ctx = el.getContext('2d'); 
    

    编辑:

    经过进一步调查,我得出以下结论! 无法将图像包含到画布中的原因有多种:

    1. 第一,excanvas 代码中可能存在一个错误,因为它无法模仿本机画布功能。我更成功地使用了修改后的 sancha 代码,您可以在这里获得:http://dev.sencha.com/playpen/tm/excanvas-patch/excanvas-modified.js。在此处查看实时示例:http://jsfiddle.net/aDHKm/在 IE 上试用)。
    2. 在 Easeljs 初始化核心对象和类之前的第二个首先是搜索画布元素的存在。因为 IE

    我的建议是尝试在没有画架的情况下重新制作代码。我做了一个必要的修改,向您展示如何在没有画架的情况下完成:http://jsfiddle.net/xdXrw/。我不知道你是否绝对必须使用easeljs,但它在IE8 hacked canvas方面肯定有一些限制。

    【讨论】:

    • 我可以使用 excanvas 获取上下文,但是我一直不知道如何将此上下文与easeljs 关联起来。关于如何做到这一点的任何想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2014-02-12
    相关资源
    最近更新 更多