2011-01-19 6 views
0

最初の謝罪、私はパスワードの後ろに取り組んでいるページ、これで十分だと思っていますが、より多くのコードをご希望の場合は、尋ねてください!insertBeforeとIE7

イベントをリストするWebページがあります。各イベントは、すべて相対配置されたdiv、eventRowにラップされた複雑な要素のセットです。

新しいイベントを追加するとき、私はそれが置かれるべき場所を見つけて、使用:

document.getElementById('eventRows').insertBefore(div, document.getElementById('eventRow' + id)); 

divが新しいイベント行で、idは私が前に挿入するイベントのIDです!

これはChrome、Safari、Firefox、IE8では完全に機能しますが、IE7では間違っています - 新しいイベント行は正しく配置されているようですが、それを囲む行は正しく移動されず、重複するテキストの混乱。 、以下のいずれかの考えを

$('eventRows').innerHTML = $('eventRows').innerHTML; 

だから私はほとんどそれを解決してきましたが、私はとても満足していない:私はこのコードを使用して、挿入した後、固定することができたしばらく

質問:

これは機能するようにしてください。

ブラウザがIE7の場合のみ行う必要がありますか?

私はより良い修正を見つけるべきでしょうか?

多くの感謝

ベン。

+0

上記の最初のjQueryの例では、 ')'が終わっていないと思います。これはちょうどここのケースか、あなたのコードにも当てはまりますか? – Sampson

+0

正解 - 明確にするためにコードを整理しました - 私は質問を編集しました –

答えて

1

再描画を強制することができます。

  • 私はそれを試したことがありませんが、あなたは
  • node.className = node.classNameを記述する1つが動作すると報告されています。私は考えることができるいくつかの方法があります。
  • テキストノードを追加します。
  • クラスを追加して削除します。
  • 他のスタイルの変更を行い、その後、それらを削除する(パディング、ボーダー、マージン)

は、テキストノードを追加します。

function redraw(node) { 
    var doc = node.ownerDocument; 
    var text = doc.createTextNode(' '); 
    node.appendChild(text); 
    setTimeout(function() { 
    node.removeChild(text); 
    },0); 
} 

削除/クラスを追加します

function redraw(node) { 
    node.className += ' redraw'; 
    setTimeout(function() { 
    node.className = node.className.replace(/\sredraw$/, ''); 
    }, 0); 
} 

この私はIE7を持っていないので、コードはテストされていません。

これらのメソッドは、そこにあるさまざまなライブラリにも存在します。 Extの場合はElement.repaint()です。 jquery:http://plugins.jquery.com/content/forceredraw-102のforce_redrawプラグインがあります。私は他の人がいると確信しています、私はそれらについて知らないだけです。

+0

1つの例外を除いてすべてが動作する(className = classNameを含む)すべての提案をテストしました - 私はinnerHTML = innerHTMLをしない限り表示されない唯一のAP divはありません - 私はこれに固執する必要がありますか?動作しているブラウザを除外すべきですか? –

+0

@Ben私は、AP部門が問題になる可能性があることを読みました。そこに解決策があるのを思い出します。私は周りを見てみましょう。 – Hemlock

+0

@Benあなたは[force_redraw?](http://plugins.jquery.com/files/jquery.forceredraw-1.0.2.js_.txt)のソースを見ましたか?次にパディングを削除する)メソッドは、絶対配置されたノードを処理します。それを試してみたら(そしておそらくマージンを持つバージョン)、 'innerHTML'メソッドに固執すべきだと思いますが、パフォーマンス上の問題がある場合は作業用のブラウザをフィルタリングするだけです。 – Hemlock

0

くらい、私は次のために盛り上がりまし演奏後:

function redrawElement(e) { 
    if (/MSIE (\d+\.\d+);/.test(navigator.userAgent) && new Number(RegExp.$1) <= 7) { 
     e.innerHTML = e.innerHTML 
    } 
} 

他のアイデアの多くはほとんど働いていた、しかしかなり、パディングアイデアはかつて働いたが、タイムアウトと厄介なジャンプを引き起こし、このパフォーマンスに関して問題があるとは思われません。なぜそうではありませんか? :-)

ありがとうございます!