2016-04-28 1 views
0

私はこのコードを使用している間:ありません(.was_added)、遅すぎるので、逆の方法でそれをやって:ループ行為二回JS

var list = was_talkWindows.querySelectorAll('.msg:not(.was_added)'); 
var i; 
for (i = 0; i < list.length; i++) 
{ 
    list[i].className += cssClass; 

    var btn = document.createElement('button'); 
    btn.setAttribute('type', 'button'); 
    btn.setAttribute('class', 'was_addButton'); 
    btn.addEventListener('click', function() { 
     was_button_act(this.parentElement); 
    }); 
    btn.innerHTML = buttonName; 
    list[i].appendChild(btn); 
} 

しかし、友人は.MSGがいることを私に言いました

var cssClass = ' was_added'; var buttonName = 'start waiting'; if (was_set_standby_auto == true) { cssClass += ' was_standby'; buttonName = 'cancel'; } try { var currectMSG = was_talkWindows.querySelector('.msg:last-child'); while (currectMSG.classList.contains('was_added') == false) { currectMSG.className += cssClass; var btn = document.createElement('button'); btn.setAttribute('type', 'button'); btn.setAttribute('class', 'was_addButton'); btn.addEventListener('click', function() { was_button_act(this.parentElement); }); btn.innerHTML = buttonName; currectMSG.appendChild(btn); currectMSG = currectMSG.previousElementSibling; } } catch (err) {} 

ただし、コードは最後に2回ボタンを2回追加します。

この動作を実際に理解していません。

+0

質問には関係ありませんが、セレクタの最初の一致を取得するために '[0]'を使用する場合は、 'querySelectorAll'の代わりに' querySelector'を使うことができます。 – Barmar

+0

元のコードがあなたの望みどおりに機能していれば、それだけに固執するべきだと思います。何百もの '.msg'要素を持たない限り、':not(.was_added) 'のパフォーマンスはおそらく目立った違いを生むことはありません。 – Barmar

+0

は、サーバがますます多くの '.msg'を作成する時を過ぎています。それが私が他の方法を試している理由です。 (最初のやり方では何回か起こったことがあります) –

答えて

0

あなたのコントロール下にないサイトの問題、それは常に動作しているかわかりませんし、それは問題がボタンを追加されていないことを実現するために私に長い時間がかかりました二度(論理に対して)、同時にコードを編集しない人は誰でも。

ので、一度だけ宣言:

var was_msgList = was_talkWindows.getElementsByClassName('msg'); 

とループ(2秒ごと):

for (var i=was_msgList.length; i-- && was_msgList[i].getAttribute('data-status') == null;) 
{ 
    was_load_addButton(was_msgList[i],attStatus,buttonText); 
} 

変更のための任意のアイデアは歓迎されています。

0

previousSiblingの代わりにpreviousElementSiblingを使用して、テキストノードをスキップします。

さらに、was_addedクラスを要素に追加すると、後で処理されないようになります。

var was_talkWindows = document; 
 
var cssClass = " newclass"; 
 
var buttonName = "Click me"; 
 

 
try { 
 
    var currectMSG = was_talkWindows.querySelectorAll('.msg:last-child')[0]; 
 

 
    while (currectMSG.classList.contains('was_added') == false) { 
 
    currectMSG.className += cssClass; 
 
    currectMSG.classList.add('was_added'); 
 

 
    var btn = document.createElement('button'); 
 
    btn.setAttribute('type', 'button'); 
 
    btn.setAttribute('class', 'was_addButton'); 
 
    btn.addEventListener('click', function() { 
 
     was_button_act(this.parentElement); 
 
    }); 
 
    btn.innerHTML = buttonName; 
 
    currectMSG.appendChild(btn); 
 

 
    currectMSG = currectMSG.previousElementSibling; 
 
    } 
 
} catch (err) {}
<ol> 
 
    <li class="msg was_added">Text</li> 
 
    <li class="msg was_added">Text</li> 
 
    <li class="msg">Text</li> 
 
    <li class="msg">Text</li> 
 
    <li class="msg">Text</li> 
 
</ol>

+0

ループ内でコードが実行されます。だからそれは二度起こったのです –

+0

2回起こるのを防ぐために何が必要ですか?ループは、 'was_added'クラスを持たない要素を探します。多分、そのクラスを 'currectMSG'に追加して、それを繰り返さないようにしてください。 – Barmar

+0

'was_added'は' cssClass'にあるはずですか?あなたの元のコードは、それが何であるかを示していませんでした。 – Barmar