【问题标题】:Make a global variable from onchange event从 onchange 事件中创建一个全局变量
【发布时间】:2014-03-12 02:44:11
【问题描述】:

如何从 onchange 事件中创建一个全局变量,以便我的 js 页面中的每个函数都可以使用该变量中的值?任何人都可以提供一个工作示例代码。

onchange="showTable()" 来自 ma​​in.php 的事件:

<?php
    $linkID = @ mysql_connect("localhost", "root", "Newpass123#") or die("Could not connect to MySQL server");
    @ mysql_select_db("seatmapping") or die("Could not select database");
    $dbname = "seatmapping";
    $sql = "SHOW TABLES FROM $dbname where tables_in_seatmapping!='userauth'";
    $result = mysql_query($sql);
    $tableNames= array();

    while ($row = mysql_fetch_row($result)) {
        $tableNames[] = $row[0];
    }

    echo '<select name="tables" id="tables" onchange="showTable(this.value)">'; 
    echo '<option class="placeholder" selected disabled>Layouts</option>';
    foreach ($tableNames as $name){
        echo '<option value="'. $name.'">'.$name.'</option>';
    }
    echo '</select>';
?>

onclick="showAvailable()" 来自 ma​​in.php 的事件:

<div class="sliderContainer">

    <div id="slider">
        <a class="ui-slider-handle" href="#">Start</a>
        <a class="ui-slider-handle" href="#">End</a>
    </div>

    <p>
    <a id="timer"><span class="slider-time">10:00 AM</span> to <span class="slider-time2">12:00 PM</span></a>

    <a href="#" id="checkAvailable" onclick="showAvailable()">Avail</a>
    <a href="#" id="resetAvailable" onclick="resetAvailable()">Reset</a></p>

</div>

我在 .js 页面中的函数:

var tableName;

