Webアプリケーションフレームワークの都合上、動的に生成されるIDをjQueryで処理する必要があり、
そのIDを予めjQueryでも扱えるようエスケープした状態のIDを作成する必要がありました。
そこで、以下のようなユーティリティークラスを作成しました。
jQueryのエスケープに関しては、下記にあります。
jQuery API Documentation Category: Selectors
package util;
/**
* jQueryユーティリティー
* @author @michigawi
*/
public final class JQueryUtil {
/** エスケープ対象文字 */
private static final char[] META_CHARACTERS = new char[]{' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '`', '{', '|', '}', '~'};
/** jQueryのエスケープ文字 */
private static final String ESCAPE_META = "\\\\";
/**
* エスケープします。
* http://api.jquery.com/category/selectors/
* @param target ターゲットの文字
* @return エスケープ後の文字列
*/
public static final String escape(String target) {
if (target == null) {
return null;
}
StringBuilder escaped = new StringBuilder(target.length() * 2);
for (char character : target.toCharArray()) {
if (findEscapeTarget(character)) {
escaped.append(ESCAPE_META);
}
escaped.append(character);
}
return escaped.toString();
}
/**
* 文字列がエスケープ対象か判別します。
* @param target ターゲットの文字
* @return エスケープ対象の場合、true
*/
private static boolean findEscapeTarget(char target) {
for (char meta : META_CHARACTERS) {
if (target == meta) {
return true;
}
}
return false;
}
}
テストコード
package util;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.junit.Test;
/**
* {@link util.JQueryUtilTest}のテスト
* @author @michigawi
*/
public class JQueryUtilTest {
@Test
public void 半角スペースをエスケープする() {
assertThat(JQueryUtil.escape("jQuery selector"), is("jQuery\\\\ selector"));
}
@Test
public void 半角エクスクラメーションマークをエスケープする() {
assertThat(JQueryUtil.escape("jQuery!selector"), is("jQuery\\\\!selector"));
}
@Test
public void ダブルクウォートをエスケープする() {
assertThat(JQueryUtil.escape("jQuery\"selector"), is("jQuery\\\\\"selector"));
}
@Test
public void シャープをエスケープする() {
assertThat(JQueryUtil.escape("jQuery#selector"), is("jQuery\\\\#selector"));
}
@Test
public void ダラーをエスケープする() {
assertThat(JQueryUtil.escape("jQuery$selector"), is("jQuery\\\\$selector"));
}
@Test
public void パーセントをエスケープする() {
assertThat(JQueryUtil.escape("jQuery%selector"), is("jQuery\\\\%selector"));
}
@Test
public void アンドをエスケープする() {
assertThat(JQueryUtil.escape("jQuery&selector"), is("jQuery\\\\&selector"));
}
@Test
public void シングルクォートをエスケープする() {
assertThat(JQueryUtil.escape("jQuery'selector"), is("jQuery\\\\'selector"));
}
@Test
public void 左丸カッコをエスケープする() {
assertThat(JQueryUtil.escape("jQuery(selector"), is("jQuery\\\\(selector"));
}
@Test
public void 右丸カッコをエスケープする() {
assertThat(JQueryUtil.escape("jQuery)selector"), is("jQuery\\\\)selector"));
}
@Test
public void アスタリスクをエスケープする() {
assertThat(JQueryUtil.escape("jQuery*selector"), is("jQuery\\\\*selector"));
}
@Test
public void プラスをエスケープする() {
assertThat(JQueryUtil.escape("jQuery+selector"), is("jQuery\\\\+selector"));
}
@Test
public void カンマをエスケープする() {
assertThat(JQueryUtil.escape("jQuery,selector"), is("jQuery\\\\,selector"));
}
@Test
public void ピリオドをエスケープする() {
assertThat(JQueryUtil.escape("jQuery.selector"), is("jQuery\\\\.selector"));
}
@Test
public void スラッシュをエスケープする() {
assertThat(JQueryUtil.escape("jQuery/selector"), is("jQuery\\\\/selector"));
}
@Test
public void コロンをエスケープする() {
assertThat(JQueryUtil.escape("jQuery:selector"), is("jQuery\\\\:selector"));
}
@Test
public void セミコロンをエスケープする() {
assertThat(JQueryUtil.escape("jQuery;selector"), is("jQuery\\\\;selector"));
}
@Test
public void 小なり記号をエスケープする() {
assertThat(JQueryUtil.escape("jQueryselector"), is("jQuery\\\\>;selector"));
}
@Test
public void クエッションをエスケープする() {
assertThat(JQueryUtil.escape("jQuery?selector"), is("jQuery\\\\?selector"));
}
@Test
public void アットマークをエスケープする() {
assertThat(JQueryUtil.escape("jQuery@selector"), is("jQuery\\\\@selector"));
}
@Test
public void 左大カッコをエスケープする() {
assertThat(JQueryUtil.escape("jQuery[selector"), is("jQuery\\\\[selector"));
}
@Test
public void バックスラッシュをエスケープする() {
assertThat(JQueryUtil.escape("jQuery\\selector"), is("jQuery\\\\\\selector"));
}
@Test
public void 右大カッコをエスケープする() {
assertThat(JQueryUtil.escape("jQuery]selector"), is("jQuery\\\\]selector"));
}
@Test
public void キャレットをエスケープする() {
assertThat(JQueryUtil.escape("jQuery^selector"), is("jQuery\\\\^selector"));
}
@Test
public void グレイヴアクセントをエスケープする() {
assertThat(JQueryUtil.escape("jQuery`selector"), is("jQuery\\\\`selector"));
}
@Test
public void 左中カッコをエスケープする() {
assertThat(JQueryUtil.escape("jQuery{selector"), is("jQuery\\\\{selector"));
}
@Test
public void 縦線をエスケープする() {
assertThat(JQueryUtil.escape("jQuery|selector"), is("jQuery\\\\|selector"));
}
@Test
public void 右中カッコをエスケープする() {
assertThat(JQueryUtil.escape("jQuery}selector"), is("jQuery\\\\}selector"));
}
@Test
public void チルダをエスケープする() {
assertThat(JQueryUtil.escape("jQuery~selector"), is("jQuery\\\\~selector"));
}
}