2016-07-11 7 views
3

私はsvgを使って線を描こうとしています。だから私はinsertAdjacentHTMLに使用されました。しかし、これはクロームでは動作していますが、Firefoxでは動作しません。svg-insertAdjacentHTMLはFirefox 35以降では動作していませんか?

var svgid = document.getElementById('svg_main'); 
var str_lne = 60; 
var data = '<path id="lineAB" d="M 50 '+str_lne+' L 1050 '+(str_lne)+'" transform="translate(0.5,0.5)" stroke="#707073" fill="none" storke-width="1px" opacity="1" ></path>'; 
svgid.insertAdjacentHTML('beforeend',data); 

それは(35以下)のfirefox上のローカルホストで実行されませんに従うよう

<div style="height:330px; width:1100px; background:#313131; margin:0 auto; "> 
    <svg id='svg_main' height="330" width="1100"></svg> 
</div> 

私のjavascriptをたどるよう

私のhtmlコードです。例えば

は、私は、Firefoxを開いて、今SVGラインが表示されていないURL(ローカルホスト/ svgtest.html)を入力します。しかし、私はctrl + sでページを保存し、Firefoxを開いてその行を表示します。

run on the firefox by using localhostsimply open the file on firefoxこの問題から私を助け、問題の共振を明確にしてください。

+0

Firefoxの最新のバージョンは47になりました。Firefox 35はセキュリティホールが既知であるため、安全ではありません。後悔する前にアップグレードしてください。 –

+0

今後、既存の回答が無効になるように質問を編集しないでください。代わりに、**新しい質問をしてください**。 – Matt

+0

@Matt大丈夫です。私は自分自身を変更します – mkHun

答えて

2

次を交換してください:

svgid.insertAdjacentHTML('beforeend', data); 

次のように:

console.log('SVG\'s NS before insertion: ' + svgid.namespaceURI); 
svgid.insertAdjacentHTML('beforeend', data); 
console.log('SVG\'s NS after insertion: ' + svgid.namespaceURI); 
pathEl = document.getElementById('lineAB'); 
console.log('PATH\'s NS (after insertion): ' + pathEl.namespaceURI); 

を下記のFirefox 35かでそれを試してみてください。これは、SVG要素のネームスペースが、insertAdjacentHTMLの呼び出しの前後にあり、PATH要素の名前空間が挿入された後の名前空間を確認するためのものです。

this JSFiddleも試してみることができます。これには上記の修正が含まれています。

遭遇したことは、this bug reportに関連しています。このバグの修正はFirefox 36に上陸しました.Firefox 36までは、SVG要素の内部HTMLを混乱させると、その要素の推測されたsvg名前空間を尊重しません。挿入される要素はxhtml名前空間に属します。それでは、HTML要素としてPATH要素#lineABは意味をなさないので、ページから消えてしまいます。しかし、挿入されたPATH要素の名前空間(xhtml)はDOMに表示されないため、ページを保存するときに保存されないため、(私の推測です)したがって、保存されたページを開くと、PATH要素の名前空間が正しく推測され(SVG要素を継承している可能性があります)、結果としてSVGが表示されます。

上記のバグレポートの複製は、this bug reportであり、ここでより詳細な情報を得るために提供されています。

私はアプローチがVistaとFirefoxの35を使用して、市販のクロスブラウザテストプラットフォームで上に示唆してみました(私はあまりにも危険な住みたい)とコンソールログはsvg/svg/xhtmlました。 Firefox 36を使用してコンソールログはsvg/svg/svgでした。

var svgid = document.getElementById('svg_main'); 
var str_lne = 60; 
var pathEl = document.createElementNS('http://www.w3.org/2000/svg', 'path'); 
pathEl.setAttribute('id', 'lineAB'); 
pathEl.setAttribute('d', 'M 50 ' + str_lne + ' L 1050 ' + str_lne); 
pathEl.setAttribute('transform', 'translate(0.5,0.5)'); 
pathEl.style.stroke = '#707073'; 
pathEl.style.strokeWidth = '1px'; 
svgid.appendChild(pathEl); 

JSFiddle here:SVGへのパスを追加するためのFirefox 35で動作何

はこれです。つまり、要素を明示的に作成し、HTMLを直接挿入しないでください。

今、100万ドルの質問があります。 Firefox 35以降を気にかけているのはなぜですか?

+0

今私は科学プロジェクトに取り組んでいます。私は生物学者のためのツールを開発しています。私は科学者のほとんどが古いバージョンのOS(windows xp、fedora 14のようなもの)と古いバージョンのブラウザ(私はIEを考慮していない)を持っているのを見ました。時間がないので、「あなたのシステムをアップデートして、最新のバージョンのfirefoxをインストールしてください」と言うことはできません。彼らは結果だけを望む。その理由は私がすべてのブラウザを気にしているからです。 – mkHun

+1

@mkHunおそらくダイナミクスのために、あなたは厳しい状況にあることを理解しています。しかし、あなたはそれを慎重に扱うべきです。不足している古いブラウザとの互換性を保つために多くの時間を費やすことがあります。公共のために何か商業的なものを開発していれば、おそらく意味をなさないでしょう。しかし、それを目標にして、私はあなたがSVGを自由にコーディングしたいと思えば、ブラウザの最小バージョン(あなたの場合はFirefox 36)を必要とするのは当然のことだと信じています。それとも、これがFirefox上でテストされたことを宣言するのか?大きな変化はそれほど頻繁ではありません。とにかく、あなたの呼び出しです。 – xnakos

+0

'appendchild'は、firefox 35以降のバージョンで動作しています。 :) – mkHun

3

あなたのコードはFirefoxで正常に動作します。あなたはタイプミス(storke-width)があるという事実を別にします。

var svgid = document.getElementById('svg_main'); 
 
var str_lne = 60; 
 
var data = '<path id="lineAB" d="M 50 '+str_lne+' L 1050 '+(str_lne)+'" transform="translate(0.5,0.5)" stroke="#707073" fill="none" stroke-width="1px" opacity="1" ></path>'; 
 
svgid.insertAdjacentHTML('beforeend',data);
<div style="height:330px; width:1100px; background:#313131; margin:0 auto; "> 
 
    <svg id='svg_main' height="330" width="1100"></svg> 
 
</div>

+0

私はそれを試みたが、動作しません。私は自分の質問を編集しました – mkHun

関連する問題