function showTable(tableName){
  if (window.XMLHttpRequest){
    xmlhttp=new XMLHttpRequest();
  }
  else{
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  xmlhttp.onreadystatechange=function(){
    if (xmlhttp.readyState==4 && xmlhttp.status==200){
      document.getElementById("showLayout").innerHTML=xmlhttp.responseText;
      tableName = xmlhttp.responseText;
    }
  }
  xmlhttp.open("GET","seatmap.php?tableName="+tableName,true);
  xmlhttp.send();
}

function showAvailable(){
  var startShift = $('#slider').slider("values", 0);
  var endShift = $('#slider').slider("values", 1);

  if (window.XMLHttpRequest){
    xmlhttp=new XMLHttpRequest();
  }
  else{
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  xmlhttp.onreadystatechange=function(){
    if (xmlhttp.readyState==4 && xmlhttp.status==200){
      document.getElementById("showLayout").innerHTML=xmlhttp.responseText;
    }
  }
  xmlhttp.open("GET","seatmap.php?startShift="+startShift+"&endShift="+endShift+"&tableName="+tableName,true);
  xmlhttp.send();
}

这是 seatmap.php 的 sn-p,它太长了,但我将 $tableName 用于 showAvailable 和 showTable。我也在查询中使用它:

<?php

$startSlider=intval($_GET['startShift']);
$endSlider=intval($_GET['endShift']);
$tableName = strval($_GET['tableName']);

$linkID = @ mysql_connect("localhost", "root", "Newpass123#") or die("Could not connect to MySQL server");
@ mysql_select_db("seatmapping") or die("Could not select database");

/* Create and execute query. */
$query = "SELECT rowId,columnId,status,name,seatid,startShift,endShift from $tableName group by seatid order by rowId, columnId desc";
$result = mysql_query($query);
$prevRowId = null;
$seatColor = null;
$tableRow = false;

//echo $result;
echo $tableName;

我想要的是如何使 onchange=showTable(this.value) 中的值成为全局变量,以便我可以在函数 showAvailable 中使用它并将其传递给 php 页面。任何形式的帮助表示赞赏。提前谢谢你。

【问题讨论】:

    标签: javascript php


    【解决方案1】:

    在函数showTable()之前创建变量,例如var global_var;,然后在showTable()中赋值,然后你就可以在showAvailable()中使用了,但是记得检查它是否不为空。

    编辑: 你的 .js 现在应该是这样的(你覆盖了一些变量):

    var tableName;
    
    function showTable(localTable){
      if (window.XMLHttpRequest){
        xmlhttp=new XMLHttpRequest();
      }
      else{
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
      xmlhttp.onreadystatechange=function(){
        if (xmlhttp.readyState==4 && xmlhttp.status==200){
          document.getElementById("showLayout").innerHTML=xmlhttp.responseText;
          tableName = localTable;
        }
      }
      xmlhttp.open("GET","seatmap.php?tableName="+localTable,true);
      xmlhttp.send();
    }
    
    function showAvailable(){
      var startShift = $('#slider').slider("values", 0);
      var endShift = $('#slider').slider("values", 1);
    
      if (window.XMLHttpRequest){
        xmlhttp=new XMLHttpRequest();
      }
      else{
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
      xmlhttp.onreadystatechange=function(){
        if (xmlhttp.readyState==4 && xmlhttp.status==200){
          document.getElementById("showLayout").innerHTML=xmlhttp.responseText;
        }
      }
      xmlhttp.open("GET","seatmap.php?startShift="+startShift+"&endShift="+endShift+"&tableName="+tableName,true);
      xmlhttp.send();
    }
    

    【讨论】:

    • 感谢您的帮助。但我有一个问题?在 showTable() 中声明全局变量后,我应该如何从 showTable() 中的 onchange 事件中分配值?我希望我的问题很清楚。谢谢。
    • 您要分配什么值? xmlhttp.responseText 来自 AJAX?
    • 是的。对不起,我只是一个初学者。希望你仍然帮助我。谢谢
    • 您可以在document.getElementById("showLayout").innerHTML=xmlhttp.responseText; 行后添加global_var = xmlhttp.responseText; 行,仅此而已。
    • 我试过这个并在 php.ini 中回显了变量。当我使用 onchange="showTable()" 从
    【解决方案2】:

    您可以通过将变量添加到窗口对象来简单地创建一个全局变量,并且它对所有函数都是可见的。

    window.globalValue = "some value";
    

    但这不是最好的方法,我们应该尽量减少全局变量。最佳做法是 - 在全局中创建命名空间 将变量添加到该全局命名空间。

    通过这种方式,您可以保持全局清洁并且代码更易于维护。

    window.Namespace = {};
    Namespace.varOnChange = "some value";
    

    我想你正在寻找的是 -

    var myNamespace = {};
    
    function showTable(tableName){
     if (window.XMLHttpRequest){
        xmlhttp=new XMLHttpRequest();
     }
     else{
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
     }
     xmlhttp.onreadystatechange=function(){
        if (xmlhttp.readyState==4 && xmlhttp.status==200){
            document.getElementById("showLayout").innerHTML=xmlhttp.responseText;
            myNamespace.name = xmlhttp.responseText;
        }
     }
     xmlhttp.open("GET","seatmap.php?tableName="+tableName,true);
     xmlhttp.send();
    }
    

    【讨论】:

    • 但是如果全局变量是动态的呢?我该如何申报?因为假设全局变量的值来自我的 php 页面中的 onchange 事件。
    • “我们”? @rez——使用方括号表示法:var obj={}; obj[expr] = whatever; 表达式可用于属性名称。
    • 如果您期望来自服务器端语言的响应,在您的情况下是 php,那么您可以在 ajax 请求的回调函数中获取它。在回调函数中,看起来像这样 - function callbackResponse(data){ myNamespace.serverResponse = data;}。您可以通过 var myNamespace = {}; 或使用我在上述答案中使用的窗口对象在 js 文件顶部声明命名空间。希望这会有所帮助。
    • 我试过这个并在 php.ini 中回显它。当我在 showTable() 中使用它时,它很好。但是当我在 showAvailable() 中使用它时,它只会回显 [object Object]。任何想法为什么以及如何?
    猜你喜欢
    • 2023-02-16
    • 2014-10-31
    • 1970-01-01
    • 2021-12-11
    • 2016-10-25
    • 2020-09-24
    相关资源
    最近更新 更多