【问题标题】:Run Jquery function on page load once在页面加载时运行 Jquery 函数一次
【发布时间】:2018-12-23 05:32:40
【问题描述】:

我有以下 Jquery 函数:

$( document ).ready(function() {
        $(function() {
        $('select[name="CPUmenu"]').change(function(e) {
          let socket = $(this).val();
          $('tbody tr[data-socket]').show();
          if (socket.length) {
            $('tbody tr[data-socket!="' + socket + '"]').hide();
          }
        });
    });
});

其他代码:

CPU 菜单:

$sql = "SELECT name, socket FROM cpu";
$result = $connection->query($sql);

if ($result->num_rows > 0) {
    echo "<select name='CPUmenu'>";
    echo "<option value=''>CPU</option>";
    // output data of each row
    while($row = $result->fetch_assoc()) {
        if ($row["name"] == $namehref) {
        echo "<option value='". $row["socket"] . "' selected>".$row["name"]."</option>";    
        } else {
        echo "<option value='". $row["socket"] . "'>".$row["name"]."</option>";
        }
    }
    echo "</select>";
} else {
    echo "0 results";
}

我的表:

$sql = "SELECT name, price, id, socket, ramslots, maxram, chipset FROM motherboard";
$result = $connection->query($sql);

if ($result->num_rows > 0) {
    echo "<table id='myTable'><thead><tr><th>Motherboard</th><th>Price</th><th>Socket</th><th>Chipset</th><th>Ram Slots</th><th>Max Ram</th></tr></thead>";
    // output data of each row
    while($row = $result->fetch_assoc()) {
        echo "<tbody><tr data-socket='". $row['socket'] . "'><td><a href='https://au.pcpartpicker.com/product/" . $row["id"] . "' target='_blank'>" . $row["name"] . "</a></td><td>" . $row["price"] . "</td><td>" . $row["socket"] . "</td><td>" . $row["chipset"] . "</td><td>" . $row["ramslots"] . "</td><td>" . $row["maxram"] . "</td></tr></tbody>";
    }
    echo "</table>";
} else {
    echo "0 results";
}

我刚试过这个,但根本不起作用

但是它只在我在“CPUmenu”中选择一个新选项时运行,我希望它在页面打开和加载时也运行一次。

谢谢

【问题讨论】:

  • 在函数中添加代码,从 let socket 到 rest.. 在页面加载和更改时调用该函数
  • 所以你在while循环中打印&lt;tbody&gt;?!!

标签: javascript jquery html


【解决方案1】:

您可以在页面加载时触发更改:

$('select[name="CPUmenu"]').tigger('change');

请注意: $( document ).ready(function() {...$(function() {... 基本相同。您可以参考document-readyfunction-vs-function了解更多信息。

演示:

$(function() {
   $('select[name="CPUmenu"]').change(function(e) {
      let socket = $(this).val();
      $('tbody tr[data-socket]').show();
      if (socket.length) {
        //$('tbody tr[data-socket!="' + socket + '"]').hide();
      }
      alert('change trigger');
   });
   $('select[name="CPUmenu"]').trigger('change'); // trigger here
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select name="CPUmenu">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>

【讨论】:

  • 我刚刚尝试过,但它似乎不适用于页面加载
  • @Uskompuf,请用相关的 HTML 更新问题,以便我们测试代码。
  • 会的,给我一分钟
  • 我已经添加了 CPUmenu 和 myTable 的代码,CPUmenu 的选择标签是通过 href 和 get 自动选择的,但在页面加载时不执行排序功能,因此我正在尝试这样做。跨度>
【解决方案2】:

首先,$(document).ready( ... ) 和嵌套的$(function() { ... })redundant

您可以将change 函数移出处理程序并立即调用它:

$(document).ready(function() {
  const menu = $('select[name="CPUmenu"]');
  const menuChange = (function(e) {
    let socket = $(this).val();
    $('tbody tr[data-socket]').show();
    if (socket.length) {
      $(`tbody tr[data-socket!="${socket}"]`).hide();
  }).bind(menu.get());
  menuChange();
  $('select[name="CPUmenu"]').change(menuChange);
});

【讨论】:

    【解决方案3】:

    我建议拆分您想要用完的功能,然后手动触发它。例如:

    $( document ).ready(function() {
    
      // This is the function, ready to be called
      function updateSocket() {
        let socket = $(this).val();
        $('tbody tr[data-socket]').show();
        if (socket.length) {
          $('tbody tr[data-socket!="' + socket + '"]').hide();
        }
      }
    
      // Save the element for usage later
      let dropdownElement = $('select[name="CPUmenu"]')
    
      // Set up the event listener for the dropdown
      dropdownElement.change(updateSocket);
    
      // Also call it manually.
      updateSocket.bind(dropdownElement)();
    });
    

    编辑:我为此解决方案添加了绑定。否则,$(this) 的上下文将不正确。

    【讨论】:

    • 你确定函数上的$(this) 会捕捉到正确的元素吗??
    • @Mohamed-Yousef 你是对的,它不会。谢谢,我已经更新了示例。
    • 据您所知.. 函数内部的$(this) 将引用window 或其他内容,但不是您想要的元素.. 所以要以正确的方式使用它.. 您需要传递一个函数function updateSocket(Element) 的参数,然后在函数内部使用Element 而不是this,如let socket = $(Element).val();,当您将函数用于元素时,您可以使用updateSocket(this) ..祝你有美好的一天:-)
    • 对不起..我测试了它,它无需添加参数(元素)就可以工作..对此感到抱歉..实际上我不知道在哪种情况下我们需要使用参数..无论如何保持在您的脑海中,也许有一天知道会很有用..再次抱歉:-)
    • 是的,这就是我添加绑定的目的。它不会像我最初写的那样工作。 this 绑定可能会有点混乱。
    猜你喜欢
    • 1970-01-01
    • 2012-09-10
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多