【问题标题】:Jquery conflict when two of the same on one page一页上两个相同时的Jquery冲突
【发布时间】:2014-01-06 14:38:33
【问题描述】:

我与添加到 wordpress 后端的 jQuery 功能发生冲突。可以选择将其中两个功能添加到页面,但是当有两个时,第一个有效,第二个无效。他们都必须共享相同的类和 ID

这是我的小提琴:http://jsfiddle.net/yQMvh/39/

HTML

<div class="plugin">
<div class="iconDisplay">Display's selected icon</div>
<span id="selectedIcon" class="selected-icon"></span>

<button id="selectIconButton">Select Icon</button>
<div id="iconSelector" class="icon-list">
    <div id="iconSearch">
        <label for="icon-search">Search Icon: </label>
        <input type="text" name="icon-search" value="">
    </div>
    <span class="icon-orange"></span>
    <span class="icon-teal"></span>
    <span class="icon-icon3"></span>
    <span class="icon-icon4"></span>
    <span class="icon-icon5"></span>
    <span class="icon-icon6"></span>
    <span class="icon-icon7"></span>
    <span class="icon-tealer"></span>
    </div>
</div>

<div style="height: 50px"></div>


<div class="plugin">
<div class="iconDisplay">Display's selected icon</div>
<span id="selectedIcon" class="selected-icon"></span>

<button id="selectIconButton">Select Icon</button>
<div id="iconSelector" class="icon-list">
    <div id="iconSearch">
        <label for="icon-search">Search Icon: </label>
        <input type="text" name="icon-search" value="">
    </div>
    <span class="icon-orange"></span>
    <span class="icon-teal"></span>
    <span class="icon-icon3"></span>
    <span class="icon-icon4"></span>
    <span class="icon-icon5"></span>
    <span class="icon-icon6"></span>
    <span class="icon-icon7"></span>
    <span class="icon-tealer"></span>
    </div>
</div>

jQuery

var iconVal = $(".icon_field").val();
$('#selectedIcon').addClass(iconVal);

$("#selectIconButton").click(function () {
  $("#iconSelector").fadeToggle();
});

$("#iconSelector span").click(function () {
  selectIcon($(this));
});

function selectIcon(e) {
 var selection = e.attr('class');
 $(".icon_field").val(selection);
 $("#iconSelector").hide();
 $('#selectedIcon').removeClass();
 $('#selectedIcon').addClass(selection).show();
 return;
}

$('input[name="icon-search"]').keyup(function(){
  var sValue = $(this).val().toLowerCase();

$.each($('span'), function(){
    if($(this).attr('class').indexOf(sValue)===-1){
     $(this).fadeOut(0);   
    }else{
     $(this).fadeIn(0);   
    }
  });

});

【问题讨论】:

  • 如果你给两个元素相同的“id”值,所有的赌注都被取消了,jQuery 根本无法正常工作。
  • @OGDEV1990 - HTML DOM 不允许多个元素具有相同的 ID。再多的 jQuery 或 JavaScript 都无法解决这个问题。
  • 我明白了。我设法解决了其中的一些问题,但事情并非一团糟。 jsfiddle.net/yQMvh/43
  • 您仍在重复使用 ID。而不是使用 id,分配类,然后尝试研究同级选择器,或者重组 HTML 以便可以使用子选择器。

标签: php javascript jquery html wordpress


【解决方案1】:

cmets 中明确指出了这个问题。 ID 在任何给定页面上都必须是唯一的。 id="iconSelector" - 只需将其作为一个类与icon-list 一起添加,它看起来就像class="iconSelector icon-list"。通过使用标准的 jQuery 选择器技术,您应该仍然能够根据需要与 DOM 交互。

他们都必须共享相同的类和 ID

这个要求是不合逻辑的。你必须重新设计你的流程。

在此过程中帮助您的小建议 - 您可以利用 $(this) 了解哪个 DOM 元素触发了事件 - 因此您无需担心 ID

