【问题标题】:Change existing JavaScript object functions with prototype?用原型改变现有的 JavaScript 对象函数?
【发布时间】:2012-12-10 09:01:15
【问题描述】:

我正在尝试将 PageDown 挂接到我的 Rails 应用程序中,因为 Markdown 编辑器很棒。

但是,我发现这很困难,因为 Rails 通过表单助手自动分配 id,而 PageDown 期望将 id“wmd-input”分配给 textarea 字段。在我的模型中,我有一个名为“body”的文本属性,我想将其用作编辑器,但 f.text_area :body 会生成一个 ID 为 post_body 的文本区域。

所以,我目前的方法是告诉 PageDown 将编辑器与具有特定类名的文本区域相关联,而不是将其与特定 ID 相关联。这是我对如何进行感到困惑的地方。这是link to Markdown.Editor.js

导航至function PanelCollection(postfix) {(第 244 行)。我想更改该函数中的第三行:

this.input = doc.getElementById("wmd-input" + postfix);

this.input = doc.getElementsByClassName("wmd-input" + postfix)[0];

我从来没有做过这样的事情。此外,编辑 Markdown.Editor.js 的源代码并不是一个真正的选择,因为它是自动生成的。我需要在创建函数后更改它。我该怎么做?

编辑#1:

所以,这是我第一次在 GitHub 上分叉和贡献任何东西,但是我分叉了 pagedown-rails gem 并进行了更改,并通过将我的 Gemfile 中列出的 gem 连接到我的 fork 来确保它工作。工作得很漂亮,谢谢你的建议。我回馈了via this pull request

【问题讨论】:

  • 我认为这个问题与 ruby​​-on-rails 或原型无关。
  • 为什么不自己托管源代码,然后自己编辑那一行?哦,如果只能在某个时间点编辑,就直接暴露构造函数...
  • 如果我进行更改的原因是特定于 rails 的,那不值得包含 rails 标签吗?
  • 不错! +1 在以正确的方式做事时坚持到底。​​span>

标签: javascript ruby-on-rails pagedown


【解决方案1】:

这是一个主要 hack,但是如果传递的字符串以'wmd-input' 开头,您可以通过覆盖document.getElementById() 以委托给document.getElementsByClassName() 来完成它:

var doc = document;
doc.__getElementByIdOrig = doc.getElementById;
doc.getElementById = function (idStr) {
    if (idStr.match(/^wmd-input/)) {
        var elt = this.getElementsByClassName(idStr)[0];
        return elt ? elt : null;
    }

    return this.__getElementByIdOrig(idStr);
};

【讨论】:

  • 老实说,我想不出更清洁的方法。 PageDown 源是 gem 的一部分,我不喜欢直接破解 gem 的想法:\
  • 是的,如果无法编辑源代码,这似乎是唯一的选择。
  • 分叉并回馈。我认为这种变化对 Rails 应用程序是有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多