【问题标题】:Multiple jQuery Scripts in one HTML page Not working together一个 HTML 页面中的多个 jQuery 脚本不能一起工作
【发布时间】:2019-11-27 03:43:43
【问题描述】:

我有一个带有 3 个 jQuery 脚本的 HTML 代码,但它们不能正常协同工作 有人可以帮我解决这个问题吗

我解决了这个问题,因为我没有任何 jQuery 经验

我该如何解决这个问题?

更新它现在可以工作,但一次只有一个下拉菜单,我怎样才能让它们一起工作

  <!DOCTYPE html>
<html>
<head>
</head>
<body>
Availabe Restaurants:
<br>
Burgers:

  <label><input type="radio" name="test" value="Garage" /> Burger Garage</label>
   <label><input type="radio" name="test" value="Burger" /> Hardee's</label>
  <label> <input type="radio" name="test" checked="checked" value="Factory" /> Burger Factory & More</label>
    <br>
    <select ID="DropDownList2" Height="18px" Width="187px">
        <option Value="Factory_Style_1">Turbo Chicken</option>
        <option Value="Factory_Style_2">Twin Turbo Chicken</option>
        <option Value="Factory_Style_3">Garage Burger</option>
        <option Value="Burger_Style_1">Chicken Fille</option>
        <option Value="Burger_Style_2">Grilled Chicken Fillet</option>
        <option Value="Burger_Style_3">Jalapeno Chicken</option>
        <option Value="Garage_Style_1">Original Burger</option>
        <option Value="Garage_Style_2">Twin Turbo Chicken</option>
        <option Value="Garage_Style_3">Shuwa Burger</option>
    </select>
    <br>

Desserts:

    <label><input type="radio" name="test1"  checked="checked" value="Dip" /> Dip N Dip</label>
   <label><input type="radio" name="test1" value="Camel" /> Camel Cookies</label>
  <label> <input type="radio" name="test1" value="Ravenna" /> Ravenna Kunafa</label>
    <br>
    <select ID="DropDownList3" Height="18px" Width="187px">

        <option Value="Dip_Style_1">Brownies Crepe</option>
        <option Value="Dip_Style_2">Fettuccine Crepe</option>
        <option Value="Dip_Style_3">Cream Puff Pyramid</option>
        <option Value="Camel_Style_1">Brownie Fondant</option>
        <option Value="Camel_Style_2">Lotus Pancake</option>
        <option Value="Camel_Style_3">Camel Lava</option>
        <option Value="Ravenna_Style_1">Konafa With Chocolate</option>
        <option Value="Ravenna_Style_2">Konafa Mabrooma With Cheese</option>
        <option Value="Ravenna_Style_3">Konafa Mabrooma With Cream</option>
    </select>
    <br>
Beverages:
<option>Dr.Shake</option>
<option>Juice Lab</option>
<option>Aseer Time</option>
  <label><input type="radio" name="test2"  checked="checked" value="Dr" />Dr.Shake</label>
   <label><input type="radio" name="test2" value="Juice" /> Juice Lab</label>
  <label> <input type="radio" name="test2" value="Aseer" /> Aseer Time</label>
    <br>
    <select ID="DropDownList4" Height="18px" Width="187px">

        <option Value="Dr_Style_1">Pressure Milkshake</option>
        <option Value="Dr_Style_2">Thermometer Milkshake</option>
        <option Value="Dr_Style_3">Brain Recovery Milkshake</option>
        <option Value="Juice_Style_1">G Lab</option>
        <option Value="Juice_Style_2">Summer Vimto</option>
        <option Value="Juice_Style_3">Summer Bubble Gum</option>
        <option Value="Aseer_Style_1">Hormone Happiness</option>
        <option Value="Aseer_Style_2">The King</option>
        <option Value="Aseer_Style_3">Berry Smothey</option>
    </select>
    <script src="https://code.jquery.com/jquery-latest.min.js"></script>
<script>
(function(){
var options = $("#DropDownList2").html();
$('#DropDownList2 :not([value^="Fac"])').remove();
$('input:radio').change(function(e) {
    var text = $(this).val();
    $("#DropDownList2").html(options);
    $('#DropDownList2 :not([value^="' + text.substr(0, 3) + '"])').remove();});
    })();

 (function(){   
var options = $("#DropDownList3").html();
$('#DropDownList3 :not([value^="Dip"])').remove();
$('input:radio').change(function(e) {
    var text = $(this).val();
    $("#DropDownList3").html(options);
    $('#DropDownList3 :not([value^="' + text.substr(0, 3) + '"])').remove();});
    })();

 (function(){   
var options = $("#DropDownList4").html();
$('#DropDownList4 :not([value^="Dr"])').remove();
$('input:radio').change(function(e) {
    var text = $(this).val();
    $("#DropDownList4").html(options);
    $('#DropDownList4 :not([value^="' + text.substr(0, 3) + '"])').remove();});
    })();
