私がフォローしている方々でcoffeescriptタグを持つ人にリクエストを送りました!
###前提・実現したいこと
処理速度、コードの複雑化を改善するためにjavascriptをcoffeescriptへ移行したい。
下記番号で言いますと、①=③になるように②のCoffeeScriptを修正したい。
javascriptでfacebookのような「続きを見る」機能を苦戦しながらもみなさんのご助力をいただき実装しました。この機能は複数ページに必要な機能でしたので、複数ファイルに同様のjsコードを記述しています。
しかし、
・同様のコードを書いているために無駄が多く見にくい。
・(これはご指摘を受けたのですが、)jsとrailsの接続をするという二度手間が生じる。
という問題がありますので、JavaScriptコードをCoffeeScriptコードに書き換えようと考えました。
###発生している問題・エラーメッセージ
問題はこのエラーです。
ExecJS::RuntimeError in Page#index Showing /home/ubuntu/workspace/app/views/layouts/application.html.erb where line #6 raised: SyntaxError: [stdin]:4:19: reserved word 'function'
このエラーは調べたところ、
coffee内のコードミスということでしたので、
で、一字一句確認したのですが、1点だけどうしてもうまくいきません。
・元のjavascriptコードよりも});が一つ少ない。
###該当のソースコード
①【元のJavaScriptコード】
②【①のJavascriptコードを書き換えたCoffeeScriptコード】
③【http://coffeescript.org/で②のCoffeeScriptコードをコンパイルしたJavaScriptコード】
①【元のJavaScriptコード】
JavaScript
1$(document).ready(function() { 2 var showChar = 100; 3 var ellipsestext = "..."; 4 var moretext = "more"; 5 var lesstext = "less"; 6 $('.more').each(function() { 7 var content = $(this).html(); 8 9 if(content.length > showChar) { 10 11 var c = content.substr(0, showChar); 12 var h = content.substr(showChar, content.length - showChar); 13 14 var html = c + '<span class="moreellipses">' + ellipsestext+ ' </span><span class="morecontent"><span>' + h + '</span> <a href="" class="morelink">' + moretext + '</a></span>'; 15 16 $(this).html(html); 17 } 18 19 }); 20 21 $(".morelink").click(function(){ 22 if($(this).hasClass("less")) { 23 $(this).removeClass("less"); 24 $(this).html(moretext); 25 } else { 26 $(this).addClass("less"); 27 $(this).html(lesstext); 28 } 29 $(this).parent().prev().toggle(); 30 $(this).prev().toggle(); 31 return false; 32 }); 33}); ←③で足りない箇所
②【①のJavascriptコードを書き換えたCoffeeScriptコード】
CoffeeScript
1$(document).ready -> 2 showChar = 100 3 ellipsestext = "..." 4 moretext = "more" 5 lesstext = "less" 6 return 7 8$('.more').each -> 9 content = $(trim).$(this).html() 10 11 if content.length > showChar 12 13 c = content.substr 0, showChar 14 h = content.substr showChar, content.length - showChar 15 16 html = c + '<span class="moreellipses">' + ellipsestext+ ' </span><span class="morecontent"><span>' + h + '</span> <a href="" class="morelink">' + moretext + '</a></span>' 17 18 $(this).html html 19 return 20 21$(".morelink").click -> 22 if $(this).hasClass "less" 23 $(this).removeClass "less" 24 $(this).html moretext 25 return 26 else 27 $(this).addClass "less" 28 $(this).html lesstext 29 return 30 31 $(this).parent().prev().toggle() 32 $(this).prev().toggle() 33 false
③【http://coffeescript.org/で②のCoffeeScriptコードをコンパイルしたJavaScriptコード】
Javascript
1$(document).ready(function() { 2 var ellipsestext, lesstext, moretext, showChar; 3 showChar = 100; 4 ellipsestext = "..."; 5 moretext = "more"; 6 lesstext = "less"; 7}); 8 9$('.more').each(function() { 10 var c, content, h, html; 11 content = $(trim).$(this).html(); 12 if (content.length > showChar) { 13 c = content.substr(0, showChar); 14 h = content.substr(showChar, content.length - showChar); 15 html = c + '<span class="moreellipses">' + ellipsestext + ' </span><span class="morecontent"><span>' + h + '</span> <a href="" class="morelink">' + moretext + '</a></span>'; 16 $(this).html(html); 17 } 18}); 19 20$(".morelink").click(function() { 21 if ($(this).hasClass("less")) { 22 $(this).removeClass("less"); 23 $(this).html(moretext); 24 return; 25 } else { 26 $(this).addClass("less"); 27 $(this).html(lesstext); 28 return; 29 } 30 $(this).parent().prev().toggle(); 31 $(this).prev().toggle(); 32 return false; 33}); ←下にもう一つ});が入るはず。
何卒、ご助言お願い致します。
###情報追加部分
④【現時点のCoffeeScriptコード】
CoffeeScript
1$ -> 2 showChar = 100 3 ellipsestext = "..." 4 moretext = "more" 5 lesstext = "less" 6 7 $('.more').each -> 8 content = $(@).html() 9 10 if content.length > showChar 11 12 c = content.substr 0, showChar 13 h = content.substr showChar, content.length - showChar 14 15 html = """ #{c} 16 <span class="moreellipses"> 17 #{ellipsestext} 18 </span> 19 <span class="morecontent"> 20 <span>#{h}</span> 21 <a href="" class="morelink">#{moretext}</a> 22 </span>""" 23 24 $(@).html html 25 26 $(".morelink").click -> 27 if $(@).hasClass "less" 28 $(@).removeClass "less" 29 $(@).html moretext 30 else 31 $(@).addClass "less" 32 $(@).html lesstext 33 34 $(@).parent().prev().toggle() 35 $(@).prev().toggle() 36 return false;
⑤【④をコンパイルしたJavaScriptコード】
JavaScript
1$(function() { 2 var ellipsestext, lesstext, moretext, showChar; 3 showChar = 100; 4 ellipsestext = "..."; 5 moretext = "more"; 6 lesstext = "less"; 7 $('.more').each(function() { 8 var c, content, h, html; 9 content = $(this).html(); 10 if (content.length > showChar) { 11 c = content.substr(0, showChar); 12 h = content.substr(showChar, content.length - showChar); 13 html = " " + c + "\n<span class=\"moreellipses\">\n" + ellipsestext + " \n</span>\n<span class=\"morecontent\">\n <span>" + h + "</span> \n <a href=\"\" class=\"morelink\">" + moretext + "</a>\n</span>"; 14 return $(this).html(html); 15 } 16 }); 17 return $(".morelink").click(function() { ←どうしてもこのreturnを消したい。 18 if ($(this).hasClass("less")) { 19 $(this).removeClass("less"); 20 $(this).html(moretext); 21 } else { 22 $(this).addClass("less"); 23 $(this).html(lesstext); 24 } 25 $(this).parent().prev().toggle(); 26 $(this).prev().toggle(); 27 return false; 28 }); 29});
⑥【実現したいJavaScriptコード】
Javascript
1$(document).ready(function() { 2 var ellipsestext, lesstext, moretext, showChar; 3 showChar = 100; 4 ellipsestext = "..."; 5 moretext = "more"; 6 lesstext = "less"; ←⑤でreturnをjsコードで追加したことで、coffeeではreturnが消えました。 7}); 8 9$('.more').each(function() { 10 var c, content, h, html; 11 content = $(trim).$(this).html(); 12 if (content.length > showChar) { 13 c = content.substr(0, showChar); 14 h = content.substr(showChar, content.length - showChar); 15 html = c + '<span class="moreellipses">' + ellipsestext + ' </span><span class="morecontent"><span>' + h + '</span> <a href="" class="morelink">' + moretext + '</a></span>'; 16 $(this).html(html); 17 } 18}); 19 20$(".morelink").click(function() { 21 if ($(this).hasClass("less")) { 22 $(this).removeClass("less"); 23 $(this).html(moretext); 24 } else { 25 $(this).addClass("less"); 26 $(this).html(lesstext); 27 } 28 $(this).parent().prev().toggle(); 29 $(this).prev().toggle(); 30 return false; 31 }); 32});

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/04 02:28 編集