2017-12-29 40 views
0

WordPressに投稿のループがあり、clickイベントでjqueryを呼び出そうとしています。クリックするとその投稿の連絡フォームが表示されます。ポストループ内でJQuery onclick関数のエラーが発生しました

onclickショーは、そのポストの連絡先フォームを問題なく表示するループ内の最初のポストでのみ機能しますが、ループ内の他のポストでは機能しません。なぜこれがあるのか​​誰にでも分かりますか?ポストループのあるページはhttps://www.salusa.co.uk/specialist-training-courses/です。

コードはおおよそである:

<div class="archive-posts-loop"> 

<div class="post"> 
    <div class="enquire">    
     <a class="show-form">Contact Provider</a>     
    </div> 

<div class="contact-form-wrapper" id="contact-form-wrapper" style="display:none;"> 
</div> 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> 

<script> 

$(document).ready(
function(){ 

    $(".show-form").click(function() { 
     $("#contact-form-wrapper").show("fast"); 
    }); 
    $("#close").click(function() { 
     $("#contact-form-wrapper").hide("fast"); 
    }); 
}); 

</script> 


</div><!--post--> 


<div class="post"> 
    <div class="enquire">    
     <a class="show-form">Contact Provider</a>     
    </div> 

<div class="contact-form-wrapper" id="contact-form-wrapper" style="display:none;"> 
</div> 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> 

<script> 

$(document).ready(
function(){ 

    $(".show-form").click(function() { 
     $("#contact-form-wrapper").show("fast"); 
    }); 
    $("#close").click(function() { 
     $("#contact-form-wrapper").hide("fast"); 
    }); 
}); 

</script> 

</div><!--post--> 

</div><!--archive-post-loop--> 
+2

を変更。代わりにHTMLクラスを使用してください –

+0

ありがとうございました。有益です - 私はクラスセレクタに変更しました。そして今度は他の各ボタンが連絡フォームを開きます。問題は、ボタンが配置されているポストではなく、ループ内の最初のポストの連絡フォームをすべて開いていることです。何か案は? –

+1

投稿した例には1つの投稿しかないので、何が起きているのか分かりにくいです。 2つの投稿でコードを表示できますか?ちょうど文脈の中で "最初の投稿"が何を意味するかを知るために –

答えて

1

投稿ごとに新しいフォームがあるので、投稿の正しいフォームをターゲットにする必要があります。委任されたクリックイベントをリッスンし、それに応じてネストされたフォームを表示/非表示できます。あなたの例に示されているように、各フォームに対してスクリプトを繰り返す必要はありません(また、そうする必要もありません)。ここで

$(function(){ 
 

 
    $(".post") 
 
     .on("click", ".show-form", function() { 
 
      $(this).parents(".post").find(".contact-form-wrapper").show("fast"); 
 
     }) 
 
     .on("click", ".close", function() { 
 
      $(this).parent().hide("fast"); 
 
     }); 
 
     
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div class="post"> 
 
    <div class="enquire">    
 
     <a class="show-form">Contact Provider</a>    
 
    </div> 
 
    <div class="contact-form-wrapper" id="contact-form-wrapper" style="display:none;"> 
 
     [Form here] <a href="#" class="close">close</a> 
 
    </div> 
 
</div> 
 

 
<div class="post"> 
 
    <div class="enquire">    
 
     <a class="show-form">Contact Provider</a>    
 
    </div> 
 
    <div class="contact-form-wrapper" id="contact-form-wrapper" style="display:none;"> 
 
     [Form here] <a href="#" class="close">close</a> 
 
    </div> 
 
</div> 
 

 
<div class="post"> 
 
    <div class="enquire">    
 
     <a class="show-form">Contact Provider</a>    
 
    </div> 
 
    <div class="contact-form-wrapper" id="contact-form-wrapper" style="display:none;"> 
 
     [Form here] <a href="#" class="close">close</a> 
 
    </div> 
 
</div>

+0

ありがとうMoob。申し訳ありませんが、連絡フォームが投稿内にある場合は、トリガーボタンが配置されている現在の投稿内のフォームをターゲットにするようにJqueryを設定しています。現在、jqueryは、すべて同じIDを持つため、最初の投稿からフォームを開いています。 –

+0

@ Matt-SalusaCommunityああ、私はあなたの質問にあなたのサンプルコードを更新しました。私はそれに応じて私の答えを更新します... – Moob

+0

@ Matt-SalusaCommunity最新の例をご覧ください。 – Moob

0

あなたがcontact-form-wrapperの同じIDを持つ複数の要素を使用しています。代わりに、各要素に一意のIDを設定し、それぞれのjquery呼び出しでそのIDを選択する必要があります。 Jqueryは、セレクタが指定されている最初の一致する要素を返します。なぜなら、そのたびに最初の投稿のみが選択されるからです。

+0

ありがとうございます。私はループ内の各投稿に1つのテンプレートを使用し、なぜ彼らはすべて同じIDを持っているのですか?ループ内の新しいポスト内のIDを動的に設定する方法を知っていますか?そして、jquery関数でその動的IDをどのように選択するのですか? –

+0

テンプレート作成には何を使用していますか?私は、インターレーター変数を追跡してIDに追加する方法があると思います。 – csp713

+0

Wordpress内でPHPループテンプレートを使用する。私は確かに、方法がまだわからないのは確かだ。ありがとう、M –

0

何をしたいんcodepenです。

https://codepen.io/abidhasan/pen/wpdoyO?editors=1111

これは、あなたが使用できるjQueryのである - 基本的にあなたがショー形式のIDを使用している兄弟を探して、そのスタイル

$(".post .show-form").on("click", function() { 
    $(this).parent().siblings()[0].style.display= "block"; 
}); 

$(".post .hide-form").on("click", function() { 
    $(this).parent().siblings()[0].style.display= "none"; 
}); 
関連する問題