</script>
</body>
</html>

【问题讨论】:

  • 我的猜测是因为您多次声明和定义options,但期望的行为是什么?
  • @AndroidNoobie 我想在一个 HTML 页面中创建一个食物菜单,但它们相互冲突
  • 没有理由拥有 3 个单独的 script 元素。将所有代码合并到一个单独的代码中,并将其放在关闭 body 元素之前。现在,您正在导入 JQuery 两次。 $.noConflict() 在这里不相关。
  • @ScottMarcus 好的,我会试试的,谢谢
  • @ScottMarcus 你能编辑这段代码吗jsfiddle.net/j38tazq7> 没用

标签: javascript jquery html


【解决方案1】:

问题是您有 3 个函数在很大程度上做同样的事情,并且它们都共享相同的变量。不要让 3 个函数分别作用于一个元素,而是创建一个函数作用于所有 3 个元素。

请注意,这里不需要 ids,只需要使用匹配的 option 元素来组织单选按钮集的类。

查看内联的 cmets:

<!DOCTYPE html>
<html>
<head>
  <title>Order Selection</title>
  <style>
    /* Do all your styling in CSS not inline with the HTML */
    select { width:187px; display:block; margin:10px; }
    .hidden { display:none; }
    fieldset { margin-top:1em; margin-bottom:1em; }
    legend { font-weight:bold; }
  </style>
</head>
<body>
  <h1>Availabe Restaurants:</h1>
  
  <fieldset>
    <legend>Burgers:</legend>

    <label><input type="radio" name="burgers" value="Garage"> Burger Garage</label>
    <label><input type="radio" name="burgers" value="Burger"> Hardee's</label>
    <label><input type="radio" name="burgers" value="Factory"> Burger Factory &amp; More</label>

    <select name="burgers">
      <option value="">--- Select Burger ---</option>    
      <option class="Garage" value="Garage_Style_1">Original Burger</option>
      <option class="Garage" value="Garage_Style_2">Twin Turbo Chicken</option>
      <option class="Garage" value="Garage_Style_3">Shuwa Burger</option>
      <option class="Burger" value="Burger_Style_1">Chicken Fille</option>
      <option class="Burger" value="Burger_Style_2">Grilled Chicken Fillet</option>
      <option class="Burger" value="Burger_Style_3">Jalapeno Chicken</option>
      <option class="Factory" value="Factory_Style_1">Turbo Chicken</option>
      <option class="Factory" value="Factory_Style_2">Twin Turbo Chicken</option>
      <option class="Factory" value="Factory_Style_3">Garage Burger</option>        
    </select>
  </fieldset>
  <fieldset>
    <legend>Beverages:</legend>

    <label><input type="radio" name="beverages" value="Dr" />Dr.Shake</label>
    <label><input type="radio" name="beverages" value="Juice"> Juice Lab</label>
    <label> <input type="radio" name="beverages" value="Aseer"> Aseer Time</label>

    <select name="beverages">
      <option value="">--- Select Beverage ---</option>       
      <option class="Dr" value="Dr_Style_1">Pressure Milkshake</option>
      <option class="Dr" value="Dr_Style_2">Thermometer Milkshake</option>
      <option class="Dr" value="Dr_Style_3">Brain Recovery Milkshake</option>
      <option class="Juice" value="Juice_Style_1">G Lab</option>
      <option class="Juice" value="Juice_Style_2">Summer Vimto</option>
      <option class="Juice" value="Juice_Style_3">Summer Bubble Gum</option>
      <option class="Aseer" value="Aseer_Style_1">Hormone Happiness</option>
      <option class="Aseer" value="Aseer_Style_2">The King</option>
      <option class="Aseer" value="Aseer_Style_3">Berry Smothey</option>
    </select>
  </fieldset>
    
  <fieldset>
    <legend>Desserts:</legend>

    <label><input type="radio" name="desserts" value="Dip"> Dip N Dip</label>
    <label><input type="radio" name="desserts" value="Camel"> Camel Cookies</label>
    <label> <input type="radio" name="desserts" value="Ravenna"> Ravenna Kunafa</label>

    <select name="desserts">
      <option value="">--- Select Dessert ---</option>       
      <option class="Dip" value="Dip_Style_1">Brownies Crepe</option>
      <option class="Dip" value="Dip_Style_2">Fettuccine Crepe</option>
      <option class="Dip" value="Dip_Style_3">Cream Puff Pyramid</option>
      <option class="Camel" value="Camel_Style_1">Brownie Fondant</option>
      <option class="Camel" value="Camel_Style_2">Lotus Pancake</option>
      <option class="Camel" value="Camel_Style_3">Camel Lava</option>
      <option class="Ravenna" value="Ravenna_Style_1">Konafa With Chocolate</option>
      <option class="Ravenna" value="Ravenna_Style_2">Konafa Mabrooma With Cheese</option>
      <option class="Ravenna" value="Ravenna_Style_3">Konafa Mabrooma With Cream</option>
    </select>
  </fieldset>


  <script src="https://code.jquery.com/jquery-latest.min.js"></script>
  <script>

    // Hide the dropdown lists until a radio button selection is made
    $("select").hide();

    // Set up a change event handler for each of the radio buttons
    $('input:radio').on("change", updateChoices);

    function updateChoices(e) {
      // Show the appropriate list based on the name of the radio button that was changed
      $('select[name="' + this.name  + '"]').show();
      
      // Reset any previously selected option in the list back to the default
      $('select[name="' + this.name  + '"]').val($('select[name="' + this.name  + '"] option:first').val());
  
      // Update the <option> elements in the corresponding <select>
      $('select[name="' + this.name  + '"] option').each(function(index,element){
      
        // If the option has the same class as the radio button that was changed...
        if($(element).hasClass(e.target.value)){
          $(element).show();  // Show the option
        } else {
          $(element).hide();  // Hide the option
        }
      });  
    }

  </script>
