1

したがって、純粋な HTML では、(ユーザーを結果 URL に移動する代わりに) 結果を iframe にロードするフォームを作成できます。

<html>
  <head>
    <title>Google Preview</title>
    <style>iframe { width: 800px; height: 600px }</style>
  </head>
  <body>
    <form method='get' action='http://www.google.com/search' target='results'>
      <label for='q'>Google Search:</label>
      <input name='q'/>
    </form>
    <!-- form result loads in this iframe -->
    <iframe name='results'></iframe>
  </body>
</html>

私は Greasemonkey で同様のことをしようとしていますが、問題が発生しています。

結果をiframeにロードしたいフォームを含むページがあるので、iframeを作成し、targetiframeの名前に一致するようにフォームを変更します。ただし、これは結果ページを iframe にロードせず、結果ページを新しいタブで開きます。

Javascript を使用して iframe を作成するまで問題を突き止めました。iframe を DOM に問題なく挿入しているようです (また、firebug を見ると、生成されたソースは、追加の<script>タグを除いて上記とほぼ同じです)。しかし、Javascript で iframe を作成すると、「新しいタブで結果を開く」動作が発生します。

<html>
  <head>
    <title>Google Preview</title>
    <style>iframe { width: 800px; height: 600px }</style>
  </head>
  <body>
    <form method='get' action='http://www.google.com/search' target='results'>
      <label for='q'>Google Search:</label>
      <input name='q'/>
    </form>
    <script>
      try {
        // form result doesn't load in this iframe, for some reason
        const iframe = document.body.appendChild( document.createElement('iframe') );
        iframe.name = 'results';
      } catch (e) {
        alert(e);
      }
    </script>
  </body>
</html>

Javascript で作成された iframe に結果を読み込むにはどうすればよいですか? (私はまだ試しdocument.write()ていませんが、Greasemonkey から非常に役立つかどうかはわかりません)。

更新:だから私は試してみましたがdocument.write()、うまくいきました。したがって、GreaseMonkey からそれを使用する方法を理解する必要があるかもしれません (ハンドルを持っている多数の DOM 要素を台無しにすることはありません)。

<html>
  <head>
    <title>Google Preview</title>
    <style>iframe { width: 800px; height: 600px }</style>
  </head>
  <body>
    <form method='get' action='http://www.google.com/search' target='results'>
      <label for='q'>Google Search:</label>
      <input name='q'/>
    </form>
    <script>
      try {
        // but form result will load in this iframe
        document.write('<iframe name="results"></iframe>');
      } catch (e) {
        alert(e);
      }
    </script>
  </body>
</html>

document.body.appendChild()なぜうまくいかないのか知りたいのですが、うまくいきdocument.write()ます。

更新2 : 単なるフォームではないようです。代わりにリンクを代入して、<form>...</form>3 つのケースすべてで同じ結果を得ることができます

<div><a target="results" href="http://www.google.com">test</a></div> 
4

2 に答える 2

1

さて、私は満足のいく解決策を見つけました。を呼び出すにiframe 名を定義する必要がありますappendChild()

<html>
  <head>
    <title>Google Preview</title>
    <style>iframe { width: 800px; height: 600px }</style>
  </head>
  <body>
    <div><a target="results" href="http://www.google.com">test</a></div>
    <script>
      try {
        // this works
        const iframe = document.createElement('iframe');
        iframe.name = 'results';
        document.body.appendChild( iframe );
      } catch (e) {
        alert(e);
      }
    </script>
  </body>
</html>

ドキュメントに名前を追加した後に名前を設定してもうまくいかなかった理由はわかりません (そして、15pts を求める人がいるかどうかを知りたいのですが)、これで GreaseMonkeying を続けることができるので、十分です。 .

于 2009-05-23T04:00:55.177 に答える
-1

うーん、それはまだそれ自体にポストバックしているため、フレームが作成されないため、考えています(ポストバックごとにフォームが作成され、ページにレンダリングされるため)

于 2009-05-22T18:29:52.277 に答える