【问题标题】:fabric.js error in rails导轨中的fabric.js错误
【发布时间】:2017-01-19 02:43:39
【问题描述】:

我在我的 rails 5 应用程序中包含了 fabric.js(dist 文件夹)-vendor/assets/javascripts

我的视图文件中有一个 canvas html 元素 - view.html.erb

<div class="col-sm-6">
<canvas id="canvas" width="300" height="200" style="border:1px solid #000000">
</canvas>
</div>

然后我在assets/javascripts/event.js 中的一个javascript 文件中访问上述画布。

var canvas = new fabric.Canvas('can');
var circle = new fabric.Circle({
  radius: 20, fill: 'green', left: 100, top: 100
});
canvas.add(circle);

```

导航到页面时出现以下错误,

fabric.self-85644f2….js?body=1:6519 Uncaught TypeError: Cannot create property 'style' on string 'can' at klass._createCanvasElement (fabric.self-85644f2….js?body=1:6519) at klass._createLowerCanvas (fabric.self-85644f2….js?body=1:6559) at klass._initStatic (fabric.self-85644f2….js?body=1:6249) at klass.initialize (fabric.self-85644f2….js?body=1:8496) at new klass (fabric.self-85644f2….js?body=1:1944) at event.self-e4cb5e2….js?body=1:3

这是我的application.js

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require fabric
//= require_tree .

更新

所以,当画布代码包含在 DOM 就绪回调中时,我确实看到现在呈现的画布。但是,我仍然不知道初始化结构的正确方法是什么,即等待 DOM 加载然后运行结构相关代码的正确方法。

显然,这是等待 DOM 就绪的方式 - http://guides.rubyonrails.org/working_with_javascript_in_rails.html#turbolinks。但是,我是否在我访问画布的所有 javascript 文件中添加此包装器代码?

$(document).on('turbolinks:load', function() {
    var canvas = new fabric.Canvas('can');
    var circle = new fabric.Circle({
      radius: 20, fill: 'green', left: 50, top: 50
    });
    canvas.add(circle);
});

【问题讨论】:

    标签: ruby-on-rails fabricjs


    【解决方案1】:

    用正确的答案编辑。

    第 1 部分

    在初始化结构之前需要加载文档和 turbolinks。

    $(document).on('turbolinks:load', function() {
        var canvas = new fabric.Canvas('can');
        var circle = new fabric.Circle({
          radius: 20, fill: 'green', left: 50, top: 50
        });
        canvas.add(circle);
    });
    

    第 2 部分

    你可以像这样创建一个可重用的函数

    在 app/assets/javascripts/application.js 中

    var canvas = $(document).on('turbolinks:load', function() {
            new fabric.Canvas('can');
        });
    

    使用 canvas 变量,您可以在任何需要的地方调用已初始化的结构函数。如下所示

    var circle = canvas.Circle({
        radius: 20, fill: 'green', left: 50, top: 50
    });
    canvas.add(circle);
    

    【讨论】:

    • 我删除了内联样式分配,没有帮助。没有“#”的元素 id 可以使用 fabric - fabricjs.com/fabric-intro-part-1#canvas。欣赏你的努力。我猜这与包含的 javascript 文件的顺序或 javascript 代码执行时 dom 未准备好有关。
    • $(document).ready(function(){ var canvas = new fabric.Canvas('can'); var circle = new fabric.Circle({ radius: 20, fill: 'green', left: 100, top: 100 }); canvas.add(circle); }); 我认为这应该可行。
    • 疑似与 dom init 有关。当我在 dom 就绪回调中添加包装代码时,画布确实被渲染了。但是,我不知道现在初始化结构的正确方法是什么。我对你的评论投了赞成票。
    • 看起来这是在 Rails 中等待 DOM 就绪的方式 - guides.rubyonrails.org/…
    • 我刚刚阅读了 Fabric 文档。它清楚地指出您需要在一个 id 为 link 的元素上初始化一个结构,在您的情况下,您有一个 id 为 canvas 的 canvas 元素所以引用元素,它应该可以工作var canvas = new fabric.Canvas('canvas');
    猜你喜欢
    • 2023-03-15
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多