用原型更改现有的JavaScript对象函数?

时间:2012-12-09 23:24:02

标签: javascript ruby-on-rails pagedown

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

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

因此,我当前的方法是告诉PageDown将编辑器与具有特定类名的textarea相关联,而不是将其与特定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

1 个答案:

答案 0 :(得分:1)

它是 主要 黑客,但是如果传递的字符串开始,您可以通过覆盖document.getElementById()委托给document.getElementsByClassName()来完成它与'wmd-input'

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);
};