【讨论】:

    【解决方案2】:

    它不是很花哨,但这就是你要找的功能吗?

    http://jsfiddle.net/ccarterc1984/RfW69/

    CSS:

    #iconSelectionBox{
        width:250px;
        height:250px;      
        background-color: gray;
        position:absolute;
        display:none;          
    }
    #icon1{
        background-color:blue;        
    }
    #icon2{
        background-color:black;        
    }
    #icon3{
        background-color:green;        
    }
    #icon4{
        background-color:purple;        
    }
    .icon{        
        height:50px;
        width:50px;
        float:left;
    }
    

    HTML:

    <div id="iconSelectionBox">
        <input type="text" id="searchBox" /><br/>
        <div id="icon1" class="icon"></div>
        <div id="icon2" class="icon"></div>
        <div id="icon3" class="icon"></div>
        <div id="icon4" class="icon"></div>
    </div>
    
    <button class="selectButton">Select Icon</button>
    <button class="selectButton">Select Icon</button>
    
    <br/>
    <div id="messageBox"></div>
    

    jQuery:

    $('button.selectButton').live('click', function(){
        var iconBox = $('#iconSelectionBox');
        var buttonPos = $(this).position();
    
        iconBox.show().css('top', buttonPos.top + 100).css('left', buttonPos.left);
    });
    
    $('div.icon').live('click', function(event){
        var clickedId = event.target.id;
    
        $('#messageBox').text("You clicked the icon with id: " + clickedId);
    
        $('#iconSelectionBox').hide();
    });
    

    【讨论】:

      【解决方案3】:

      使用类或元素类型而不是 id。必要时添加类。例如,

      $('#selectedIcon').addClass(iconVal);
      

      变成

      $('.selected-icon').addClass(iconVal);
      

      --

      $("#selectIconButton").click(function () {
        $("#iconSelector").fadeToggle();
      });
      

      变成

      $("button").click(function () {
        $(".icon-list").fadeToggle();
      });
      

      如 cmets 中所述,您不能使用多个 id。

      完整示例:

      HTML

      <div class="plugin">
          <div class="iconDisplay">Display's selected icon</div>
          <span id="selectedIcon" class="selected-icon"></span>
      
          <button id="selectIconButton">Select Icon</button>
          <div id="iconSelector" class="icon-list">
              <div id="iconSearch">
                  <label for="icon-search">Search Icon: </label>
                  <input type="text" name="icon-search" value="">
              </div>
              <span class="icon-orange"></span>
              <span class="icon-teal"></span>
              <span class="icon-icon3"></span>
              <span class="icon-icon4"></span>
              <span class="icon-icon5"></span>
              <span class="icon-icon6"></span>
              <span class="icon-icon7"></span>
              <span class="icon-tealer"></span>
          </div>
      </div>
      
      <div style="height: 50px"></div>
      
      
          <div class="plugin">
          <div class="iconDisplay">Display's selected icon</div>
          <span id="selectedIcon" class="selected-icon"></span>
      
          <button id="selectIconButton">Select Icon</button>
          <div id="iconSelector" class="icon-list">
              <div id="iconSearch">
                  <label for="icon-search">Search Icon: </label>
                  <input type="text" name="icon-search" value="">
              </div>
              <span class="icon-orange"></span>
              <span class="icon-teal"></span>
              <span class="icon-icon3"></span>
              <span class="icon-icon4"></span>
              <span class="icon-icon5"></span>
              <span class="icon-icon6"></span>
              <span class="icon-icon7"></span>
              <span class="icon-tealer"></span>
          </div>
      </div>
      

      JQUERY

      var iconVal = $(".icon_field").val();
      $('.selected-icon').addClass(iconVal);
      
      $("button").click(function () {
        $(this).siblings(".icon-list").fadeToggle();
      });
      
      $(".icon-list span").click(function () {
          selectIcon($(this));
      });
      
      function selectIcon(e) {
          var selection = e.attr('class');
          $(".icon_field").val(selection);
          e.parent().hide();
          e.parent().siblings('#selectedIcon').removeClass();
          e.parent().siblings('#selectedIcon').addClass(selection).show();
          return;
      }
      
      $('input[name="icon-search"]').keyup(function(){
         var sValue = $(this).val().toLowerCase();
      
          $.each($('span'), function(){
              if($(this).attr('class').indexOf(sValue)===-1){
               $(this).fadeOut(0);   
              }else{
               $(this).fadeIn(0);   
              }
          });
      
      });
      

      【讨论】:

      • 取得了一些进展,但事情仍在进展中! jsfiddle.net/yQMvh/43
      • 里面还有一些使用id的,比如$("#iconSelector span")应该是$(".icon-list span")。还有其他的;)
      • 试试这个尺寸 - jsfiddle.net/j4aS7/7 - 这就是你想要的吗?
      猜你喜欢
      • 2012-11-24
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 2014-06-27
      • 1970-01-01
      • 2020-06-05
      相关资源
      最近更新 更多