首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用jQuery创建RedCloth实时预览?

如何使用jQuery创建RedCloth实时预览?
EN

Stack Overflow用户
提问于 2010-08-17 07:44:22
回答 2查看 1.3K关注 0票数 6

我在Rails的许多WYSIWYG /plugin中遇到了问题,所以我正在使用RedCloth gem自己构建一个。我希望用户在填写表单时可以看到HTML格式文本的实时预览,但不知道如何使用jQuery和RedCloth来做到这一点。以下是我在application.js中尝试的内容:

代码语言:javascript
复制
$('#comment').keyup(function(){
  var formatted = RedCloth.new($(this).val()).to_html;
  $('#preview').html(formatted);
});

这并不奇怪,因为RedCloth.new可能不能在.js文件中执行,但不知道如何动态格式化文本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-01 01:26:02

我只是不得不自己处理这个问题。正如Geoff &Andy提到的,你有两个选择:

  1. 使用JavaScript解析纺织品,使用jquery将其粘贴到页面中
  2. 使用Ajax调用从服务器获取解析后的纺织品,并使用jquery将其粘贴到页面

中。

我使用http://github.com/aaronchi/jrails用jquery替换了scriptactulous,这使得事情变得更简单了。

我是这么做的:

我决定实现选项2,因为获得与通过RedCloth显示的格式完全相同的格式对我的应用程序非常重要。

我在我的页面的<head>中添加了以下内容:

代码语言:javascript
复制
<script>
var timeStamp1 = -1;
var timeStampSent1 = -1;
function delay() {
    setTimeout('preview()',1000);
}
function preview() {
    var n = new Date().getTime();
    // Ask for update if textarea was changed since this function last ran
    if (timeStamp1 != -1 && timeStamp1 != timeStampSent1) {
        $.post('/whatevers/ajax_update_preview', $('#textile').serialize(), null, "script");
        timeStampSent1 = timeStamp1;
    }
    delay(); // Run this again in 1000ms
}

// Important for letting you send ajax requests with jquery & rails
jQuery.ajaxSetup({  
    'beforeSend': function (xhr) {xhr.setRequestHeader("Accept", "text/javascript")}  
});


$(document).ready(function(){
    // Event binding to watch for changes to the textarea
    $('#textile').keydown(function() {
      timeStamp1 = event.timeStamp
    });
});
</script>

<body>中,您显然需要:

代码语言:javascript
复制
<textarea id="textile" name="some_text"></textarea>
<div id="preview"></div>

您的控制器中需要以下内容:

代码语言:javascript
复制
class WhateversController < ApplicationController
  def ajax_update_preview
    txt = params[:some_text]
    render :update do |page|
      page.replace_html 'preview', :partial => 'preview', :object => txt
    end
  end

和partial (_preview.html.haml;它用HAML表示,因为我用的就是它,但你也可以用ERB做这件事,而且你需要用gem.config在environment.rb中处理RedCloth gem ):

代码语言:javascript
复制
- if live_textile_preview
  = RedCloth.new(live_textile_preview).to_html

最后,请记住将以下内容放入您的routes.rb:

代码语言:javascript
复制
map.resources :whatevers, :collection => {:ajax_update_preview => :post}

我对javascript相当缺乏经验(我只是把一些东西拼凑在一起),所以我相信这里的JS还可以改进。

请注意,如果同时有许多用户,这会对服务器资源造成很大的影响。如果是这样的话,您最好在客户端使用javascript处理纺织品。

票数 4
EN

Stack Overflow用户

发布于 2010-08-17 07:56:29

我认为你需要用javascript来做这件事,除非你想在keyup事件或类似的事情上有一个ajax调用。

这个链接有一些很好的资源:JavaScript libraries for Markdown, Textile and others; Anchor references

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3498293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档