★゜・。。・゜゜・。。・゜☆ 2012年04月05日 ☆゜・。。・゜゜・。。・゜★
Firefoxでword-break:break-allを実現する「wordBreak.js」の不具合に対処してみた
以前はOperaも効かなかったのですが、今はFirefoxだけにおいて
table内で「word-break:break-all」が効かない(改行されない)
という問題があるので、
FirefoxとOperaでword-break:break-allを実現する「wordBreak.js」[to-R]
を使っていたのですが、
wordBreak.js使用時の注意点 – hinimiの偏頭痛
にもあるように、ソースにインデントをつけるとレイアウトが崩れるという不具合に遭遇しました。
ただし、
Tabでインデントを付ける場合は大丈夫?とか、
タブと半角スペースを混在させたらダメになったとかならないとか、
どこかからコピペした半角スペースが怪しそうだとか、
うまく行く半角スペースとそうでない半角スペースがある?
など、どのような場合に崩れるのか、原因は未調査です。
ここで、wordBreak.jsですが、ソースを見ると
(1)指定した要素(デフォルトではclass="wordBreak"のtable)内のノードにおいて、
(2)nodeTypeがTEXT_NODEのものは、
(3)各文字をバラバラにして、間に幅無しスペース(​)を挿入する
という仕組みになっています。
ちなみに(1)に関して、<table class="wordBreak">以外にも使えるようにするには
をいろいろ変えてみれば良いと思うのですが、
レイアウトが崩れるときの現象を調査してみると、
<table>と<tbody>(<thead>,<tfoot>)の間、
<tbody>(<thead>,<tfoot>)と<tr>の間、
<tr>と<td>の間
に幅無しスペース(​)が挿入されていることが分かりました。
つまり(2)の条件のために
とやっているのですが、インデント部分でここがtrueとなってしまっているということです。
ここをなんとかすれば良いのだなと思い、いろいろ試してみたのですがうまくいかず、
それならば、ということで(3)において、
となっているところを「ただし<table>、<thead>、<tfoot>、<tbody>、<tr>の直下は除く」という様に
としたらうまく行きました。
でも、これだと<td>内のインデントが悪影響を及ぼさないか不安がありますし、
そもそもロジック的に、根本的な解決ではなく邪道な気がしますので、
他に良いやり方があったら教えてもらえたら有難く思います。
table内で「word-break:break-all」が効かない(改行されない)
という問題があるので、
FirefoxとOperaでword-break:break-allを実現する「wordBreak.js」[to-R]
を使っていたのですが、
wordBreak.js使用時の注意点 – hinimiの偏頭痛
にもあるように、ソースにインデントをつけるとレイアウトが崩れるという不具合に遭遇しました。
ただし、
Tabでインデントを付ける場合は大丈夫?とか、
タブと半角スペースを混在させたらダメになったとかならないとか、
どこかからコピペした半角スペースが怪しそうだとか、
うまく行く半角スペースとそうでない半角スペースがある?
など、どのような場合に崩れるのか、原因は未調査です。
ここで、wordBreak.jsですが、ソースを見ると
(1)指定した要素(デフォルトではclass="wordBreak"のtable)内のノードにおいて、
(2)nodeTypeがTEXT_NODEのものは、
(3)各文字をバラバラにして、間に幅無しスペース(​)を挿入する
という仕組みになっています。
ちなみに(1)に関して、<table class="wordBreak">以外にも使えるようにするには
var wordBreakClass = "wordBreak";
var table = document.getElementsByTagName("table");
をいろいろ変えてみれば良いと思うのですが、
レイアウトが崩れるときの現象を調査してみると、
<table>と<tbody>(<thead>,<tfoot>)の間、
<tbody>(<thead>,<tfoot>)と<tr>の間、
<tr>と<td>の間
に幅無しスペース(​)が挿入されていることが分かりました。
つまり(2)の条件のために
if(cNode.nodeType == 3)
とやっているのですが、インデント部分でここがtrueとなってしまっているということです。
ここをなんとかすれば良いのだなと思い、いろいろ試してみたのですがうまくいかず、
それならば、ということで(3)において、
if(cNode.nodeValue.match("[^\n ]")){
var plTxt = cNode.nodeValue.replace(/\t/g,"");
var spTxt = plTxt.split("");
spTxt = spTxt.join(String.fromCharCode(8203));
var chNode = document.createTextNode(spTxt);
cNode.parentNode.replaceChild(chNode,cNode)
}
となっているところを「ただし<table>、<thead>、<tfoot>、<tbody>、<tr>の直下は除く」という様に
var pTag=cNode.parentNode.tagName.toLowerCase();
if(!(pTag=="table" || pTag=="thead" || pTag=="tfoot" || pTag=="tbody" || pTag=="tr")){
if(cNode.nodeValue.match("[^\n ]")){
var plTxt = cNode.nodeValue.replace(/\t/g,"");
var spTxt = plTxt.split("");
spTxt = spTxt.join(String.fromCharCode(8203));
var chNode = document.createTextNode(spTxt);
cNode.parentNode.replaceChild(chNode,cNode)
}
}
としたらうまく行きました。
でも、これだと<td>内のインデントが悪影響を及ぼさないか不安がありますし、
そもそもロジック的に、根本的な解決ではなく邪道な気がしますので、
他に良いやり方があったら教えてもらえたら有難く思います。



