2011-09-13 14 views
1

私は、Firefox(Greasemonkey)、Opera、およびChrome用のブラウザプラグインをWebサイト用のJavascriptで作成しています。私は変数にdocument.innerHTMLをロードする際に問題が、Javascriptでdocument.innerHTMLを使用した自己閉鎖タグの問題

<form name="foo" action="foo.php" method="get"> 
<td id="td">text: 
**<input name="k" type="text">** 
&nbsp;</td> 
に変換され

<form name="foo" action="foo.php" method="get"> 
<td id="td">text: 
<input name="k" type="text" /> 
&nbsp;</td> 
</form> 

...(私はプラグインのために書いています)のウェブサイトの上の元のコードです

...これです。ご覧のとおり、自己閉鎖<input />タグはもう閉じず、</form>タグも消えました。私はほとんどすべてのインターネットを探知していますが、私が読んだ解決策のどれも私の問題を解決しませんでした。

+1

私が知る限り、この方法で元のページソースを取得する方法(または少なくとも動作することが保証されている方法)はありません。 innerHTMLを要求すると、ブラウザはDOM要素のコンテンツのHTMLシリアル化を行います。 XMLHTTPRequestを介してページを読み込むことはできますが、それはおそらくあなたの後ではありません。 –

+0

なぜそれは問題ですか?ブラウザーが要素をHTMLマークアップとして表現する方法は、実際には何にも影響しません。 ' '要素の性質は子孫を持たないことです。 '/> 'の欠如はそれを変えない。 – user113716

+0

''タグはHTMLでは閉じている必要はなく、実際にはHTMLの自己閉じタグは構文的には間違いです。 – Pointy

答えて

4

.innerHTMLを取得すると、終了時に</form>タグがFirefoxに表示されます。

私は行方不明タグが、私はかなり確信しているあなたのマークアップに起因することをお勧めしたい無効です:

<!-- A <form> wrapping a <td> ? --> 
<form name="foo" action="foo.php" method="get"> 
    <td id="td">text: 
     <input name="k" type="text" /> 
     &nbsp; 
    </td> 
</form> 

<td>要素の親が<tr>、ない<form>でなければなりません。このマークアップを考えると

<table> 
    <tr> 
     <form name="foo" action="foo.php" method="get"> 
      <td id="td">text: 
       <input name="k" type="text" /> 
       &nbsp; 
      </td> 
     </form> 
    </tr> 
</table> 

を... Firefoxは私に<table>ため、このinnerHTMLを与える:

<tbody> 
    <tr> 
     <form name="foo" action="foo.php" method="get"></form> 
      <td id="td">text: 
       <input name="k" type="text"> 
       &nbsp; 
      </td> 

    </tr> 
</tbody> 

それは無効なマークアップの修正を試みます。

DEMO:http://jsfiddle.net/grM4c/

+0

最初の投稿にコードを部分的に貼り付けましたが、もちろん上記のところには「」があります。しかし、あなたのメッセージからわかるように、「​​」を置く前に必ず「」が必要ですか?また、上記のように、私はサードパーティのプラグインをWebサイト用に作成していますが、私は管理者ではないので、元のコードを変更することはできません。私はこれを行うにはjavascriptで方法を見つけることを試みています。 – Nail

+0

OK、これを見てください。http://jsfiddle.net/UQ4jj/ OperaとFirefoxの両方で同じ出力が得られます。ちなみに、HTML部分は、私の最初の投稿のコードとは違って、ウェブサイトの元々のコードです(先頭にあるテーブルタグを除いて、最後はjavascript部分に保管しました)。 – Nail

+0

@Nail:はい、同じ問題です。マークアップは無効です。無効なHTMLマークアップに決して頼ることはできません。サイトに '

​​'がある場合、サイトは不適切にコード化されており、管理者が修正する必要があります。現在のレンダリングで動作するJavaScriptソリューションが見つかったとしても、Firefoxは次のリリースで無効なマークアップをレンダリングする方法を変更して元の修正を失敗させる可能性があります。 – user113716

0

まあ、あなたのコードの表情を取って、あなたが途中で閉じられていないTDでフォームを作成する気に。

<form name="foo" action="foo.php" method="get"> 
<td id="td"><span>text:<input name="k" type="text" /></span></td> 
</form> 

この方法を試してください。

+1

質問のコード_does_にある「​​」には、対応する終了タグがあります。 ''ではなく '

'の子であるべきですが、閉じられています。 – nnnnnn

+0

はい@nnnnnnが正しいと私は管理者ではないウェブサイトのサードパーティの拡張機能を書いています。このため、私はHTML部分を変更することができないので、Javascriptで解決策を見つけなければならないということです。 – Nail

+0

right @nnnnn、私は間違ったことを見ましたが、私はコードを書くことに失敗します。 – vtortola

関連する問題