</body>
</html>

【讨论】:

    【解决方案2】:

    这是一个常见的全局变量冲突问题。您可以(必须)将它们全部包装到自执行函数中,这会将所有声明的变量保留在自己的内部。

    (冲突):

    var test = $('#btn-1').text();
    $('#btn-1').on('click', function(){ console.log( test ); });
    
    var test = $('#btn-2').text();
    $('#btn-2').on('click', function(){ console.log( test ); });
    
    var test = $('#btn-3').text();
    $('#btn-3').on('click', function(){ console.log( test ); });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    <button id="btn-1">111</button>
    <button id="btn-2">222</button>
    <button id="btn-3">333</button>

    (无冲突):

    (function(){
      var test = $('#btn-1').text();
      $('#btn-1').on('click', function(){ console.log( test ); });
    })();
    
    (function(){
      var test = $('#btn-2').text();
      $('#btn-2').on('click', function(){ console.log( test ); });
    })();
    
    (function(){
      var test = $('#btn-3').text();
      $('#btn-3').on('click', function(){ console.log( test ); });
    })();
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    <button id="btn-1">111</button>
    <button id="btn-2">222</button>
    <button id="btn-3">333</button>

    但在您的情况下,至少循环运行所有内容会更好(或为所有元素添加一个通用类并使用$('.class').each(function(){/*...*/})循环):

    for( var i = 2; i < 5; i++ ){
      doStuff( i );
    }
    
    function doStuff( index ){
      var options = $("#DropDownList" + index).html();
      $('#DropDownList' + index + ' :not([value^="Dr"])').remove();
      $('input:radio').change(function(e) {
        var text = $(this).val();
        $("#DropDownList" + index).html(options);
        $('#DropDownList' + index + ' :not([value^="' + text.substr(0, 3) + '"])').remove();
      });
    }
    

    这里也使用了函数,将变量“保留”在里面。

    【讨论】:

    • 非常感谢您的解释
    • 更新它可以工作,但一次只有一个:(jsfiddle.net/j38tazq7/2
    • 当您发现自己在多个地方使用了大致相同的代码时,您应该停下来思考一下如何只编写一次代码。您这样做的方法是找出重复代码之间的不同之处并将其从代码中提取出来(可能是传入的参数,也可能是使用的变量)。在上面的按钮示例中,您只需要这行 JavaScript:$('button').on('click', function(){ console.log(this.id); });。没有重复的代码,没有 IIFE。
    猜你喜欢
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多